mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-10-19 11:19:36 +00:00
Bring the READMEs and the docs pages (en and ja) in line with the current header: - Fix the client sample that does not compile, the Transfer-Encoding statement for default headers, the verifier callback comment, the thread pool spawn rule, the sanitize_filename description, and the inverted Accept-Encoding sentence. - Describe recent behaviour: TLS errors behind Read/Write failures, Host validation, Connection: close for a body without length, content_reader rules, refused CONNECT, WebSocketClient proxies, CPPHTTPLIB_INTERIM_RESPONSE_MAX_COUNT, the SSE event size limit, and the payload limit of the Stream API. - Complete the API references of WebSocket, WebSocketClient and the stream:: helpers, and the SSE reconnect rules. - Fix cookbook pages: keychain loading on every backend, received Close status, a multipart sample that trusted the client's file name, an echo sample that sent binary as text, SNI, pre-request handler scope, stop() with WebSocket handlers, and the thread pool notes. - Restore the mutex in the LLM app's Chapter 5 code.
56 lines
2.0 KiB
Markdown
56 lines
2.0 KiB
Markdown
---
|
|
title: "S03. Use Path Parameters"
|
|
order: 22
|
|
status: "draft"
|
|
---
|
|
|
|
For dynamic URLs like `/users/:id` — the staple of REST APIs — just put `:name` in the path pattern. The matched values end up in `req.path_params`.
|
|
|
|
## Basic usage
|
|
|
|
```cpp
|
|
svr.Get("/users/:id", [](const httplib::Request &req, httplib::Response &res) {
|
|
auto id = req.path_params.at("id");
|
|
res.set_content("user id: " + id, "text/plain");
|
|
});
|
|
```
|
|
|
|
A request to `/users/42` fills `req.path_params["id"]` with `"42"`. `path_params` is a `std::unordered_map<std::string, std::string>`, so use `at()` to read it.
|
|
|
|
## Multiple parameters
|
|
|
|
You can have as many as you need.
|
|
|
|
```cpp
|
|
svr.Get("/orgs/:org/repos/:repo", [](const httplib::Request &req, httplib::Response &res) {
|
|
auto org = req.path_params.at("org");
|
|
auto repo = req.path_params.at("repo");
|
|
res.set_content(org + "/" + repo, "text/plain");
|
|
});
|
|
```
|
|
|
|
This matches paths like `/orgs/anthropic/repos/cpp-httplib`.
|
|
|
|
## Regex patterns
|
|
|
|
For more flexible matching, use a `std::regex`-based pattern.
|
|
|
|
```cpp
|
|
svr.Get(R"(/users/(\d+))", [](const httplib::Request &req, httplib::Response &res) {
|
|
auto id = req.matches[1];
|
|
res.set_content("user id: " + std::string(id), "text/plain");
|
|
});
|
|
```
|
|
|
|
Parentheses in the pattern become captures in `req.matches`. `req.matches[0]` is the full match; `req.matches[1]` onward are the captures.
|
|
|
|
A regex route isn't applied to a path longer than `CPPHTTPLIB_REGEX_ROUTE_PATH_MAX_LENGTH` (256 by default); such a path is treated as no match. This keeps `std::regex` from overflowing the stack on long input. If your routes need longer paths, define the macro with a larger value.
|
|
|
|
## Which to use
|
|
|
|
- For plain IDs or slugs, `:name` is enough — readable, and the shape is obvious
|
|
- Use regex when you want to constrain the URL to, say, numbers only or a UUID format
|
|
- Mixing both can get confusing — stick with one style per project
|
|
|
|
> **Note:** Path parameters come in as strings. If you need an integer, convert with `std::stoi()` and don't forget to handle conversion errors.
|