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.
52 lines
2.1 KiB
Markdown
52 lines
2.1 KiB
Markdown
---
|
|
title: "S13. カスタムエラーページを返す"
|
|
order: 32
|
|
status: "draft"
|
|
---
|
|
|
|
404や500のような**ハンドラが返したエラーレスポンス**を加工したいときは、`set_error_handler()`を使います。エラーレスポンスのボディはデフォルトでは空ですが、エラーハンドラで独自のHTMLやJSONを入れられます。
|
|
|
|
## 基本の使い方
|
|
|
|
```cpp
|
|
svr.set_error_handler([](const httplib::Request &req, httplib::Response &res) {
|
|
auto body = "<h1>Error " + std::to_string(res.status) + "</h1>";
|
|
res.set_content(body, "text/html");
|
|
});
|
|
```
|
|
|
|
エラーハンドラは、`res.status`が4xxまたは5xxでレスポンスが返る直前に呼ばれます。`res.set_content()`で差し替えれば、すべてのエラーレスポンスで同じテンプレートが使えます。
|
|
|
|
## ステータスコード別の処理
|
|
|
|
```cpp
|
|
svr.set_error_handler([](const httplib::Request &req, httplib::Response &res) {
|
|
if (res.status == 404) {
|
|
res.set_content("<h1>Not Found</h1><p>" + req.path + "</p>", "text/html");
|
|
} else if (res.status >= 500) {
|
|
res.set_content("<h1>Server Error</h1>", "text/html");
|
|
}
|
|
});
|
|
```
|
|
|
|
`res.status`を見て分岐すれば、404には専用のメッセージを、5xxにはサポート窓口のリンクを、といった使い分けができます。
|
|
|
|
## JSON APIのエラーレスポンス
|
|
|
|
APIサーバーなら、エラーもJSONで返したいことが多いはずです。
|
|
|
|
```cpp
|
|
svr.set_error_handler([](const httplib::Request &req, httplib::Response &res) {
|
|
nlohmann::json j = {
|
|
{"error", true},
|
|
{"status", res.status},
|
|
{"path", req.path},
|
|
};
|
|
res.set_content(j.dump(), "application/json");
|
|
});
|
|
```
|
|
|
|
これで全エラーが統一されたJSONで返ります。
|
|
|
|
> **Note:** `set_error_handler()`は、ルートハンドラが例外を投げた場合の500エラーにも呼ばれます。例外そのものの情報を取り出したい場合は`set_exception_handler()`を組み合わせましょう。[S14. 例外をキャッチする](../s14-exception-handler)を参照してください。
|