mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-04-12 11:48:30 +00:00
Remove docs-gen
This commit is contained in:
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button class="sidebar-toggle" aria-label="Menu">☰</button>
|
||||
</div>
|
||||
@@ -89,7 +91,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -88,7 +90,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button class="sidebar-toggle" aria-label="Menu">☰</button>
|
||||
</div>
|
||||
@@ -105,8 +107,8 @@
|
||||
<p>cpp-httplibを始めるのに必要なのは、<code>httplib.h</code>とC++コンパイラーだけです。ファイルをダウンロードして、Hello Worldサーバーを動かすところまでやってみましょう。</p>
|
||||
<h2>httplib.h の入手</h2>
|
||||
<p>GitHubから直接ダウンロードできます。常に最新版を使ってください。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#f2777a;"> -LO</span><span style="color:#d3d0c8;"> https://github.com/yhirose/cpp-httplib/raw/refs/tags/latest/httplib.h
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#bf616a;"> -LO</span><span style="color:#c0c5ce;"> https://github.com/yhirose/cpp-httplib/raw/refs/tags/latest/httplib.h
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl -LO https://github.com/yhirose/cpp-httplib/raw/refs/tags/latest/httplib.h
|
||||
@@ -121,18 +123,18 @@
|
||||
</tbody></table>
|
||||
<h2>Hello World サーバー</h2>
|
||||
<p>次のコードを <code>server.cpp</code> として保存しましょう。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">httplib.h</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">int </span><span style="color:#6699cc;">main</span><span style="color:#d3d0c8;">() {
|
||||
</span><span style="color:#d3d0c8;"> httplib::Server svr;
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const</span><span style="color:#d3d0c8;"> httplib::Request&, httplib::Response& res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Hello, World!</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">listen</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">0.0.0.0</span><span style="color:#d3d0c8;">", </span><span style="color:#f99157;">8080</span><span style="color:#d3d0c8;">);
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">httplib.h</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">int </span><span style="color:#8fa1b3;">main</span><span style="color:#c0c5ce;">() {
|
||||
</span><span style="color:#c0c5ce;"> httplib::Server svr;
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const</span><span style="color:#c0c5ce;"> httplib::Request&, httplib::Response& res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Hello, World!</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">listen</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">0.0.0.0</span><span style="color:#c0c5ce;">", </span><span style="color:#d08770;">8080</span><span style="color:#c0c5ce;">);
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">#include </span><span style="color:#183691;">"httplib.h"
|
||||
@@ -151,17 +153,17 @@
|
||||
<p>たった数行で、HTTPリクエストに応答するサーバーが書けます。</p>
|
||||
<h2>コンパイルと実行</h2>
|
||||
<p>このチュートリアルのサンプルコードは、コードを簡潔に書けるC++17で書いています。cpp-httplib自体はC++11でもコンパイルできます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#747369;"># macOS
|
||||
</span><span style="color:#6699cc;">clang++</span><span style="color:#f2777a;"> -std</span><span style="color:#d3d0c8;">=c++17</span><span style="color:#f2777a;"> -o</span><span style="color:#d3d0c8;"> server server.cpp
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#747369;"># Linux
|
||||
</span><span style="color:#747369;"># `-pthread`: cpp-httplibは内部でスレッドを使用
|
||||
</span><span style="color:#6699cc;">clang++</span><span style="color:#f2777a;"> -std</span><span style="color:#d3d0c8;">=c++17</span><span style="color:#f2777a;"> -pthread -o</span><span style="color:#d3d0c8;"> server server.cpp
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#747369;"># Windows (Developer Command Prompt)
|
||||
</span><span style="color:#747369;"># `/EHsc`: C++例外処理を有効化
|
||||
</span><span style="color:#6699cc;">cl</span><span style="color:#d3d0c8;"> /EHsc /std:c++17 server.cpp
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#65737e;"># macOS
|
||||
</span><span style="color:#8fa1b3;">clang++</span><span style="color:#bf616a;"> -std</span><span style="color:#c0c5ce;">=c++17</span><span style="color:#bf616a;"> -o</span><span style="color:#c0c5ce;"> server server.cpp
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#65737e;"># Linux
|
||||
</span><span style="color:#65737e;"># `-pthread`: cpp-httplibは内部でスレッドを使用
|
||||
</span><span style="color:#8fa1b3;">clang++</span><span style="color:#bf616a;"> -std</span><span style="color:#c0c5ce;">=c++17</span><span style="color:#bf616a;"> -pthread -o</span><span style="color:#c0c5ce;"> server server.cpp
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#65737e;"># Windows (Developer Command Prompt)
|
||||
</span><span style="color:#65737e;"># `/EHsc`: C++例外処理を有効化
|
||||
</span><span style="color:#8fa1b3;">cl</span><span style="color:#c0c5ce;"> /EHsc /std:c++17 server.cpp
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-style:italic;color:#969896;"># macOS
|
||||
@@ -177,12 +179,12 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>コンパイルできたら実行します。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#747369;"># macOS / Linux
|
||||
</span><span style="color:#6699cc;">./server
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#747369;"># Windows
|
||||
</span><span style="color:#6699cc;">server.exe
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#65737e;"># macOS / Linux
|
||||
</span><span style="color:#8fa1b3;">./server
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#65737e;"># Windows
|
||||
</span><span style="color:#8fa1b3;">server.exe
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-style:italic;color:#969896;"># macOS / Linux
|
||||
@@ -194,9 +196,9 @@
|
||||
</div></div>
|
||||
<p>ブラウザで <code>http://localhost:8080</code> を開いてください。"Hello, World!" と表示されれば成功です。</p>
|
||||
<p><code>curl</code> でも確認できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#d3d0c8;"> http://localhost:8080/
|
||||
</span><span style="color:#747369;"># Hello, World!
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#c0c5ce;"> http://localhost:8080/
|
||||
</span><span style="color:#65737e;"># Hello, World!
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl http://localhost:8080/
|
||||
@@ -214,7 +216,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button class="sidebar-toggle" aria-label="Menu">☰</button>
|
||||
</div>
|
||||
@@ -105,53 +107,53 @@
|
||||
<p>cpp-httplibはサーバーだけでなく、HTTPクライアント機能も備えています。<code>httplib::Client</code> を使って、GETやPOSTリクエストを送ってみましょう。</p>
|
||||
<h2>テスト用サーバーの準備</h2>
|
||||
<p>クライアントの動作を確認するために、リクエストを受け付けるサーバーを用意します。次のコードを保存し、前章と同じ手順でコンパイル・実行してください。サーバーの詳しい解説は次章で行います。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">httplib.h</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;"><</span><span style="color:#99cc99;">iostream</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">int </span><span style="color:#6699cc;">main</span><span style="color:#d3d0c8;">() {
|
||||
</span><span style="color:#d3d0c8;"> httplib::Server svr;
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/hi</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Hello!</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/search</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> q = req.</span><span style="color:#6699cc;">get_param_value</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">q</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Query: </span><span style="color:#d3d0c8;">" + q, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/post</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">(req.</span><span style="color:#f2777a;">body</span><span style="color:#d3d0c8;">, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/submit</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> std::string result;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">for </span><span style="color:#d3d0c8;">(</span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&[key, val] : req.</span><span style="color:#f2777a;">params</span><span style="color:#d3d0c8;">) {
|
||||
</span><span style="color:#d3d0c8;"> result += key + "</span><span style="color:#99cc99;"> = </span><span style="color:#d3d0c8;">" + val + "</span><span style="color:#66cccc;">\n</span><span style="color:#d3d0c8;">";
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">(result, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/upload</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> f = req.</span><span style="color:#f2777a;">form</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">get_file</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">file</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> content = f.</span><span style="color:#f2777a;">filename </span><span style="color:#d3d0c8;">+ "</span><span style="color:#99cc99;"> (</span><span style="color:#d3d0c8;">" + </span><span style="color:#6699cc;">std::to_string</span><span style="color:#d3d0c8;">(f.</span><span style="color:#f2777a;">content</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">size</span><span style="color:#d3d0c8;">()) + "</span><span style="color:#99cc99;"> bytes)</span><span style="color:#d3d0c8;">";
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">(content, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/users/:id</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> id = req.</span><span style="color:#f2777a;">path_params</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">at</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">id</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">User ID: </span><span style="color:#d3d0c8;">" + id, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">(</span><span style="color:#cc99cc;">R</span><span style="color:#d3d0c8;">"(</span><span style="color:#99cc99;">/files/(\d+)</span><span style="color:#d3d0c8;">)", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> id = req.</span><span style="color:#f2777a;">matches</span><span style="color:#d3d0c8;">[</span><span style="color:#f99157;">1</span><span style="color:#d3d0c8;">];
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">File ID: </span><span style="color:#d3d0c8;">" + </span><span style="color:#6699cc;">std::string</span><span style="color:#d3d0c8;">(id), "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> std::cout << "</span><span style="color:#99cc99;">Listening on port 8080...</span><span style="color:#d3d0c8;">" << std::endl;
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">listen</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">0.0.0.0</span><span style="color:#d3d0c8;">", </span><span style="color:#f99157;">8080</span><span style="color:#d3d0c8;">);
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">httplib.h</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;"><</span><span style="color:#a3be8c;">iostream</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">int </span><span style="color:#8fa1b3;">main</span><span style="color:#c0c5ce;">() {
|
||||
</span><span style="color:#c0c5ce;"> httplib::Server svr;
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/hi</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Hello!</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/search</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> q = req.</span><span style="color:#8fa1b3;">get_param_value</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">q</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Query: </span><span style="color:#c0c5ce;">" + q, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/post</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">(req.</span><span style="color:#bf616a;">body</span><span style="color:#c0c5ce;">, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/submit</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> std::string result;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">for </span><span style="color:#c0c5ce;">(</span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&[key, val] : req.</span><span style="color:#bf616a;">params</span><span style="color:#c0c5ce;">) {
|
||||
</span><span style="color:#c0c5ce;"> result += key + "</span><span style="color:#a3be8c;"> = </span><span style="color:#c0c5ce;">" + val + "</span><span style="color:#96b5b4;">\n</span><span style="color:#c0c5ce;">";
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">(result, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/upload</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> f = req.</span><span style="color:#bf616a;">form</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">get_file</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">file</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> content = f.</span><span style="color:#bf616a;">filename </span><span style="color:#c0c5ce;">+ "</span><span style="color:#a3be8c;"> (</span><span style="color:#c0c5ce;">" + </span><span style="color:#8fa1b3;">std::to_string</span><span style="color:#c0c5ce;">(f.</span><span style="color:#bf616a;">content</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">size</span><span style="color:#c0c5ce;">()) + "</span><span style="color:#a3be8c;"> bytes)</span><span style="color:#c0c5ce;">";
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">(content, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/users/:id</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> id = req.</span><span style="color:#bf616a;">path_params</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">at</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">id</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">User ID: </span><span style="color:#c0c5ce;">" + id, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">(</span><span style="color:#b48ead;">R</span><span style="color:#c0c5ce;">"(</span><span style="color:#a3be8c;">/files/(\d+)</span><span style="color:#c0c5ce;">)", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> id = req.</span><span style="color:#bf616a;">matches</span><span style="color:#c0c5ce;">[</span><span style="color:#d08770;">1</span><span style="color:#c0c5ce;">];
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">File ID: </span><span style="color:#c0c5ce;">" + </span><span style="color:#8fa1b3;">std::string</span><span style="color:#c0c5ce;">(id), "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> std::cout << "</span><span style="color:#a3be8c;">Listening on port 8080...</span><span style="color:#c0c5ce;">" << std::endl;
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">listen</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">0.0.0.0</span><span style="color:#c0c5ce;">", </span><span style="color:#d08770;">8080</span><span style="color:#c0c5ce;">);
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">#include </span><span style="color:#183691;">"httplib.h"
|
||||
@@ -204,19 +206,19 @@
|
||||
</div></div>
|
||||
<h2>GETリクエスト</h2>
|
||||
<p>サーバーが起動したら、別のターミナルを開いて試してみましょう。まず、最もシンプルなGETリクエストです。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">httplib.h</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;"><</span><span style="color:#99cc99;">iostream</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">int </span><span style="color:#6699cc;">main</span><span style="color:#d3d0c8;">() {
|
||||
</span><span style="color:#d3d0c8;"> httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">http://localhost:8080</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/hi</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// 200
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// Hello!
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">httplib.h</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;"><</span><span style="color:#a3be8c;">iostream</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">int </span><span style="color:#8fa1b3;">main</span><span style="color:#c0c5ce;">() {
|
||||
</span><span style="color:#c0c5ce;"> httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">http://localhost:8080</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/hi</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// 200
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// Hello!
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">#include </span><span style="color:#183691;">"httplib.h"
|
||||
@@ -235,9 +237,9 @@
|
||||
</div></div>
|
||||
<p><code>httplib::Client</code> のコンストラクターにサーバーのアドレスを渡し、<code>Get()</code> でリクエストを送ります。戻り値の <code>res</code> からステータスコードやボディを取得できます。</p>
|
||||
<p>対応する <code>curl</code> コマンドはこうなります。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#d3d0c8;"> http://localhost:8080/hi
|
||||
</span><span style="color:#747369;"># Hello!
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#c0c5ce;"> http://localhost:8080/hi
|
||||
</span><span style="color:#65737e;"># Hello!
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl http://localhost:8080/hi
|
||||
@@ -246,18 +248,18 @@
|
||||
</div></div>
|
||||
<h2>レスポンスの確認</h2>
|
||||
<p>レスポンスには、ステータスコードとボディ以外にもヘッダー情報が含まれています。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/hi</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// ステータスコード
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// 200
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// ボディ
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// Hello!
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// ヘッダー
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#6699cc;">get_header_value</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Content-Type</span><span style="color:#d3d0c8;">") << std::endl; </span><span style="color:#747369;">// text/plain
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/hi</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// ステータスコード
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// 200
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// ボディ
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// Hello!
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// ヘッダー
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#8fa1b3;">get_header_value</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Content-Type</span><span style="color:#c0c5ce;">") << std::endl; </span><span style="color:#65737e;">// text/plain
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> res </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> cli.Get(</span><span style="color:#183691;">"/hi"</span><span style="color:#323232;">);
|
||||
@@ -276,11 +278,11 @@
|
||||
<p><code>res->body</code> は <code>std::string</code> なので、JSON レスポンスをパースしたい場合は <a href="https://github.com/nlohmann/json">nlohmann/json</a> などの JSON ライブラリにそのまま渡せます。</p>
|
||||
<h2>クエリパラメーター</h2>
|
||||
<p>GETリクエストにクエリパラメーターを付けるには、URLに直接書くか、<code>httplib::Params</code> を使います。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/search</span><span style="color:#d3d0c8;">", httplib::Params{{"</span><span style="color:#99cc99;">q</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">cpp-httplib</span><span style="color:#d3d0c8;">"}});
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// Query: cpp-httplib
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/search</span><span style="color:#c0c5ce;">", httplib::Params{{"</span><span style="color:#a3be8c;">q</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">cpp-httplib</span><span style="color:#c0c5ce;">"}});
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// Query: cpp-httplib
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> res </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> cli.Get(</span><span style="color:#183691;">"/search"</span><span style="color:#323232;">, httplib::Params{{</span><span style="color:#183691;">"q"</span><span style="color:#323232;">, </span><span style="color:#183691;">"cpp-httplib"</span><span style="color:#323232;">}});
|
||||
@@ -290,9 +292,9 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p><code>httplib::Params</code> を使うと、特殊文字のURLエンコードを自動で行ってくれます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">http://localhost:8080/search?q=cpp-httplib</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#747369;"># Query: cpp-httplib
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">http://localhost:8080/search?q=cpp-httplib</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#65737e;"># Query: cpp-httplib
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl </span><span style="color:#183691;">"http://localhost:8080/search?q=cpp-httplib"
|
||||
@@ -301,11 +303,11 @@
|
||||
</div></div>
|
||||
<h2>パスパラメーター</h2>
|
||||
<p>URLのパスに値を直接埋め込む場合も、クライアント側は特別なAPIは不要です。パスをそのまま <code>Get()</code> に渡すだけです。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/users/42</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// User ID: 42
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/users/42</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// User ID: 42
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> res </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> cli.Get(</span><span style="color:#183691;">"/users/42"</span><span style="color:#323232;">);
|
||||
@@ -313,9 +315,9 @@
|
||||
</span><span style="color:#323232;"> std::cout </span><span style="font-weight:bold;color:#a71d5d;"><<</span><span style="color:#323232;"> res->body </span><span style="font-weight:bold;color:#a71d5d;"><<</span><span style="color:#323232;"> std::endl; </span><span style="font-style:italic;color:#969896;">// User ID: 42
|
||||
</span><span style="color:#323232;">}
|
||||
</span></pre>
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#d3d0c8;"> http://localhost:8080/users/42
|
||||
</span><span style="color:#747369;"># User ID: 42
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#c0c5ce;"> http://localhost:8080/users/42
|
||||
</span><span style="color:#65737e;"># User ID: 42
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl http://localhost:8080/users/42
|
||||
@@ -323,11 +325,11 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>テスト用サーバーには、正規表現でIDを数字のみに絞った <code>/files/(\d+)</code> もあります。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/files/42</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// File ID: 42
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/files/42</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// File ID: 42
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> res </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> cli.Get(</span><span style="color:#183691;">"/files/42"</span><span style="color:#323232;">);
|
||||
@@ -335,9 +337,9 @@
|
||||
</span><span style="color:#323232;"> std::cout </span><span style="font-weight:bold;color:#a71d5d;"><<</span><span style="color:#323232;"> res->body </span><span style="font-weight:bold;color:#a71d5d;"><<</span><span style="color:#323232;"> std::endl; </span><span style="font-style:italic;color:#969896;">// File ID: 42
|
||||
</span><span style="color:#323232;">}
|
||||
</span></pre>
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#d3d0c8;"> http://localhost:8080/files/42
|
||||
</span><span style="color:#747369;"># File ID: 42
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#c0c5ce;"> http://localhost:8080/files/42
|
||||
</span><span style="color:#65737e;"># File ID: 42
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl http://localhost:8080/files/42
|
||||
@@ -347,18 +349,18 @@
|
||||
<p><code>/files/abc</code> のように数字以外を渡すと404が返ります。仕組みは次章で解説します。</p>
|
||||
<h2>リクエストヘッダー</h2>
|
||||
<p>カスタムHTTPヘッダーを付けるには、<code>httplib::Headers</code> を渡します。<code>Get()</code> や <code>Post()</code> のどちらでも使えます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/hi</span><span style="color:#d3d0c8;">", httplib::Headers{
|
||||
</span><span style="color:#d3d0c8;"> {"</span><span style="color:#99cc99;">Authorization</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">Bearer my-token</span><span style="color:#d3d0c8;">"}
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/hi</span><span style="color:#c0c5ce;">", httplib::Headers{
|
||||
</span><span style="color:#c0c5ce;"> {"</span><span style="color:#a3be8c;">Authorization</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">Bearer my-token</span><span style="color:#c0c5ce;">"}
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> res </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> cli.Get(</span><span style="color:#183691;">"/hi"</span><span style="color:#323232;">, httplib::Headers{
|
||||
</span><span style="color:#323232;"> {</span><span style="color:#183691;">"Authorization"</span><span style="color:#323232;">, </span><span style="color:#183691;">"Bearer my-token"</span><span style="color:#323232;">}
|
||||
</span><span style="color:#323232;">});
|
||||
</span></pre>
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#f2777a;"> -H </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">Authorization: Bearer my-token</span><span style="color:#d3d0c8;">" http://localhost:8080/hi
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#bf616a;"> -H </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">Authorization: Bearer my-token</span><span style="color:#c0c5ce;">" http://localhost:8080/hi
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl -H </span><span style="color:#183691;">"Authorization: Bearer my-token"</span><span style="color:#323232;"> http://localhost:8080/hi
|
||||
@@ -366,12 +368,12 @@
|
||||
</div></div>
|
||||
<h2>POSTリクエスト</h2>
|
||||
<p>テキストデータをPOSTしてみましょう。<code>Post()</code> の第2引数にボディ、第3引数にContent-Typeを指定します。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/post</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">Hello, Server!</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// 200
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// Hello, Server!
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/post</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">Hello, Server!</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// 200
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// Hello, Server!
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> res </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> cli.Post(</span><span style="color:#183691;">"/post"</span><span style="color:#323232;">, </span><span style="color:#183691;">"Hello, Server!"</span><span style="color:#323232;">, </span><span style="color:#183691;">"text/plain"</span><span style="color:#323232;">);
|
||||
@@ -382,9 +384,9 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>テスト用サーバーの <code>/post</code> はボディをそのまま返すので、送った文字列がそのまま返ってきます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#f2777a;"> -X</span><span style="color:#d3d0c8;"> POST</span><span style="color:#f2777a;"> -H </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">Content-Type: text/plain</span><span style="color:#d3d0c8;">"</span><span style="color:#f2777a;"> -d </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">Hello, Server!</span><span style="color:#d3d0c8;">" http://localhost:8080/post
|
||||
</span><span style="color:#747369;"># Hello, Server!
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#bf616a;"> -X</span><span style="color:#c0c5ce;"> POST</span><span style="color:#bf616a;"> -H </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">Content-Type: text/plain</span><span style="color:#c0c5ce;">"</span><span style="color:#bf616a;"> -d </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">Hello, Server!</span><span style="color:#c0c5ce;">" http://localhost:8080/post
|
||||
</span><span style="color:#65737e;"># Hello, Server!
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl -X POST -H </span><span style="color:#183691;">"Content-Type: text/plain"</span><span style="color:#323232;"> -d </span><span style="color:#183691;">"Hello, Server!"</span><span style="color:#323232;"> http://localhost:8080/post
|
||||
@@ -393,16 +395,16 @@
|
||||
</div></div>
|
||||
<h2>フォームデータの送信</h2>
|
||||
<p>HTMLフォームのように、キーと値のペアを送ることもできます。<code>httplib::Params</code> を使います。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/submit</span><span style="color:#d3d0c8;">", httplib::Params{
|
||||
</span><span style="color:#d3d0c8;"> {"</span><span style="color:#99cc99;">name</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">Alice</span><span style="color:#d3d0c8;">"},
|
||||
</span><span style="color:#d3d0c8;"> {"</span><span style="color:#99cc99;">age</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">30</span><span style="color:#d3d0c8;">"}
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// age = 30
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// name = Alice
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/submit</span><span style="color:#c0c5ce;">", httplib::Params{
|
||||
</span><span style="color:#c0c5ce;"> {"</span><span style="color:#a3be8c;">name</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">Alice</span><span style="color:#c0c5ce;">"},
|
||||
</span><span style="color:#c0c5ce;"> {"</span><span style="color:#a3be8c;">age</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">30</span><span style="color:#c0c5ce;">"}
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// age = 30
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// name = Alice
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> res </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> cli.Post(</span><span style="color:#183691;">"/submit"</span><span style="color:#323232;">, httplib::Params{
|
||||
@@ -417,8 +419,8 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>これは <code>application/x-www-form-urlencoded</code> 形式で送信されます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#f2777a;"> -X</span><span style="color:#d3d0c8;"> POST</span><span style="color:#f2777a;"> -d </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">name=Alice&age=30</span><span style="color:#d3d0c8;">" http://localhost:8080/submit
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#bf616a;"> -X</span><span style="color:#c0c5ce;"> POST</span><span style="color:#bf616a;"> -d </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">name=Alice&age=30</span><span style="color:#c0c5ce;">" http://localhost:8080/submit
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl -X POST -d </span><span style="color:#183691;">"name=Alice&age=30"</span><span style="color:#323232;"> http://localhost:8080/submit
|
||||
@@ -426,13 +428,13 @@
|
||||
</div></div>
|
||||
<h2>ファイルのPOST</h2>
|
||||
<p>ファイルをアップロードするには、<code>httplib::UploadFormDataItems</code> を使ってマルチパートフォームデータとして送信します。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/upload</span><span style="color:#d3d0c8;">", httplib::UploadFormDataItems{
|
||||
</span><span style="color:#d3d0c8;"> {"</span><span style="color:#99cc99;">file</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">Hello, File!</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">hello.txt</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">"}
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// hello.txt (12 bytes)
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/upload</span><span style="color:#c0c5ce;">", httplib::UploadFormDataItems{
|
||||
</span><span style="color:#c0c5ce;"> {"</span><span style="color:#a3be8c;">file</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">Hello, File!</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">hello.txt</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">"}
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// hello.txt (12 bytes)
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> res </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> cli.Post(</span><span style="color:#183691;">"/upload"</span><span style="color:#323232;">, httplib::UploadFormDataItems{
|
||||
@@ -444,8 +446,8 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p><code>UploadFormDataItems</code> の各要素は <code>{name, content, filename, content_type}</code> の4つのフィールドで構成されます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#f2777a;"> -F </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">file=Hello, File!;filename=hello.txt;type=text/plain</span><span style="color:#d3d0c8;">" http://localhost:8080/upload
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#bf616a;"> -F </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">file=Hello, File!;filename=hello.txt;type=text/plain</span><span style="color:#c0c5ce;">" http://localhost:8080/upload
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl -F </span><span style="color:#183691;">"file=Hello, File!;filename=hello.txt;type=text/plain"</span><span style="color:#323232;"> http://localhost:8080/upload
|
||||
@@ -453,24 +455,24 @@
|
||||
</div></div>
|
||||
<h2>エラーハンドリング</h2>
|
||||
<p>ネットワーク通信では、サーバーに接続できない場合があります。<code>res</code> が有効かどうかを必ず確認しましょう。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">http://localhost:9999</span><span style="color:#d3d0c8;">"); </span><span style="color:#747369;">// 存在しないポート
|
||||
</span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/hi</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(!res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// 接続エラー
|
||||
</span><span style="color:#d3d0c8;"> std::cout << "</span><span style="color:#99cc99;">Error: </span><span style="color:#d3d0c8;">" << </span><span style="color:#6699cc;">httplib::to_string</span><span style="color:#d3d0c8;">(res.</span><span style="color:#6699cc;">error</span><span style="color:#d3d0c8;">()) << std::endl;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// Error: Connection
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">return </span><span style="color:#f99157;">1</span><span style="color:#d3d0c8;">;
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#747369;">// ここに到達すればレスポンスを受信できている
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res-></span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;">!= </span><span style="color:#f99157;">200</span><span style="color:#d3d0c8;">) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << "</span><span style="color:#99cc99;">HTTP Error: </span><span style="color:#d3d0c8;">" << res-></span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;"><< std::endl;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">return </span><span style="color:#f99157;">1</span><span style="color:#d3d0c8;">;
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;">std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl;
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">http://localhost:9999</span><span style="color:#c0c5ce;">"); </span><span style="color:#65737e;">// 存在しないポート
|
||||
</span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/hi</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(!res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// 接続エラー
|
||||
</span><span style="color:#c0c5ce;"> std::cout << "</span><span style="color:#a3be8c;">Error: </span><span style="color:#c0c5ce;">" << </span><span style="color:#8fa1b3;">httplib::to_string</span><span style="color:#c0c5ce;">(res.</span><span style="color:#8fa1b3;">error</span><span style="color:#c0c5ce;">()) << std::endl;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// Error: Connection
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">return </span><span style="color:#d08770;">1</span><span style="color:#c0c5ce;">;
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#65737e;">// ここに到達すればレスポンスを受信できている
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res-></span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;">!= </span><span style="color:#d08770;">200</span><span style="color:#c0c5ce;">) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << "</span><span style="color:#a3be8c;">HTTP Error: </span><span style="color:#c0c5ce;">" << res-></span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;"><< std::endl;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">return </span><span style="color:#d08770;">1</span><span style="color:#c0c5ce;">;
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;">std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl;
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"http://localhost:9999"</span><span style="color:#323232;">); </span><span style="font-style:italic;color:#969896;">// 存在しないポート
|
||||
@@ -507,7 +509,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button class="sidebar-toggle" aria-label="Menu">☰</button>
|
||||
</div>
|
||||
@@ -105,8 +107,8 @@
|
||||
<p>前章ではクライアントからリクエストを送りました。そのとき、テスト用サーバーを用意しましたね。この章では、あのサーバーの仕組みをひとつずつ紐解いていきます。</p>
|
||||
<h2>サーバーの起動</h2>
|
||||
<p>ルーティングを登録したら、最後に <code>svr.listen()</code> を呼んでサーバーを起動します。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">listen</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">0.0.0.0</span><span style="color:#d3d0c8;">", </span><span style="color:#f99157;">8080</span><span style="color:#d3d0c8;">);
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">listen</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">0.0.0.0</span><span style="color:#c0c5ce;">", </span><span style="color:#d08770;">8080</span><span style="color:#c0c5ce;">);
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.listen(</span><span style="color:#183691;">"0.0.0.0"</span><span style="color:#323232;">, </span><span style="color:#0086b3;">8080</span><span style="color:#323232;">);
|
||||
@@ -116,12 +118,12 @@
|
||||
<p><code>listen()</code> はブロッキング呼び出しです。サーバーが停止するまで、この行から先には進みません。ターミナルで <code>Ctrl+C</code> を押すか、別スレッドから <code>svr.stop()</code> を呼ぶまでサーバーは動き続けます。</p>
|
||||
<h2>ルーティング</h2>
|
||||
<p>サーバーの核になるのは「ルーティング」です。どのURLに、どのHTTPメソッドでアクセスされたら、何をするか。それを登録する仕組みです。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Server svr;
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/hi</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const</span><span style="color:#d3d0c8;"> httplib::Request &req, httplib::Response &res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Hello!</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Server svr;
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/hi</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const</span><span style="color:#c0c5ce;"> httplib::Request &req, httplib::Response &res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Hello!</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Server svr;
|
||||
@@ -133,11 +135,11 @@
|
||||
</div></div>
|
||||
<p><code>svr.Get()</code> は、GETリクエストに対するハンドラーを登録します。第1引数がパス、第2引数がハンドラー関数です。<code>/hi</code> にGETリクエストが来たら、このラムダが呼ばれます。</p>
|
||||
<p>HTTPメソッドごとにメソッドが用意されています。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/path</span><span style="color:#d3d0c8;">", handler); </span><span style="color:#747369;">// GET
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/path</span><span style="color:#d3d0c8;">", handler); </span><span style="color:#747369;">// POST
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Put</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/path</span><span style="color:#d3d0c8;">", handler); </span><span style="color:#747369;">// PUT
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Delete</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/path</span><span style="color:#d3d0c8;">", handler); </span><span style="color:#747369;">// DELETE
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/path</span><span style="color:#c0c5ce;">", handler); </span><span style="color:#65737e;">// GET
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/path</span><span style="color:#c0c5ce;">", handler); </span><span style="color:#65737e;">// POST
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Put</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/path</span><span style="color:#c0c5ce;">", handler); </span><span style="color:#65737e;">// PUT
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Delete</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/path</span><span style="color:#c0c5ce;">", handler); </span><span style="color:#65737e;">// DELETE
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/path"</span><span style="color:#323232;">, handler); </span><span style="font-style:italic;color:#969896;">// GET
|
||||
@@ -147,10 +149,10 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>ハンドラーのシグネチャは <code>(const httplib::Request &req, httplib::Response &res)</code> です。<code>auto</code> を使って短く書くこともできます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/hi</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Hello!</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/hi</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Hello!</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/hi"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -163,11 +165,11 @@
|
||||
<p>ハンドラーの第1引数 <code>req</code> から、クライアントが送ってきた情報を読み取れます。</p>
|
||||
<h3>ボディ</h3>
|
||||
<p><code>req.body</code> でリクエストボディを取得できます。型は <code>std::string</code> です。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/post</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// クライアントが送ったボディをそのまま返す
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">(req.</span><span style="color:#f2777a;">body</span><span style="color:#d3d0c8;">, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/post</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// クライアントが送ったボディをそのまま返す
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">(req.</span><span style="color:#bf616a;">body</span><span style="color:#c0c5ce;">, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Post(</span><span style="color:#183691;">"/post"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -178,11 +180,11 @@
|
||||
</div></div>
|
||||
<h3>ヘッダー</h3>
|
||||
<p><code>req.get_header_value()</code> でリクエストヘッダーの値を取得できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/check</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> auth = req.</span><span style="color:#6699cc;">get_header_value</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Authorization</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Auth: </span><span style="color:#d3d0c8;">" + auth, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/check</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> auth = req.</span><span style="color:#8fa1b3;">get_header_value</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Authorization</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Auth: </span><span style="color:#c0c5ce;">" + auth, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/check"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -193,11 +195,11 @@
|
||||
</div></div>
|
||||
<h3>クエリパラメーターとフォームデータ</h3>
|
||||
<p><code>req.get_param_value()</code> でパラメーターを取得できます。GETのクエリパラメーターと、POSTのフォームデータの両方に使えます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/search</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> q = req.</span><span style="color:#6699cc;">get_param_value</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">q</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Query: </span><span style="color:#d3d0c8;">" + q, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/search</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> q = req.</span><span style="color:#8fa1b3;">get_param_value</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">q</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Query: </span><span style="color:#c0c5ce;">" + q, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/search"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -208,14 +210,14 @@
|
||||
</div></div>
|
||||
<p><code>/search?q=cpp-httplib</code> にアクセスすると、<code>q</code> の値は <code>"cpp-httplib"</code> になります。</p>
|
||||
<p>すべてのパラメーターをループで処理したいときは、<code>req.params</code> を使います。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/submit</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> std::string result;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">for </span><span style="color:#d3d0c8;">(</span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&[key, val] : req.</span><span style="color:#f2777a;">params</span><span style="color:#d3d0c8;">) {
|
||||
</span><span style="color:#d3d0c8;"> result += key + "</span><span style="color:#99cc99;"> = </span><span style="color:#d3d0c8;">" + val + "</span><span style="color:#66cccc;">\n</span><span style="color:#d3d0c8;">";
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">(result, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/submit</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> std::string result;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">for </span><span style="color:#c0c5ce;">(</span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&[key, val] : req.</span><span style="color:#bf616a;">params</span><span style="color:#c0c5ce;">) {
|
||||
</span><span style="color:#c0c5ce;"> result += key + "</span><span style="color:#a3be8c;"> = </span><span style="color:#c0c5ce;">" + val + "</span><span style="color:#96b5b4;">\n</span><span style="color:#c0c5ce;">";
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">(result, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Post(</span><span style="color:#183691;">"/submit"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -229,12 +231,12 @@
|
||||
</div></div>
|
||||
<h3>ファイルアップロード</h3>
|
||||
<p>マルチパートフォームでアップロードされたファイルは、<code>req.form.get_file()</code> で取得します。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/upload</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> f = req.</span><span style="color:#f2777a;">form</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">get_file</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">file</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> content = f.</span><span style="color:#f2777a;">filename </span><span style="color:#d3d0c8;">+ "</span><span style="color:#99cc99;"> (</span><span style="color:#d3d0c8;">" + </span><span style="color:#6699cc;">std::to_string</span><span style="color:#d3d0c8;">(f.</span><span style="color:#f2777a;">content</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">size</span><span style="color:#d3d0c8;">()) + "</span><span style="color:#99cc99;"> bytes)</span><span style="color:#d3d0c8;">";
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">(content, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/upload</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> f = req.</span><span style="color:#bf616a;">form</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">get_file</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">file</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> content = f.</span><span style="color:#bf616a;">filename </span><span style="color:#c0c5ce;">+ "</span><span style="color:#a3be8c;"> (</span><span style="color:#c0c5ce;">" + </span><span style="color:#8fa1b3;">std::to_string</span><span style="color:#c0c5ce;">(f.</span><span style="color:#bf616a;">content</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">size</span><span style="color:#c0c5ce;">()) + "</span><span style="color:#a3be8c;"> bytes)</span><span style="color:#c0c5ce;">";
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">(content, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Post(</span><span style="color:#183691;">"/upload"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -247,11 +249,11 @@
|
||||
<p><code>f.filename</code> でファイル名、<code>f.content</code> でファイルの中身にアクセスできます。</p>
|
||||
<h2>パスパラメーター</h2>
|
||||
<p>URLの一部を変数として受け取りたいことがあります。たとえば <code>/users/42</code> の <code>42</code> を取得したい場合です。<code>:param</code> 記法を使うと、URLの一部をキャプチャできます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/users/:id</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> id = req.</span><span style="color:#f2777a;">path_params</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">at</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">id</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">User ID: </span><span style="color:#d3d0c8;">" + id, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/users/:id</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> id = req.</span><span style="color:#bf616a;">path_params</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">at</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">id</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">User ID: </span><span style="color:#c0c5ce;">" + id, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/users/:id"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -262,12 +264,12 @@
|
||||
</div></div>
|
||||
<p><code>/users/42</code> にアクセスすると、<code>req.path_params.at("id")</code> は <code>"42"</code> を返します。<code>/users/100</code> なら <code>"100"</code> です。</p>
|
||||
<p>複数のパスパラメーターも使えます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/users/:user_id/posts/:post_id</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> user_id = req.</span><span style="color:#f2777a;">path_params</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">at</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">user_id</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> post_id = req.</span><span style="color:#f2777a;">path_params</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">at</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">post_id</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">User: </span><span style="color:#d3d0c8;">" + user_id + "</span><span style="color:#99cc99;">, Post: </span><span style="color:#d3d0c8;">" + post_id, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/users/:user_id/posts/:post_id</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> user_id = req.</span><span style="color:#bf616a;">path_params</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">at</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">user_id</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> post_id = req.</span><span style="color:#bf616a;">path_params</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">at</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">post_id</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">User: </span><span style="color:#c0c5ce;">" + user_id + "</span><span style="color:#a3be8c;">, Post: </span><span style="color:#c0c5ce;">" + post_id, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/users/:user_id/posts/:post_id"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -279,12 +281,12 @@
|
||||
</div></div>
|
||||
<h3>正規表現パターン</h3>
|
||||
<p><code>:param</code> の代わりに正規表現をパスに書くこともできます。キャプチャグループの値は <code>req.matches</code> で取得します。型は <code>std::smatch</code> です。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#747369;">// 数字のみのIDを受け付ける
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">(</span><span style="color:#cc99cc;">R</span><span style="color:#d3d0c8;">"(</span><span style="color:#99cc99;">/files/(\d+)</span><span style="color:#d3d0c8;">)", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> id = req.</span><span style="color:#f2777a;">matches</span><span style="color:#d3d0c8;">[</span><span style="color:#f99157;">1</span><span style="color:#d3d0c8;">]; </span><span style="color:#747369;">// 最初のキャプチャグループ
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">File ID: </span><span style="color:#d3d0c8;">" + </span><span style="color:#6699cc;">std::string</span><span style="color:#d3d0c8;">(id), "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#65737e;">// 数字のみのIDを受け付ける
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">(</span><span style="color:#b48ead;">R</span><span style="color:#c0c5ce;">"(</span><span style="color:#a3be8c;">/files/(\d+)</span><span style="color:#c0c5ce;">)", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> id = req.</span><span style="color:#bf616a;">matches</span><span style="color:#c0c5ce;">[</span><span style="color:#d08770;">1</span><span style="color:#c0c5ce;">]; </span><span style="color:#65737e;">// 最初のキャプチャグループ
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">File ID: </span><span style="color:#c0c5ce;">" + </span><span style="color:#8fa1b3;">std::string</span><span style="color:#c0c5ce;">(id), "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-style:italic;color:#969896;">// 数字のみのIDを受け付ける
|
||||
@@ -299,10 +301,10 @@
|
||||
<p>ハンドラーの第2引数 <code>res</code> を使って、クライアントに返すレスポンスを組み立てます。</p>
|
||||
<h3>ボディとContent-Type</h3>
|
||||
<p><code>res.set_content()</code> でボディとContent-Typeを設定します。これだけでステータスコード200のレスポンスが返ります。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/hi</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Hello!</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/hi</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Hello!</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/hi"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -312,11 +314,11 @@
|
||||
</div></div>
|
||||
<h3>ステータスコード</h3>
|
||||
<p>ステータスコードを変えたいときは、<code>res.status</code> に代入します。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/not-found</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;">= </span><span style="color:#f99157;">404</span><span style="color:#d3d0c8;">;
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Not found</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/not-found</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;">= </span><span style="color:#d08770;">404</span><span style="color:#c0c5ce;">;
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Not found</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/not-found"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -327,11 +329,11 @@
|
||||
</div></div>
|
||||
<h3>レスポンスヘッダー</h3>
|
||||
<p><code>res.set_header()</code> でレスポンスヘッダーを追加できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/with-header</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_header</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">X-Custom</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">my-value</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Hello!</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/with-header</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_header</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">X-Custom</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">my-value</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Hello!</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/with-header"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -343,10 +345,10 @@
|
||||
<h2>前章のサーバーを読み解く</h2>
|
||||
<p>ここまでの知識を使って、前章で用意したテスト用サーバーを改めて見てみましょう。</p>
|
||||
<h3>GET /hi</h3>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/hi</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Hello!</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/hi</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Hello!</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/hi"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -356,11 +358,11 @@
|
||||
</div></div>
|
||||
<p>最もシンプルなハンドラーです。リクエストの情報は使わないので、<code>req</code> の変数名を省略しています。<code>"Hello!"</code> というテキストをそのまま返します。</p>
|
||||
<h3>GET /search</h3>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/search</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> q = req.</span><span style="color:#6699cc;">get_param_value</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">q</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Query: </span><span style="color:#d3d0c8;">" + q, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/search</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> q = req.</span><span style="color:#8fa1b3;">get_param_value</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">q</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Query: </span><span style="color:#c0c5ce;">" + q, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/search"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -371,10 +373,10 @@
|
||||
</div></div>
|
||||
<p><code>req.get_param_value("q")</code> でクエリパラメーター <code>q</code> の値を取り出します。<code>/search?q=cpp-httplib</code> なら、レスポンスは <code>"Query: cpp-httplib"</code> になります。</p>
|
||||
<h3>POST /post</h3>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/post</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">(req.</span><span style="color:#f2777a;">body</span><span style="color:#d3d0c8;">, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/post</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">(req.</span><span style="color:#bf616a;">body</span><span style="color:#c0c5ce;">, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Post(</span><span style="color:#183691;">"/post"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -384,14 +386,14 @@
|
||||
</div></div>
|
||||
<p>クライアントが送ったリクエストボディを、そのままレスポンスとして返すエコーサーバーです。<code>req.body</code> にボディが丸ごと入っています。</p>
|
||||
<h3>POST /submit</h3>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/submit</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> std::string result;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">for </span><span style="color:#d3d0c8;">(</span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&[key, val] : req.</span><span style="color:#f2777a;">params</span><span style="color:#d3d0c8;">) {
|
||||
</span><span style="color:#d3d0c8;"> result += key + "</span><span style="color:#99cc99;"> = </span><span style="color:#d3d0c8;">" + val + "</span><span style="color:#66cccc;">\n</span><span style="color:#d3d0c8;">";
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">(result, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/submit</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> std::string result;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">for </span><span style="color:#c0c5ce;">(</span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&[key, val] : req.</span><span style="color:#bf616a;">params</span><span style="color:#c0c5ce;">) {
|
||||
</span><span style="color:#c0c5ce;"> result += key + "</span><span style="color:#a3be8c;"> = </span><span style="color:#c0c5ce;">" + val + "</span><span style="color:#96b5b4;">\n</span><span style="color:#c0c5ce;">";
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">(result, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Post(</span><span style="color:#183691;">"/submit"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -405,12 +407,12 @@
|
||||
</div></div>
|
||||
<p>フォームデータとして送られたキーと値のペアを、<code>req.params</code> でループ処理しています。構造化束縛 <code>auto &[key, val]</code> を使って、各ペアを取り出しています。</p>
|
||||
<h3>POST /upload</h3>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/upload</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> f = req.</span><span style="color:#f2777a;">form</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">get_file</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">file</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> content = f.</span><span style="color:#f2777a;">filename </span><span style="color:#d3d0c8;">+ "</span><span style="color:#99cc99;"> (</span><span style="color:#d3d0c8;">" + </span><span style="color:#6699cc;">std::to_string</span><span style="color:#d3d0c8;">(f.</span><span style="color:#f2777a;">content</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">size</span><span style="color:#d3d0c8;">()) + "</span><span style="color:#99cc99;"> bytes)</span><span style="color:#d3d0c8;">";
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">(content, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/upload</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> f = req.</span><span style="color:#bf616a;">form</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">get_file</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">file</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> content = f.</span><span style="color:#bf616a;">filename </span><span style="color:#c0c5ce;">+ "</span><span style="color:#a3be8c;"> (</span><span style="color:#c0c5ce;">" + </span><span style="color:#8fa1b3;">std::to_string</span><span style="color:#c0c5ce;">(f.</span><span style="color:#bf616a;">content</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">size</span><span style="color:#c0c5ce;">()) + "</span><span style="color:#a3be8c;"> bytes)</span><span style="color:#c0c5ce;">";
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">(content, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Post(</span><span style="color:#183691;">"/upload"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -422,11 +424,11 @@
|
||||
</div></div>
|
||||
<p>マルチパートフォームで送られたファイルを受け取ります。<code>req.form.get_file("file")</code> で <code>"file"</code> という名前のフィールドを取得し、<code>f.filename</code> と <code>f.content.size()</code> でファイル名とサイズを返しています。</p>
|
||||
<h3>GET /users/:id</h3>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/users/:id</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> id = req.</span><span style="color:#f2777a;">path_params</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">at</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">id</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">User ID: </span><span style="color:#d3d0c8;">" + id, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/users/:id</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> id = req.</span><span style="color:#bf616a;">path_params</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">at</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">id</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">User ID: </span><span style="color:#c0c5ce;">" + id, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="color:#183691;">"/users/:id"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -437,11 +439,11 @@
|
||||
</div></div>
|
||||
<p><code>:id</code> の部分がパスパラメーターです。<code>req.path_params.at("id")</code> で値を取り出しています。<code>/users/42</code> なら <code>"42"</code>、<code>/users/alice</code> なら <code>"alice"</code> が得られます。</p>
|
||||
<h3>GET /files/(\d+)</h3>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">(</span><span style="color:#cc99cc;">R</span><span style="color:#d3d0c8;">"(</span><span style="color:#99cc99;">/files/(\d+)</span><span style="color:#d3d0c8;">)", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> id = req.</span><span style="color:#f2777a;">matches</span><span style="color:#d3d0c8;">[</span><span style="color:#f99157;">1</span><span style="color:#d3d0c8;">];
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">File ID: </span><span style="color:#d3d0c8;">" + </span><span style="color:#6699cc;">std::string</span><span style="color:#d3d0c8;">(id), "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">(</span><span style="color:#b48ead;">R</span><span style="color:#c0c5ce;">"(</span><span style="color:#a3be8c;">/files/(\d+)</span><span style="color:#c0c5ce;">)", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> id = req.</span><span style="color:#bf616a;">matches</span><span style="color:#c0c5ce;">[</span><span style="color:#d08770;">1</span><span style="color:#c0c5ce;">];
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">File ID: </span><span style="color:#c0c5ce;">" + </span><span style="color:#8fa1b3;">std::string</span><span style="color:#c0c5ce;">(id), "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.Get(</span><span style="font-weight:bold;color:#a71d5d;">R</span><span style="color:#183691;">"(/files/(\d+))"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -462,7 +464,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button class="sidebar-toggle" aria-label="Menu">☰</button>
|
||||
</div>
|
||||
@@ -105,18 +107,18 @@
|
||||
<p>cpp-httplibは、HTMLやCSS、画像ファイルなどの静的ファイルも配信できます。面倒な設定は要りません。<code>set_mount_point()</code> を1行呼ぶだけです。</p>
|
||||
<h2>set_mount_point の基本</h2>
|
||||
<p>さっそくやってみましょう。<code>set_mount_point()</code> は、URLのパスとローカルディレクトリを紐づけます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">httplib.h</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;"><</span><span style="color:#99cc99;">iostream</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">int </span><span style="color:#6699cc;">main</span><span style="color:#d3d0c8;">() {
|
||||
</span><span style="color:#d3d0c8;"> httplib::Server svr;
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">set_mount_point</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">./html</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> std::cout << "</span><span style="color:#99cc99;">Listening on port 8080...</span><span style="color:#d3d0c8;">" << std::endl;
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">listen</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">0.0.0.0</span><span style="color:#d3d0c8;">", </span><span style="color:#f99157;">8080</span><span style="color:#d3d0c8;">);
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">httplib.h</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;"><</span><span style="color:#a3be8c;">iostream</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">int </span><span style="color:#8fa1b3;">main</span><span style="color:#c0c5ce;">() {
|
||||
</span><span style="color:#c0c5ce;"> httplib::Server svr;
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">set_mount_point</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">./html</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> std::cout << "</span><span style="color:#a3be8c;">Listening on port 8080...</span><span style="color:#c0c5ce;">" << std::endl;
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">listen</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">0.0.0.0</span><span style="color:#c0c5ce;">", </span><span style="color:#d08770;">8080</span><span style="color:#c0c5ce;">);
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">#include </span><span style="color:#183691;">"httplib.h"
|
||||
@@ -134,21 +136,21 @@
|
||||
</div></div>
|
||||
<p>第1引数がURLのマウントポイント、第2引数がローカルのディレクトリパスです。この例だと、<code>/</code> へのリクエストを <code>./html</code> ディレクトリから配信します。</p>
|
||||
<p>試してみましょう。まず <code>html</code> ディレクトリを作って、<code>index.html</code> を置きます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">mkdir</span><span style="color:#d3d0c8;"> html
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">mkdir</span><span style="color:#c0c5ce;"> html
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">mkdir html
|
||||
</span></pre>
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;"><!</span><span style="color:#f2777a;">DOCTYPE</span><span style="color:#d3d0c8;"> html>
|
||||
</span><span style="color:#d3d0c8;"><</span><span style="color:#f2777a;">html</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;"><</span><span style="color:#f2777a;">head</span><span style="color:#d3d0c8;">><</span><span style="color:#f2777a;">title</span><span style="color:#d3d0c8;">>My Page</</span><span style="color:#f2777a;">title</span><span style="color:#d3d0c8;">></</span><span style="color:#f2777a;">head</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;"><</span><span style="color:#f2777a;">body</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;"> <</span><span style="color:#f2777a;">h1</span><span style="color:#d3d0c8;">>Hello from cpp-httplib!</</span><span style="color:#f2777a;">h1</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;"> <</span><span style="color:#f2777a;">p</span><span style="color:#d3d0c8;">>This is a static file.</</span><span style="color:#f2777a;">p</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;"></</span><span style="color:#f2777a;">body</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;"></</span><span style="color:#f2777a;">html</span><span style="color:#d3d0c8;">>
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;"><!</span><span style="color:#bf616a;">DOCTYPE</span><span style="color:#c0c5ce;"> html>
|
||||
</span><span style="color:#c0c5ce;"><</span><span style="color:#bf616a;">html</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;"><</span><span style="color:#bf616a;">head</span><span style="color:#c0c5ce;">><</span><span style="color:#bf616a;">title</span><span style="color:#c0c5ce;">>My Page</</span><span style="color:#bf616a;">title</span><span style="color:#c0c5ce;">></</span><span style="color:#bf616a;">head</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;"><</span><span style="color:#bf616a;">body</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;"> <</span><span style="color:#bf616a;">h1</span><span style="color:#c0c5ce;">>Hello from cpp-httplib!</</span><span style="color:#bf616a;">h1</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;"> <</span><span style="color:#bf616a;">p</span><span style="color:#c0c5ce;">>This is a static file.</</span><span style="color:#bf616a;">p</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;"></</span><span style="color:#bf616a;">body</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;"></</span><span style="color:#bf616a;">html</span><span style="color:#c0c5ce;">>
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;"><!</span><span style="color:#63a35c;">DOCTYPE</span><span style="color:#323232;"> html>
|
||||
@@ -162,9 +164,9 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>コンパイルして起動します。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">g++</span><span style="color:#f2777a;"> -std</span><span style="color:#d3d0c8;">=c++17</span><span style="color:#f2777a;"> -o</span><span style="color:#d3d0c8;"> server server.cpp</span><span style="color:#f2777a;"> -pthread
|
||||
</span><span style="color:#6699cc;">./server
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">g++</span><span style="color:#bf616a;"> -std</span><span style="color:#c0c5ce;">=c++17</span><span style="color:#bf616a;"> -o</span><span style="color:#c0c5ce;"> server server.cpp</span><span style="color:#bf616a;"> -pthread
|
||||
</span><span style="color:#8fa1b3;">./server
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">g++ -std</span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;">c++17 -o server server.cpp -pthread
|
||||
@@ -173,12 +175,12 @@
|
||||
</div></div>
|
||||
<p>ブラウザで <code>http://localhost:8080</code> を開いてみてください。<code>html/index.html</code> の内容が表示されるはずです。<code>http://localhost:8080/index.html</code> でも同じページが返ります。</p>
|
||||
<p>もちろん、前章のクライアントコードや <code>curl</code> でもアクセスできますよ。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">http://localhost:8080</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// HTMLが表示される
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">http://localhost:8080</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// HTMLが表示される
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"http://localhost:8080"</span><span style="color:#323232;">);
|
||||
@@ -187,8 +189,8 @@
|
||||
</span><span style="color:#323232;"> std::cout </span><span style="font-weight:bold;color:#a71d5d;"><<</span><span style="color:#323232;"> res->body </span><span style="font-weight:bold;color:#a71d5d;"><<</span><span style="color:#323232;"> std::endl; </span><span style="font-style:italic;color:#969896;">// HTMLが表示される
|
||||
</span><span style="color:#323232;">}
|
||||
</span></pre>
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#d3d0c8;"> http://localhost:8080
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#c0c5ce;"> http://localhost:8080
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl http://localhost:8080
|
||||
@@ -196,10 +198,10 @@
|
||||
</div></div>
|
||||
<h2>複数のマウントポイント</h2>
|
||||
<p><code>set_mount_point()</code> は何回でも呼べます。URLのパスごとに、別々のディレクトリを割り当てられます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_mount_point</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">./public</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_mount_point</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/assets</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">./static/assets</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_mount_point</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/docs</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">./documentation</span><span style="color:#d3d0c8;">");
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_mount_point</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">./public</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_mount_point</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/assets</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">./static/assets</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_mount_point</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/docs</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">./documentation</span><span style="color:#c0c5ce;">");
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.set_mount_point(</span><span style="color:#183691;">"/"</span><span style="color:#323232;">, </span><span style="color:#183691;">"./public"</span><span style="color:#323232;">);
|
||||
@@ -210,18 +212,18 @@
|
||||
<p><code>/assets/style.css</code> なら <code>./static/assets/style.css</code> を、<code>/docs/guide.html</code> なら <code>./documentation/guide.html</code> を配信します。</p>
|
||||
<h2>ハンドラーとの組み合わせ</h2>
|
||||
<p>静的ファイルの配信と、前章で学んだルーティングハンドラーは共存できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Server svr;
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#747369;">// APIエンドポイント
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/api/hello</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">(</span><span style="color:#cc99cc;">R</span><span style="color:#d3d0c8;">"(</span><span style="color:#99cc99;">{"message":"Hello!"}</span><span style="color:#d3d0c8;">)", "</span><span style="color:#99cc99;">application/json</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#747369;">// 静的ファイル配信
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_mount_point</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">./public</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">listen</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">0.0.0.0</span><span style="color:#d3d0c8;">", </span><span style="color:#f99157;">8080</span><span style="color:#d3d0c8;">);
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Server svr;
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#65737e;">// APIエンドポイント
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/api/hello</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">(</span><span style="color:#b48ead;">R</span><span style="color:#c0c5ce;">"(</span><span style="color:#a3be8c;">{"message":"Hello!"}</span><span style="color:#c0c5ce;">)", "</span><span style="color:#a3be8c;">application/json</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#65737e;">// 静的ファイル配信
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_mount_point</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">./public</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">listen</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">0.0.0.0</span><span style="color:#c0c5ce;">", </span><span style="color:#d08770;">8080</span><span style="color:#c0c5ce;">);
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Server svr;
|
||||
@@ -240,10 +242,10 @@
|
||||
<p>ハンドラーが先に評価されます。<code>/api/hello</code> にはハンドラーが応答し、それ以外のパスは <code>./public</code> ディレクトリからファイルを探します。</p>
|
||||
<h2>レスポンスヘッダーの追加</h2>
|
||||
<p><code>set_mount_point()</code> の第3引数にヘッダーを渡すと、静的ファイルのレスポンスにカスタムヘッダーを付けられます。キャッシュ制御に便利です。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_mount_point</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">./public</span><span style="color:#d3d0c8;">", {
|
||||
</span><span style="color:#d3d0c8;"> {"</span><span style="color:#99cc99;">Cache-Control</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">max-age=3600</span><span style="color:#d3d0c8;">"}
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_mount_point</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">./public</span><span style="color:#c0c5ce;">", {
|
||||
</span><span style="color:#c0c5ce;"> {"</span><span style="color:#a3be8c;">Cache-Control</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">max-age=3600</span><span style="color:#c0c5ce;">"}
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.set_mount_point(</span><span style="color:#183691;">"/"</span><span style="color:#323232;">, </span><span style="color:#183691;">"./public"</span><span style="color:#323232;">, {
|
||||
@@ -254,14 +256,14 @@
|
||||
<p>こうすると、ブラウザは配信されたファイルを1時間キャッシュします。</p>
|
||||
<h2>静的ファイルサーバー用のDockerファイル</h2>
|
||||
<p>cpp-httplibのリポジトリには、静的ファイルサーバー用の <code>Dockerfile</code> が含まれています。Docker Hubにビルド済みイメージも公開しているので、1コマンドで起動できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">> docker run</span><span style="color:#f2777a;"> -p</span><span style="color:#d3d0c8;"> 8080:80</span><span style="color:#f2777a;"> -v</span><span style="color:#d3d0c8;"> ./my-site:/html yhirose4dockerhub/cpp-httplib-server
|
||||
</span><span style="color:#6699cc;">Serving</span><span style="color:#d3d0c8;"> HTTP on 0.0.0.0:80
|
||||
</span><span style="color:#6699cc;">Mount</span><span style="color:#d3d0c8;"> point: / -> ./html
|
||||
</span><span style="color:#6699cc;">Press</span><span style="color:#d3d0c8;"> Ctrl+C to shutdown gracefully...
|
||||
</span><span style="color:#6699cc;">192.168.65.1</span><span style="color:#d3d0c8;"> - - </span><span style="color:#cc99cc;">[</span><span style="color:#d3d0c8;">22/Feb/2026:12:00:00 +0000</span><span style="color:#cc99cc;">] </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">GET / HTTP/1.1</span><span style="color:#d3d0c8;">" 200 256 "</span><span style="color:#99cc99;">-</span><span style="color:#d3d0c8;">" "</span><span style="color:#99cc99;">Mozilla/5.0 ...</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#6699cc;">192.168.65.1</span><span style="color:#d3d0c8;"> - - </span><span style="color:#cc99cc;">[</span><span style="color:#d3d0c8;">22/Feb/2026:12:00:00 +0000</span><span style="color:#cc99cc;">] </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">GET /style.css HTTP/1.1</span><span style="color:#d3d0c8;">" 200 1024 "</span><span style="color:#99cc99;">-</span><span style="color:#d3d0c8;">" "</span><span style="color:#99cc99;">Mozilla/5.0 ...</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#6699cc;">192.168.65.1</span><span style="color:#d3d0c8;"> - - </span><span style="color:#cc99cc;">[</span><span style="color:#d3d0c8;">22/Feb/2026:12:00:01 +0000</span><span style="color:#cc99cc;">] </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">GET /favicon.ico HTTP/1.1</span><span style="color:#d3d0c8;">" 404 152 "</span><span style="color:#99cc99;">-</span><span style="color:#d3d0c8;">" "</span><span style="color:#99cc99;">Mozilla/5.0 ...</span><span style="color:#d3d0c8;">"
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">> docker run</span><span style="color:#bf616a;"> -p</span><span style="color:#c0c5ce;"> 8080:80</span><span style="color:#bf616a;"> -v</span><span style="color:#c0c5ce;"> ./my-site:/html yhirose4dockerhub/cpp-httplib-server
|
||||
</span><span style="color:#8fa1b3;">Serving</span><span style="color:#c0c5ce;"> HTTP on 0.0.0.0:80
|
||||
</span><span style="color:#8fa1b3;">Mount</span><span style="color:#c0c5ce;"> point: / -> ./html
|
||||
</span><span style="color:#8fa1b3;">Press</span><span style="color:#c0c5ce;"> Ctrl+C to shutdown gracefully...
|
||||
</span><span style="color:#8fa1b3;">192.168.65.1</span><span style="color:#c0c5ce;"> - - </span><span style="color:#b48ead;">[</span><span style="color:#c0c5ce;">22/Feb/2026:12:00:00 +0000</span><span style="color:#b48ead;">] </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">GET / HTTP/1.1</span><span style="color:#c0c5ce;">" 200 256 "</span><span style="color:#a3be8c;">-</span><span style="color:#c0c5ce;">" "</span><span style="color:#a3be8c;">Mozilla/5.0 ...</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#8fa1b3;">192.168.65.1</span><span style="color:#c0c5ce;"> - - </span><span style="color:#b48ead;">[</span><span style="color:#c0c5ce;">22/Feb/2026:12:00:00 +0000</span><span style="color:#b48ead;">] </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">GET /style.css HTTP/1.1</span><span style="color:#c0c5ce;">" 200 1024 "</span><span style="color:#a3be8c;">-</span><span style="color:#c0c5ce;">" "</span><span style="color:#a3be8c;">Mozilla/5.0 ...</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#8fa1b3;">192.168.65.1</span><span style="color:#c0c5ce;"> - - </span><span style="color:#b48ead;">[</span><span style="color:#c0c5ce;">22/Feb/2026:12:00:01 +0000</span><span style="color:#b48ead;">] </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">GET /favicon.ico HTTP/1.1</span><span style="color:#c0c5ce;">" 404 152 "</span><span style="color:#a3be8c;">-</span><span style="color:#c0c5ce;">" "</span><span style="color:#a3be8c;">Mozilla/5.0 ...</span><span style="color:#c0c5ce;">"
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">></span><span style="color:#323232;"> docker run -p 8080:80 -v ./my-site:/html yhirose4dockerhub/cpp-httplib-server
|
||||
@@ -285,7 +287,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button class="sidebar-toggle" aria-label="Menu">☰</button>
|
||||
</div>
|
||||
@@ -113,22 +115,22 @@
|
||||
</tbody></table>
|
||||
<h2>コンパイルオプション</h2>
|
||||
<p>TLS機能を有効にするには、<code>CPPHTTPLIB_OPENSSL_SUPPORT</code> マクロを定義してコンパイルします。前章までのコンパイルコマンドに、いくつかオプションが増えます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#747369;"># macOS (Homebrew)
|
||||
</span><span style="color:#6699cc;">clang++</span><span style="color:#f2777a;"> -std</span><span style="color:#d3d0c8;">=c++17</span><span style="color:#f2777a;"> -DCPPHTTPLIB_OPENSSL_SUPPORT </span><span style="color:#d3d0c8;">\
|
||||
</span><span style="color:#f2777a;"> -I</span><span style="color:#d3d0c8;">$</span><span style="color:#f2777a;">(</span><span style="color:#6699cc;">brew</span><span style="color:#f2777a;"> --prefix openssl)</span><span style="color:#d3d0c8;">/include \
|
||||
</span><span style="color:#f2777a;"> -L</span><span style="color:#d3d0c8;">$</span><span style="color:#f2777a;">(</span><span style="color:#6699cc;">brew</span><span style="color:#f2777a;"> --prefix openssl)</span><span style="color:#d3d0c8;">/lib \
|
||||
</span><span style="color:#f2777a;"> -lssl -lcrypto </span><span style="color:#d3d0c8;">\
|
||||
</span><span style="color:#f2777a;"> -framework</span><span style="color:#d3d0c8;"> CoreFoundation</span><span style="color:#f2777a;"> -framework</span><span style="color:#d3d0c8;"> Security \
|
||||
</span><span style="color:#f2777a;"> -o</span><span style="color:#d3d0c8;"> server server.cpp
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#747369;"># Linux
|
||||
</span><span style="color:#6699cc;">clang++</span><span style="color:#f2777a;"> -std</span><span style="color:#d3d0c8;">=c++17</span><span style="color:#f2777a;"> -pthread -DCPPHTTPLIB_OPENSSL_SUPPORT </span><span style="color:#d3d0c8;">\
|
||||
</span><span style="color:#f2777a;"> -lssl -lcrypto </span><span style="color:#d3d0c8;">\
|
||||
</span><span style="color:#f2777a;"> -o</span><span style="color:#d3d0c8;"> server server.cpp
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#747369;"># Windows (Developer Command Prompt)
|
||||
</span><span style="color:#6699cc;">cl</span><span style="color:#d3d0c8;"> /EHsc /std:c++17 /DCPPHTTPLIB_OPENSSL_SUPPORT server.cpp libssl.lib libcrypto.lib
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#65737e;"># macOS (Homebrew)
|
||||
</span><span style="color:#8fa1b3;">clang++</span><span style="color:#bf616a;"> -std</span><span style="color:#c0c5ce;">=c++17</span><span style="color:#bf616a;"> -DCPPHTTPLIB_OPENSSL_SUPPORT </span><span style="color:#c0c5ce;">\
|
||||
</span><span style="color:#bf616a;"> -I</span><span style="color:#c0c5ce;">$</span><span style="color:#bf616a;">(</span><span style="color:#8fa1b3;">brew</span><span style="color:#bf616a;"> --prefix openssl)</span><span style="color:#c0c5ce;">/include \
|
||||
</span><span style="color:#bf616a;"> -L</span><span style="color:#c0c5ce;">$</span><span style="color:#bf616a;">(</span><span style="color:#8fa1b3;">brew</span><span style="color:#bf616a;"> --prefix openssl)</span><span style="color:#c0c5ce;">/lib \
|
||||
</span><span style="color:#bf616a;"> -lssl -lcrypto </span><span style="color:#c0c5ce;">\
|
||||
</span><span style="color:#bf616a;"> -framework</span><span style="color:#c0c5ce;"> CoreFoundation</span><span style="color:#bf616a;"> -framework</span><span style="color:#c0c5ce;"> Security \
|
||||
</span><span style="color:#bf616a;"> -o</span><span style="color:#c0c5ce;"> server server.cpp
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#65737e;"># Linux
|
||||
</span><span style="color:#8fa1b3;">clang++</span><span style="color:#bf616a;"> -std</span><span style="color:#c0c5ce;">=c++17</span><span style="color:#bf616a;"> -pthread -DCPPHTTPLIB_OPENSSL_SUPPORT </span><span style="color:#c0c5ce;">\
|
||||
</span><span style="color:#bf616a;"> -lssl -lcrypto </span><span style="color:#c0c5ce;">\
|
||||
</span><span style="color:#bf616a;"> -o</span><span style="color:#c0c5ce;"> server server.cpp
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#65737e;"># Windows (Developer Command Prompt)
|
||||
</span><span style="color:#8fa1b3;">cl</span><span style="color:#c0c5ce;"> /EHsc /std:c++17 /DCPPHTTPLIB_OPENSSL_SUPPORT server.cpp libssl.lib libcrypto.lib
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-style:italic;color:#969896;"># macOS (Homebrew)
|
||||
@@ -157,21 +159,21 @@
|
||||
</ul>
|
||||
<h2>動作確認</h2>
|
||||
<p>ちゃんと動くか確認してみましょう。<code>httplib::Client</code> にHTTPSのURLを渡してアクセスするだけのプログラムです。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">#define </span><span style="color:#d3d0c8;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">httplib.h</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;"><</span><span style="color:#99cc99;">iostream</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">int </span><span style="color:#6699cc;">main</span><span style="color:#d3d0c8;">() {
|
||||
</span><span style="color:#d3d0c8;"> httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://www.google.com</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << "</span><span style="color:#99cc99;">Status: </span><span style="color:#d3d0c8;">" << res-></span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;"><< std::endl;
|
||||
</span><span style="color:#d3d0c8;"> } </span><span style="color:#cc99cc;">else </span><span style="color:#d3d0c8;">{
|
||||
</span><span style="color:#d3d0c8;"> std::cout << "</span><span style="color:#99cc99;">Error: </span><span style="color:#d3d0c8;">" << </span><span style="color:#6699cc;">httplib::to_string</span><span style="color:#d3d0c8;">(res.</span><span style="color:#6699cc;">error</span><span style="color:#d3d0c8;">()) << std::endl;
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">#define </span><span style="color:#c0c5ce;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">httplib.h</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;"><</span><span style="color:#a3be8c;">iostream</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">int </span><span style="color:#8fa1b3;">main</span><span style="color:#c0c5ce;">() {
|
||||
</span><span style="color:#c0c5ce;"> httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://www.google.com</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << "</span><span style="color:#a3be8c;">Status: </span><span style="color:#c0c5ce;">" << res-></span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;"><< std::endl;
|
||||
</span><span style="color:#c0c5ce;"> } </span><span style="color:#b48ead;">else </span><span style="color:#c0c5ce;">{
|
||||
</span><span style="color:#c0c5ce;"> std::cout << "</span><span style="color:#a3be8c;">Error: </span><span style="color:#c0c5ce;">" << </span><span style="color:#8fa1b3;">httplib::to_string</span><span style="color:#c0c5ce;">(res.</span><span style="color:#8fa1b3;">error</span><span style="color:#c0c5ce;">()) << std::endl;
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">#define </span><span style="color:#323232;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
@@ -209,7 +211,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button class="sidebar-toggle" aria-label="Menu">☰</button>
|
||||
</div>
|
||||
@@ -105,22 +107,22 @@
|
||||
<p>前章でOpenSSLのセットアップが済んだので、さっそくHTTPSクライアントを使ってみましょう。2章で使った <code>httplib::Client</code> がそのまま使えます。コンストラクタに <code>https://</code> 付きのURLを渡すだけです。</p>
|
||||
<h2>GETリクエスト</h2>
|
||||
<p>実在するHTTPSサイトにアクセスしてみましょう。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">#define </span><span style="color:#d3d0c8;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">httplib.h</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;"><</span><span style="color:#99cc99;">iostream</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">int </span><span style="color:#6699cc;">main</span><span style="color:#d3d0c8;">() {
|
||||
</span><span style="color:#d3d0c8;"> httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://nghttp2.org</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// 200
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">substr</span><span style="color:#d3d0c8;">(</span><span style="color:#f99157;">0</span><span style="color:#d3d0c8;">, </span><span style="color:#f99157;">100</span><span style="color:#d3d0c8;">) << std::endl; </span><span style="color:#747369;">// HTMLの先頭部分
|
||||
</span><span style="color:#d3d0c8;"> } </span><span style="color:#cc99cc;">else </span><span style="color:#d3d0c8;">{
|
||||
</span><span style="color:#d3d0c8;"> std::cout << "</span><span style="color:#99cc99;">Error: </span><span style="color:#d3d0c8;">" << </span><span style="color:#6699cc;">httplib::to_string</span><span style="color:#d3d0c8;">(res.</span><span style="color:#6699cc;">error</span><span style="color:#d3d0c8;">()) << std::endl;
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">#define </span><span style="color:#c0c5ce;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">httplib.h</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;"><</span><span style="color:#a3be8c;">iostream</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">int </span><span style="color:#8fa1b3;">main</span><span style="color:#c0c5ce;">() {
|
||||
</span><span style="color:#c0c5ce;"> httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://nghttp2.org</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// 200
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">substr</span><span style="color:#c0c5ce;">(</span><span style="color:#d08770;">0</span><span style="color:#c0c5ce;">, </span><span style="color:#d08770;">100</span><span style="color:#c0c5ce;">) << std::endl; </span><span style="color:#65737e;">// HTMLの先頭部分
|
||||
</span><span style="color:#c0c5ce;"> } </span><span style="color:#b48ead;">else </span><span style="color:#c0c5ce;">{
|
||||
</span><span style="color:#c0c5ce;"> std::cout << "</span><span style="color:#a3be8c;">Error: </span><span style="color:#c0c5ce;">" << </span><span style="color:#8fa1b3;">httplib::to_string</span><span style="color:#c0c5ce;">(res.</span><span style="color:#8fa1b3;">error</span><span style="color:#c0c5ce;">()) << std::endl;
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">#define </span><span style="color:#323232;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
@@ -141,8 +143,8 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>2章では <code>httplib::Client cli("http://localhost:8080")</code> と書きましたよね。スキームを <code>https://</code> に変えるだけです。<code>Get()</code> や <code>Post()</code> など、2章で学んだAPIはすべてそのまま使えます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#d3d0c8;"> https://nghttp2.org/
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#c0c5ce;"> https://nghttp2.org/
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl https://nghttp2.org/
|
||||
@@ -150,8 +152,8 @@
|
||||
</div></div>
|
||||
<h2>ポートの指定</h2>
|
||||
<p>HTTPSのデフォルトポートは443です。別のポートを使いたい場合は、URLにポートを含めます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://localhost:8443</span><span style="color:#d3d0c8;">");
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://localhost:8443</span><span style="color:#c0c5ce;">");
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"https://localhost:8443"</span><span style="color:#323232;">);
|
||||
@@ -162,11 +164,11 @@
|
||||
<p>CA証明書は、macOSならKeychain、LinuxならシステムのCA証明書ストア、WindowsならWindowsの証明書ストアから自動で読み込みます。ほとんどの場合、追加の設定は要りません。</p>
|
||||
<h3>CA証明書ファイルの指定</h3>
|
||||
<p>環境によってはシステムのCA証明書が見つからないこともあります。そのときは <code>set_ca_cert_path()</code> でパスを直接指定してください。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://nghttp2.org</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_ca_cert_path</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/etc/ssl/certs/ca-certificates.crt</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">");
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://nghttp2.org</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_ca_cert_path</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/etc/ssl/certs/ca-certificates.crt</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">");
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"https://nghttp2.org"</span><span style="color:#323232;">);
|
||||
@@ -174,8 +176,8 @@
|
||||
</span><span style="color:#323232;">
|
||||
</span><span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> res </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> cli.Get(</span><span style="color:#183691;">"/"</span><span style="color:#323232;">);
|
||||
</span></pre>
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#f2777a;"> --cacert</span><span style="color:#d3d0c8;"> /etc/ssl/certs/ca-certificates.crt https://nghttp2.org/
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#bf616a;"> --cacert</span><span style="color:#c0c5ce;"> /etc/ssl/certs/ca-certificates.crt https://nghttp2.org/
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl --cacert /etc/ssl/certs/ca-certificates.crt https://nghttp2.org/
|
||||
@@ -183,11 +185,11 @@
|
||||
</div></div>
|
||||
<h3>証明書検証の無効化</h3>
|
||||
<p>開発中、自己署名証明書のサーバーに接続したいときは、検証を無効にできます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://localhost:8443</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">enable_server_certificate_verification</span><span style="color:#d3d0c8;">(</span><span style="color:#f99157;">false</span><span style="color:#d3d0c8;">);
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">");
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://localhost:8443</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">enable_server_certificate_verification</span><span style="color:#c0c5ce;">(</span><span style="color:#d08770;">false</span><span style="color:#c0c5ce;">);
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">");
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"https://localhost:8443"</span><span style="color:#323232;">);
|
||||
@@ -195,8 +197,8 @@
|
||||
</span><span style="color:#323232;">
|
||||
</span><span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> res </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> cli.Get(</span><span style="color:#183691;">"/"</span><span style="color:#323232;">);
|
||||
</span></pre>
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#f2777a;"> -k</span><span style="color:#d3d0c8;"> https://localhost:8443/
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#bf616a;"> -k</span><span style="color:#c0c5ce;"> https://localhost:8443/
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl -k https://localhost:8443/
|
||||
@@ -206,14 +208,14 @@
|
||||
<h2>リダイレクトの追跡</h2>
|
||||
<p>HTTPSサイトへのアクセスでは、リダイレクトに遭遇することがよくあります。たとえば <code>http://</code> から <code>https://</code> へ、あるいは <code>www</code> なしから <code>www</code> ありへ転送されるケースです。</p>
|
||||
<p>デフォルトではリダイレクトを追跡しません。リダイレクト先は <code>Location</code> ヘッダーで確認できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://nghttp2.org</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/httpbin/redirect/3</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// 302
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#6699cc;">get_header_value</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Location</span><span style="color:#d3d0c8;">") << std::endl;
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://nghttp2.org</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/httpbin/redirect/3</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// 302
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#8fa1b3;">get_header_value</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Location</span><span style="color:#c0c5ce;">") << std::endl;
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"https://nghttp2.org"</span><span style="color:#323232;">);
|
||||
@@ -224,22 +226,22 @@
|
||||
</span><span style="color:#323232;"> std::cout </span><span style="font-weight:bold;color:#a71d5d;"><<</span><span style="color:#323232;"> res->get_header_value(</span><span style="color:#183691;">"Location"</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;"><<</span><span style="color:#323232;"> std::endl;
|
||||
</span><span style="color:#323232;">}
|
||||
</span></pre>
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#d3d0c8;"> https://nghttp2.org/httpbin/redirect/3
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#c0c5ce;"> https://nghttp2.org/httpbin/redirect/3
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl https://nghttp2.org/httpbin/redirect/3
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p><code>set_follow_location(true)</code> を設定すると、リダイレクトを自動で追跡して、最終的なレスポンスを返してくれます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://nghttp2.org</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_follow_location</span><span style="color:#d3d0c8;">(</span><span style="color:#f99157;">true</span><span style="color:#d3d0c8;">);
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/httpbin/redirect/3</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// 200(最終的なレスポンス)
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://nghttp2.org</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_follow_location</span><span style="color:#c0c5ce;">(</span><span style="color:#d08770;">true</span><span style="color:#c0c5ce;">);
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/httpbin/redirect/3</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// 200(最終的なレスポンス)
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"https://nghttp2.org"</span><span style="color:#323232;">);
|
||||
@@ -250,8 +252,8 @@
|
||||
</span><span style="color:#323232;"> std::cout </span><span style="font-weight:bold;color:#a71d5d;"><<</span><span style="color:#323232;"> res->status </span><span style="font-weight:bold;color:#a71d5d;"><<</span><span style="color:#323232;"> std::endl; </span><span style="font-style:italic;color:#969896;">// 200(最終的なレスポンス)
|
||||
</span><span style="color:#323232;">}
|
||||
</span></pre>
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#f2777a;"> -L</span><span style="color:#d3d0c8;"> https://nghttp2.org/httpbin/redirect/3
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#bf616a;"> -L</span><span style="color:#c0c5ce;"> https://nghttp2.org/httpbin/redirect/3
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl -L https://nghttp2.org/httpbin/redirect/3
|
||||
@@ -267,7 +269,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button class="sidebar-toggle" aria-label="Menu">☰</button>
|
||||
</div>
|
||||
@@ -106,8 +108,8 @@
|
||||
<p>ただし、TLSサーバーにはサーバー証明書と秘密鍵が必要です。まずはそこから準備しましょう。</p>
|
||||
<h2>自己署名証明書の作成</h2>
|
||||
<p>開発やテスト用なら、自己署名証明書(いわゆるオレオレ証明書)で十分です。OpenSSLのコマンドでサクッと作れます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">openssl</span><span style="color:#d3d0c8;"> req</span><span style="color:#f2777a;"> -x509 -noenc -keyout</span><span style="color:#d3d0c8;"> key.pem</span><span style="color:#f2777a;"> -out</span><span style="color:#d3d0c8;"> cert.pem</span><span style="color:#f2777a;"> -subj</span><span style="color:#d3d0c8;"> /CN=localhost
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">openssl</span><span style="color:#c0c5ce;"> req</span><span style="color:#bf616a;"> -x509 -noenc -keyout</span><span style="color:#c0c5ce;"> key.pem</span><span style="color:#bf616a;"> -out</span><span style="color:#c0c5ce;"> cert.pem</span><span style="color:#bf616a;"> -subj</span><span style="color:#c0c5ce;"> /CN=localhost
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">openssl req -x509 -noenc -keyout key.pem -out cert.pem -subj /CN=localhost
|
||||
@@ -120,21 +122,21 @@
|
||||
</ul>
|
||||
<h2>最小のHTTPSサーバー</h2>
|
||||
<p>証明書ができたら、さっそくサーバーを書いてみましょう。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">#define </span><span style="color:#d3d0c8;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">httplib.h</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;"><</span><span style="color:#99cc99;">iostream</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">int </span><span style="color:#6699cc;">main</span><span style="color:#d3d0c8;">() {
|
||||
</span><span style="color:#d3d0c8;"> httplib::SSLServer </span><span style="color:#6699cc;">svr</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">cert.pem</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">key.pem</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Hello, HTTPS!</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> std::cout << "</span><span style="color:#99cc99;">Listening on https://localhost:8443</span><span style="color:#d3d0c8;">" << std::endl;
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">listen</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">0.0.0.0</span><span style="color:#d3d0c8;">", </span><span style="color:#f99157;">8443</span><span style="color:#d3d0c8;">);
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">#define </span><span style="color:#c0c5ce;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">httplib.h</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;"><</span><span style="color:#a3be8c;">iostream</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">int </span><span style="color:#8fa1b3;">main</span><span style="color:#c0c5ce;">() {
|
||||
</span><span style="color:#c0c5ce;"> httplib::SSLServer </span><span style="color:#8fa1b3;">svr</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">cert.pem</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">key.pem</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Hello, HTTPS!</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> std::cout << "</span><span style="color:#a3be8c;">Listening on https://localhost:8443</span><span style="color:#c0c5ce;">" << std::endl;
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">listen</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">0.0.0.0</span><span style="color:#c0c5ce;">", </span><span style="color:#d08770;">8443</span><span style="color:#c0c5ce;">);
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">#define </span><span style="color:#323232;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
@@ -157,9 +159,9 @@
|
||||
<p>コンパイルして起動しましょう。</p>
|
||||
<h2>動作確認</h2>
|
||||
<p>サーバーが起動したら、<code>curl</code> でアクセスしてみましょう。自己署名証明書なので、<code>-k</code> オプションで証明書検証をスキップします。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#6699cc;">curl</span><span style="color:#f2777a;"> -k</span><span style="color:#d3d0c8;"> https://localhost:8443/
|
||||
</span><span style="color:#747369;"># Hello, HTTPS!
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#8fa1b3;">curl</span><span style="color:#bf616a;"> -k</span><span style="color:#c0c5ce;"> https://localhost:8443/
|
||||
</span><span style="color:#65737e;"># Hello, HTTPS!
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">curl -k https://localhost:8443/
|
||||
@@ -171,20 +173,20 @@
|
||||
<p>前章の <code>httplib::Client</code> で接続してみましょう。自己署名証明書のサーバーに接続するには、2つの方法があります。</p>
|
||||
<h3>方法1: 証明書検証を無効にする</h3>
|
||||
<p>開発時の手軽な方法です。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">#define </span><span style="color:#d3d0c8;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">httplib.h</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;"><</span><span style="color:#99cc99;">iostream</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">int </span><span style="color:#6699cc;">main</span><span style="color:#d3d0c8;">() {
|
||||
</span><span style="color:#d3d0c8;"> httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://localhost:8443</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> cli.</span><span style="color:#6699cc;">enable_server_certificate_verification</span><span style="color:#d3d0c8;">(</span><span style="color:#f99157;">false</span><span style="color:#d3d0c8;">);
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// Hello, HTTPS!
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">#define </span><span style="color:#c0c5ce;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">httplib.h</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;"><</span><span style="color:#a3be8c;">iostream</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">int </span><span style="color:#8fa1b3;">main</span><span style="color:#c0c5ce;">() {
|
||||
</span><span style="color:#c0c5ce;"> httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://localhost:8443</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> cli.</span><span style="color:#8fa1b3;">enable_server_certificate_verification</span><span style="color:#c0c5ce;">(</span><span style="color:#d08770;">false</span><span style="color:#c0c5ce;">);
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// Hello, HTTPS!
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">#define </span><span style="color:#323232;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
@@ -204,20 +206,20 @@
|
||||
</div></div>
|
||||
<h3>方法2: 自己署名証明書をCA証明書として指定する</h3>
|
||||
<p>こちらのほうが安全です。<code>cert.pem</code> をCA証明書として信頼するよう指定します。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">#define </span><span style="color:#d3d0c8;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">httplib.h</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;"><</span><span style="color:#99cc99;">iostream</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">int </span><span style="color:#6699cc;">main</span><span style="color:#d3d0c8;">() {
|
||||
</span><span style="color:#d3d0c8;"> httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://localhost:8443</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> cli.</span><span style="color:#6699cc;">set_ca_cert_path</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">cert.pem</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << res-></span><span style="color:#f2777a;">body </span><span style="color:#d3d0c8;"><< std::endl; </span><span style="color:#747369;">// Hello, HTTPS!
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">#define </span><span style="color:#c0c5ce;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">httplib.h</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;"><</span><span style="color:#a3be8c;">iostream</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">int </span><span style="color:#8fa1b3;">main</span><span style="color:#c0c5ce;">() {
|
||||
</span><span style="color:#c0c5ce;"> httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://localhost:8443</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> cli.</span><span style="color:#8fa1b3;">set_ca_cert_path</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">cert.pem</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << res-></span><span style="color:#bf616a;">body </span><span style="color:#c0c5ce;"><< std::endl; </span><span style="color:#65737e;">// Hello, HTTPS!
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">#define </span><span style="color:#323232;">CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
@@ -256,7 +258,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button class="sidebar-toggle" aria-label="Menu">☰</button>
|
||||
</div>
|
||||
@@ -106,23 +108,23 @@
|
||||
<p>さっそく、エコーサーバーとクライアントを作ってみましょう。</p>
|
||||
<h2>エコーサーバー</h2>
|
||||
<p>受け取ったメッセージをそのまま返すエコーサーバーです。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">httplib.h</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;"><</span><span style="color:#99cc99;">iostream</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">int </span><span style="color:#6699cc;">main</span><span style="color:#d3d0c8;">() {
|
||||
</span><span style="color:#d3d0c8;"> httplib::Server svr;
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">WebSocket</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/ws</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const</span><span style="color:#d3d0c8;"> httplib::Request &, httplib::ws::WebSocket &ws) {
|
||||
</span><span style="color:#d3d0c8;"> std::string msg;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">while </span><span style="color:#d3d0c8;">(ws.</span><span style="color:#6699cc;">read</span><span style="color:#d3d0c8;">(msg)) {
|
||||
</span><span style="color:#d3d0c8;"> ws.</span><span style="color:#6699cc;">send</span><span style="color:#d3d0c8;">(msg); </span><span style="color:#747369;">// 受け取ったメッセージをそのまま返す
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> std::cout << "</span><span style="color:#99cc99;">Listening on port 8080...</span><span style="color:#d3d0c8;">" << std::endl;
|
||||
</span><span style="color:#d3d0c8;"> svr.</span><span style="color:#6699cc;">listen</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">0.0.0.0</span><span style="color:#d3d0c8;">", </span><span style="color:#f99157;">8080</span><span style="color:#d3d0c8;">);
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">httplib.h</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;"><</span><span style="color:#a3be8c;">iostream</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">int </span><span style="color:#8fa1b3;">main</span><span style="color:#c0c5ce;">() {
|
||||
</span><span style="color:#c0c5ce;"> httplib::Server svr;
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">WebSocket</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/ws</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const</span><span style="color:#c0c5ce;"> httplib::Request &, httplib::ws::WebSocket &ws) {
|
||||
</span><span style="color:#c0c5ce;"> std::string msg;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">while </span><span style="color:#c0c5ce;">(ws.</span><span style="color:#8fa1b3;">read</span><span style="color:#c0c5ce;">(msg)) {
|
||||
</span><span style="color:#c0c5ce;"> ws.</span><span style="color:#8fa1b3;">send</span><span style="color:#c0c5ce;">(msg); </span><span style="color:#65737e;">// 受け取ったメッセージをそのまま返す
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> std::cout << "</span><span style="color:#a3be8c;">Listening on port 8080...</span><span style="color:#c0c5ce;">" << std::endl;
|
||||
</span><span style="color:#c0c5ce;"> svr.</span><span style="color:#8fa1b3;">listen</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">0.0.0.0</span><span style="color:#c0c5ce;">", </span><span style="color:#d08770;">8080</span><span style="color:#c0c5ce;">);
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">#include </span><span style="color:#183691;">"httplib.h"
|
||||
@@ -147,29 +149,29 @@
|
||||
<p>ハンドラーの中では、<code>ws.read(msg)</code> でメッセージを待ちます。接続が閉じられると <code>read()</code> が <code>false</code> を返すので、ループを抜けます。<code>ws.send(msg)</code> でメッセージを送り返します。</p>
|
||||
<h2>クライアントからの接続</h2>
|
||||
<p><code>httplib::ws::WebSocketClient</code> を使ってサーバーに接続してみましょう。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;">"</span><span style="color:#99cc99;">httplib.h</span><span style="color:#d3d0c8;">"
|
||||
</span><span style="color:#cc99cc;">#include </span><span style="color:#d3d0c8;"><</span><span style="color:#99cc99;">iostream</span><span style="color:#d3d0c8;">>
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">int </span><span style="color:#6699cc;">main</span><span style="color:#d3d0c8;">() {
|
||||
</span><span style="color:#d3d0c8;"> httplib::ws::WebSocketClient </span><span style="color:#6699cc;">client</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">ws://localhost:8080/ws</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(!client.</span><span style="color:#6699cc;">connect</span><span style="color:#d3d0c8;">()) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << "</span><span style="color:#99cc99;">Connection failed</span><span style="color:#d3d0c8;">" << std::endl;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">return </span><span style="color:#f99157;">1</span><span style="color:#d3d0c8;">;
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// メッセージを送信
|
||||
</span><span style="color:#d3d0c8;"> client.</span><span style="color:#6699cc;">send</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Hello, WebSocket!</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// サーバーからの応答を受信
|
||||
</span><span style="color:#d3d0c8;"> std::string msg;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(client.</span><span style="color:#6699cc;">read</span><span style="color:#d3d0c8;">(msg)) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << msg << std::endl; </span><span style="color:#747369;">// Hello, WebSocket!
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> client.</span><span style="color:#6699cc;">close</span><span style="color:#d3d0c8;">();
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;">"</span><span style="color:#a3be8c;">httplib.h</span><span style="color:#c0c5ce;">"
|
||||
</span><span style="color:#b48ead;">#include </span><span style="color:#c0c5ce;"><</span><span style="color:#a3be8c;">iostream</span><span style="color:#c0c5ce;">>
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">int </span><span style="color:#8fa1b3;">main</span><span style="color:#c0c5ce;">() {
|
||||
</span><span style="color:#c0c5ce;"> httplib::ws::WebSocketClient </span><span style="color:#8fa1b3;">client</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">ws://localhost:8080/ws</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(!client.</span><span style="color:#8fa1b3;">connect</span><span style="color:#c0c5ce;">()) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << "</span><span style="color:#a3be8c;">Connection failed</span><span style="color:#c0c5ce;">" << std::endl;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">return </span><span style="color:#d08770;">1</span><span style="color:#c0c5ce;">;
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// メッセージを送信
|
||||
</span><span style="color:#c0c5ce;"> client.</span><span style="color:#8fa1b3;">send</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Hello, WebSocket!</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// サーバーからの応答を受信
|
||||
</span><span style="color:#c0c5ce;"> std::string msg;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(client.</span><span style="color:#8fa1b3;">read</span><span style="color:#c0c5ce;">(msg)) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << msg << std::endl; </span><span style="color:#65737e;">// Hello, WebSocket!
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> client.</span><span style="color:#8fa1b3;">close</span><span style="color:#c0c5ce;">();
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-weight:bold;color:#a71d5d;">#include </span><span style="color:#183691;">"httplib.h"
|
||||
@@ -199,18 +201,18 @@
|
||||
<p>コンストラクタには <code>ws://host:port/path</code> 形式のURLを渡します。<code>connect()</code> で接続を開始し、<code>send()</code> と <code>read()</code> でメッセージをやり取りします。</p>
|
||||
<h2>テキストとバイナリ</h2>
|
||||
<p>WebSocketにはテキストとバイナリの2種類のメッセージがあります。<code>read()</code> の戻り値で区別できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">WebSocket</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/ws</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const</span><span style="color:#d3d0c8;"> httplib::Request &, httplib::ws::WebSocket &ws) {
|
||||
</span><span style="color:#d3d0c8;"> std::string msg;
|
||||
</span><span style="color:#d3d0c8;"> httplib::ws::ReadResult ret;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">while </span><span style="color:#d3d0c8;">((ret = ws.</span><span style="color:#6699cc;">read</span><span style="color:#d3d0c8;">(msg))) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(ret == httplib::ws::Binary) {
|
||||
</span><span style="color:#d3d0c8;"> ws.</span><span style="color:#6699cc;">send</span><span style="color:#d3d0c8;">(msg.</span><span style="color:#6699cc;">data</span><span style="color:#d3d0c8;">(), msg.</span><span style="color:#6699cc;">size</span><span style="color:#d3d0c8;">()); </span><span style="color:#747369;">// バイナリとして送信
|
||||
</span><span style="color:#d3d0c8;"> } </span><span style="color:#cc99cc;">else </span><span style="color:#d3d0c8;">{
|
||||
</span><span style="color:#d3d0c8;"> ws.</span><span style="color:#6699cc;">send</span><span style="color:#d3d0c8;">(msg); </span><span style="color:#747369;">// テキストとして送信
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">WebSocket</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/ws</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const</span><span style="color:#c0c5ce;"> httplib::Request &, httplib::ws::WebSocket &ws) {
|
||||
</span><span style="color:#c0c5ce;"> std::string msg;
|
||||
</span><span style="color:#c0c5ce;"> httplib::ws::ReadResult ret;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">while </span><span style="color:#c0c5ce;">((ret = ws.</span><span style="color:#8fa1b3;">read</span><span style="color:#c0c5ce;">(msg))) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(ret == httplib::ws::Binary) {
|
||||
</span><span style="color:#c0c5ce;"> ws.</span><span style="color:#8fa1b3;">send</span><span style="color:#c0c5ce;">(msg.</span><span style="color:#8fa1b3;">data</span><span style="color:#c0c5ce;">(), msg.</span><span style="color:#8fa1b3;">size</span><span style="color:#c0c5ce;">()); </span><span style="color:#65737e;">// バイナリとして送信
|
||||
</span><span style="color:#c0c5ce;"> } </span><span style="color:#b48ead;">else </span><span style="color:#c0c5ce;">{
|
||||
</span><span style="color:#c0c5ce;"> ws.</span><span style="color:#8fa1b3;">send</span><span style="color:#c0c5ce;">(msg); </span><span style="color:#65737e;">// テキストとして送信
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.WebSocket(</span><span style="color:#183691;">"/ws"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const</span><span style="color:#323232;"> httplib::Request </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">, httplib::ws::WebSocket </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">ws) {
|
||||
@@ -233,19 +235,19 @@
|
||||
<p>クライアント側も同じAPIです。</p>
|
||||
<h2>リクエスト情報へのアクセス</h2>
|
||||
<p>ハンドラーの第1引数 <code>req</code> から、ハンドシェイク時のHTTPリクエスト情報を読み取れます。認証トークンの確認などに便利です。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">WebSocket</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/ws</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const</span><span style="color:#d3d0c8;"> httplib::Request &req, httplib::ws::WebSocket &ws) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> token = req.</span><span style="color:#6699cc;">get_header_value</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Authorization</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(token.</span><span style="color:#6699cc;">empty</span><span style="color:#d3d0c8;">()) {
|
||||
</span><span style="color:#d3d0c8;"> ws.</span><span style="color:#6699cc;">close</span><span style="color:#d3d0c8;">(httplib::ws::CloseStatus::PolicyViolation, "</span><span style="color:#99cc99;">unauthorized</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">return</span><span style="color:#d3d0c8;">;
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;"> std::string msg;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">while </span><span style="color:#d3d0c8;">(ws.</span><span style="color:#6699cc;">read</span><span style="color:#d3d0c8;">(msg)) {
|
||||
</span><span style="color:#d3d0c8;"> ws.</span><span style="color:#6699cc;">send</span><span style="color:#d3d0c8;">(msg);
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">WebSocket</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/ws</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const</span><span style="color:#c0c5ce;"> httplib::Request &req, httplib::ws::WebSocket &ws) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> token = req.</span><span style="color:#8fa1b3;">get_header_value</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Authorization</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(token.</span><span style="color:#8fa1b3;">empty</span><span style="color:#c0c5ce;">()) {
|
||||
</span><span style="color:#c0c5ce;"> ws.</span><span style="color:#8fa1b3;">close</span><span style="color:#c0c5ce;">(httplib::ws::CloseStatus::PolicyViolation, "</span><span style="color:#a3be8c;">unauthorized</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">return</span><span style="color:#c0c5ce;">;
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;"> std::string msg;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">while </span><span style="color:#c0c5ce;">(ws.</span><span style="color:#8fa1b3;">read</span><span style="color:#c0c5ce;">(msg)) {
|
||||
</span><span style="color:#c0c5ce;"> ws.</span><span style="color:#8fa1b3;">send</span><span style="color:#c0c5ce;">(msg);
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.WebSocket(</span><span style="color:#183691;">"/ws"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const</span><span style="color:#323232;"> httplib::Request </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">req, httplib::ws::WebSocket </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">ws) {
|
||||
@@ -264,17 +266,17 @@
|
||||
</div></div>
|
||||
<h2>WSSで使う</h2>
|
||||
<p>HTTPS上のWebSocket(WSS)にも対応しています。サーバー側は <code>httplib::SSLServer</code> にWebSocketハンドラーを登録するだけです。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::SSLServer </span><span style="color:#6699cc;">svr</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">cert.pem</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">key.pem</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">WebSocket</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/ws</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const</span><span style="color:#d3d0c8;"> httplib::Request &, httplib::ws::WebSocket &ws) {
|
||||
</span><span style="color:#d3d0c8;"> std::string msg;
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">while </span><span style="color:#d3d0c8;">(ws.</span><span style="color:#6699cc;">read</span><span style="color:#d3d0c8;">(msg)) {
|
||||
</span><span style="color:#d3d0c8;"> ws.</span><span style="color:#6699cc;">send</span><span style="color:#d3d0c8;">(msg);
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">listen</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">0.0.0.0</span><span style="color:#d3d0c8;">", </span><span style="color:#f99157;">8443</span><span style="color:#d3d0c8;">);
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::SSLServer </span><span style="color:#8fa1b3;">svr</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">cert.pem</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">key.pem</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">WebSocket</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/ws</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const</span><span style="color:#c0c5ce;"> httplib::Request &, httplib::ws::WebSocket &ws) {
|
||||
</span><span style="color:#c0c5ce;"> std::string msg;
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">while </span><span style="color:#c0c5ce;">(ws.</span><span style="color:#8fa1b3;">read</span><span style="color:#c0c5ce;">(msg)) {
|
||||
</span><span style="color:#c0c5ce;"> ws.</span><span style="color:#8fa1b3;">send</span><span style="color:#c0c5ce;">(msg);
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">listen</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">0.0.0.0</span><span style="color:#c0c5ce;">", </span><span style="color:#d08770;">8443</span><span style="color:#c0c5ce;">);
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::SSLServer </span><span style="font-weight:bold;color:#795da3;">svr</span><span style="color:#323232;">(</span><span style="color:#183691;">"cert.pem"</span><span style="color:#323232;">, </span><span style="color:#183691;">"key.pem"</span><span style="color:#323232;">);
|
||||
@@ -290,8 +292,8 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>クライアント側は <code>wss://</code> スキームを使います。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::ws::WebSocketClient </span><span style="color:#6699cc;">client</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">wss://localhost:8443/ws</span><span style="color:#d3d0c8;">");
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::ws::WebSocketClient </span><span style="color:#8fa1b3;">client</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">wss://localhost:8443/ws</span><span style="color:#c0c5ce;">");
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::ws::WebSocketClient </span><span style="font-weight:bold;color:#795da3;">client</span><span style="color:#323232;">(</span><span style="color:#183691;">"wss://localhost:8443/ws"</span><span style="color:#323232;">);
|
||||
@@ -308,7 +310,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button class="sidebar-toggle" aria-label="Menu">☰</button>
|
||||
</div>
|
||||
@@ -105,16 +107,16 @@
|
||||
<p>Tourお疲れさまでした! cpp-httplibの基本はひと通り押さえましたね。でも、まだまだ便利な機能があります。Tourで取り上げなかった機能をカテゴリー別に紹介します。</p>
|
||||
<h2>Streaming API</h2>
|
||||
<p>LLMのストリーミング応答や大きなファイルのダウンロードでは、レスポンス全体をメモリに載せたくないですよね。<code>stream::Get()</code> を使えば、データをチャンクごとに処理できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">http://localhost:11434</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> result = </span><span style="color:#6699cc;">httplib::stream::Get</span><span style="color:#d3d0c8;">(cli, "</span><span style="color:#99cc99;">/api/generate</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">if </span><span style="color:#d3d0c8;">(result) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">while </span><span style="color:#d3d0c8;">(result.</span><span style="color:#6699cc;">next</span><span style="color:#d3d0c8;">()) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout.</span><span style="color:#6699cc;">write</span><span style="color:#d3d0c8;">(result.</span><span style="color:#6699cc;">data</span><span style="color:#d3d0c8;">(), result.</span><span style="color:#6699cc;">size</span><span style="color:#d3d0c8;">());
|
||||
</span><span style="color:#d3d0c8;"> }
|
||||
</span><span style="color:#d3d0c8;">}
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">http://localhost:11434</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> result = </span><span style="color:#8fa1b3;">httplib::stream::Get</span><span style="color:#c0c5ce;">(cli, "</span><span style="color:#a3be8c;">/api/generate</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">if </span><span style="color:#c0c5ce;">(result) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">while </span><span style="color:#c0c5ce;">(result.</span><span style="color:#8fa1b3;">next</span><span style="color:#c0c5ce;">()) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout.</span><span style="color:#8fa1b3;">write</span><span style="color:#c0c5ce;">(result.</span><span style="color:#8fa1b3;">data</span><span style="color:#c0c5ce;">(), result.</span><span style="color:#8fa1b3;">size</span><span style="color:#c0c5ce;">());
|
||||
</span><span style="color:#c0c5ce;"> }
|
||||
</span><span style="color:#c0c5ce;">}
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"http://localhost:11434"</span><span style="color:#323232;">);
|
||||
@@ -129,13 +131,13 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p><code>Get()</code> に <code>content_receiver</code> コールバックを渡す方法もあります。こちらはKeep-Aliveと併用できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">http://localhost:8080</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/stream</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const char </span><span style="color:#d3d0c8;">*data, size_t len) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout.</span><span style="color:#6699cc;">write</span><span style="color:#d3d0c8;">(data, len);
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">return </span><span style="color:#f99157;">true</span><span style="color:#d3d0c8;">;
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">http://localhost:8080</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/stream</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const char </span><span style="color:#c0c5ce;">*data, size_t len) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout.</span><span style="color:#8fa1b3;">write</span><span style="color:#c0c5ce;">(data, len);
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">return </span><span style="color:#d08770;">true</span><span style="color:#c0c5ce;">;
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"http://localhost:8080"</span><span style="color:#323232;">);
|
||||
@@ -147,25 +149,25 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>サーバー側には <code>set_content_provider()</code> と <code>set_chunked_content_provider()</code> があります。サイズがわかっているなら前者、不明なら後者を使ってください。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#747369;">// サイズ指定あり(Content-Length が設定される)
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/file</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> size = </span><span style="color:#6699cc;">get_file_size</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">large.bin</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content_provider</span><span style="color:#d3d0c8;">(size, "</span><span style="color:#99cc99;">application/octet-stream</span><span style="color:#d3d0c8;">",
|
||||
</span><span style="color:#d3d0c8;"> [](size_t offset, size_t length, httplib::DataSink &sink) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// offset から length バイト分を送る
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">return </span><span style="color:#f99157;">true</span><span style="color:#d3d0c8;">;
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#747369;">// サイズ不明(Chunked Transfer Encoding)
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/stream</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_chunked_content_provider</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">",
|
||||
</span><span style="color:#d3d0c8;"> [](size_t offset, httplib::DataSink &sink) {
|
||||
</span><span style="color:#d3d0c8;"> sink.</span><span style="color:#6699cc;">write</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">chunk</span><span style="color:#66cccc;">\n</span><span style="color:#d3d0c8;">", </span><span style="color:#f99157;">6</span><span style="color:#d3d0c8;">);
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">return </span><span style="color:#f99157;">true</span><span style="color:#d3d0c8;">; </span><span style="color:#747369;">// falseを返すと終了
|
||||
</span><span style="color:#d3d0c8;"> });
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#65737e;">// サイズ指定あり(Content-Length が設定される)
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/file</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> size = </span><span style="color:#8fa1b3;">get_file_size</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">large.bin</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content_provider</span><span style="color:#c0c5ce;">(size, "</span><span style="color:#a3be8c;">application/octet-stream</span><span style="color:#c0c5ce;">",
|
||||
</span><span style="color:#c0c5ce;"> [](size_t offset, size_t length, httplib::DataSink &sink) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// offset から length バイト分を送る
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">return </span><span style="color:#d08770;">true</span><span style="color:#c0c5ce;">;
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#65737e;">// サイズ不明(Chunked Transfer Encoding)
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/stream</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_chunked_content_provider</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">",
|
||||
</span><span style="color:#c0c5ce;"> [](size_t offset, httplib::DataSink &sink) {
|
||||
</span><span style="color:#c0c5ce;"> sink.</span><span style="color:#8fa1b3;">write</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">chunk</span><span style="color:#96b5b4;">\n</span><span style="color:#c0c5ce;">", </span><span style="color:#d08770;">6</span><span style="color:#c0c5ce;">);
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">return </span><span style="color:#d08770;">true</span><span style="color:#c0c5ce;">; </span><span style="color:#65737e;">// falseを返すと終了
|
||||
</span><span style="color:#c0c5ce;"> });
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-style:italic;color:#969896;">// サイズ指定あり(Content-Length が設定される)
|
||||
@@ -189,12 +191,12 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>大きなファイルのアップロードには <code>make_file_provider()</code> が便利です。ファイルを全部メモリに読み込まず、ストリーミングで送れます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">http://localhost:8080</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Post</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/upload</span><span style="color:#d3d0c8;">", {}, {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#6699cc;">httplib::make_file_provider</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">file</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">/path/to/large-file.zip</span><span style="color:#d3d0c8;">")
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">http://localhost:8080</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Post</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/upload</span><span style="color:#c0c5ce;">", {}, {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#8fa1b3;">httplib::make_file_provider</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">file</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">/path/to/large-file.zip</span><span style="color:#c0c5ce;">")
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"http://localhost:8080"</span><span style="color:#323232;">);
|
||||
@@ -206,15 +208,15 @@
|
||||
</div></div>
|
||||
<h2>Server-Sent Events (SSE)</h2>
|
||||
<p>SSEクライアントも用意しています。自動再接続や <code>Last-Event-ID</code> による再開にも対応しています。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">http://localhost:8080</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">httplib::sse::SSEClient </span><span style="color:#6699cc;">sse</span><span style="color:#d3d0c8;">(</span><span style="color:#f2777a;">cli</span><span style="color:#d3d0c8;">, "</span><span style="color:#99cc99;">/events</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;">sse.</span><span style="color:#6699cc;">on_message</span><span style="color:#d3d0c8;">([](</span><span style="color:#cc99cc;">const</span><span style="color:#d3d0c8;"> httplib::sse::SSEMessage &msg) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << msg.</span><span style="color:#f2777a;">event </span><span style="color:#d3d0c8;"><< "</span><span style="color:#99cc99;">: </span><span style="color:#d3d0c8;">" << msg.</span><span style="color:#f2777a;">data </span><span style="color:#d3d0c8;"><< std::endl;
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;">sse.</span><span style="color:#6699cc;">start</span><span style="color:#d3d0c8;">(); </span><span style="color:#747369;">// ブロッキング、自動再接続あり
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">http://localhost:8080</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">httplib::sse::SSEClient </span><span style="color:#8fa1b3;">sse</span><span style="color:#c0c5ce;">(</span><span style="color:#bf616a;">cli</span><span style="color:#c0c5ce;">, "</span><span style="color:#a3be8c;">/events</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;">sse.</span><span style="color:#8fa1b3;">on_message</span><span style="color:#c0c5ce;">([](</span><span style="color:#b48ead;">const</span><span style="color:#c0c5ce;"> httplib::sse::SSEMessage &msg) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << msg.</span><span style="color:#bf616a;">event </span><span style="color:#c0c5ce;"><< "</span><span style="color:#a3be8c;">: </span><span style="color:#c0c5ce;">" << msg.</span><span style="color:#bf616a;">data </span><span style="color:#c0c5ce;"><< std::endl;
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;">sse.</span><span style="color:#8fa1b3;">start</span><span style="color:#c0c5ce;">(); </span><span style="color:#65737e;">// ブロッキング、自動再接続あり
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"http://localhost:8080"</span><span style="color:#323232;">);
|
||||
@@ -228,10 +230,10 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>イベントタイプごとにハンドラーを分けることもできますよ。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">sse.</span><span style="color:#6699cc;">on_event</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">update</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const</span><span style="color:#d3d0c8;"> httplib::sse::SSEMessage &msg) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// "update" イベントだけ処理
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">sse.</span><span style="color:#8fa1b3;">on_event</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">update</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const</span><span style="color:#c0c5ce;"> httplib::sse::SSEMessage &msg) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// "update" イベントだけ処理
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">sse.on_event(</span><span style="color:#183691;">"update"</span><span style="color:#323232;">, [](</span><span style="font-weight:bold;color:#a71d5d;">const</span><span style="color:#323232;"> httplib::sse::SSEMessage </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">msg) {
|
||||
@@ -241,10 +243,10 @@
|
||||
</div></div>
|
||||
<h2>認証</h2>
|
||||
<p>クライアントにはBasic認証、Bearer Token認証、Digest認証のヘルパーを用意しています。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://api.example.com</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_basic_auth</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">user</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">password</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_bearer_token_auth</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">my-token</span><span style="color:#d3d0c8;">");
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://api.example.com</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_basic_auth</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">user</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">password</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_bearer_token_auth</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">my-token</span><span style="color:#c0c5ce;">");
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"https://api.example.com"</span><span style="color:#323232;">);
|
||||
@@ -259,10 +261,10 @@
|
||||
<tr><td>Brotli</td><td><code>CPPHTTPLIB_BROTLI_SUPPORT</code></td></tr>
|
||||
<tr><td>Zstandard</td><td><code>CPPHTTPLIB_ZSTD_SUPPORT</code></td></tr>
|
||||
</tbody></table>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://example.com</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_compress</span><span style="color:#d3d0c8;">(</span><span style="color:#f99157;">true</span><span style="color:#d3d0c8;">); </span><span style="color:#747369;">// リクエストボディを圧縮
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_decompress</span><span style="color:#d3d0c8;">(</span><span style="color:#f99157;">true</span><span style="color:#d3d0c8;">); </span><span style="color:#747369;">// レスポンスボディを展開
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://example.com</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_compress</span><span style="color:#c0c5ce;">(</span><span style="color:#d08770;">true</span><span style="color:#c0c5ce;">); </span><span style="color:#65737e;">// リクエストボディを圧縮
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_decompress</span><span style="color:#c0c5ce;">(</span><span style="color:#d08770;">true</span><span style="color:#c0c5ce;">); </span><span style="color:#65737e;">// レスポンスボディを展開
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"https://example.com"</span><span style="color:#323232;">);
|
||||
@@ -272,10 +274,10 @@
|
||||
</div></div>
|
||||
<h2>プロキシ</h2>
|
||||
<p>HTTPプロキシ経由で接続できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://example.com</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_proxy</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">proxy.example.com</span><span style="color:#d3d0c8;">", </span><span style="color:#f99157;">8080</span><span style="color:#d3d0c8;">);
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_proxy_basic_auth</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">user</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">password</span><span style="color:#d3d0c8;">");
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://example.com</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_proxy</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">proxy.example.com</span><span style="color:#c0c5ce;">", </span><span style="color:#d08770;">8080</span><span style="color:#c0c5ce;">);
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_proxy_basic_auth</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">user</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">password</span><span style="color:#c0c5ce;">");
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"https://example.com"</span><span style="color:#323232;">);
|
||||
@@ -285,11 +287,11 @@
|
||||
</div></div>
|
||||
<h2>タイムアウト</h2>
|
||||
<p>接続・読み取り・書き込みのタイムアウトを個別に設定できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://example.com</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_connection_timeout</span><span style="color:#d3d0c8;">(</span><span style="color:#f99157;">5</span><span style="color:#d3d0c8;">, </span><span style="color:#f99157;">0</span><span style="color:#d3d0c8;">); </span><span style="color:#747369;">// 5秒
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_read_timeout</span><span style="color:#d3d0c8;">(</span><span style="color:#f99157;">10</span><span style="color:#d3d0c8;">, </span><span style="color:#f99157;">0</span><span style="color:#d3d0c8;">); </span><span style="color:#747369;">// 10秒
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_write_timeout</span><span style="color:#d3d0c8;">(</span><span style="color:#f99157;">10</span><span style="color:#d3d0c8;">, </span><span style="color:#f99157;">0</span><span style="color:#d3d0c8;">); </span><span style="color:#747369;">// 10秒
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://example.com</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_connection_timeout</span><span style="color:#c0c5ce;">(</span><span style="color:#d08770;">5</span><span style="color:#c0c5ce;">, </span><span style="color:#d08770;">0</span><span style="color:#c0c5ce;">); </span><span style="color:#65737e;">// 5秒
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_read_timeout</span><span style="color:#c0c5ce;">(</span><span style="color:#d08770;">10</span><span style="color:#c0c5ce;">, </span><span style="color:#d08770;">0</span><span style="color:#c0c5ce;">); </span><span style="color:#65737e;">// 10秒
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_write_timeout</span><span style="color:#c0c5ce;">(</span><span style="color:#d08770;">10</span><span style="color:#c0c5ce;">, </span><span style="color:#d08770;">0</span><span style="color:#c0c5ce;">); </span><span style="color:#65737e;">// 10秒
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"https://example.com"</span><span style="color:#323232;">);
|
||||
@@ -300,9 +302,9 @@
|
||||
</div></div>
|
||||
<h2>Keep-Alive</h2>
|
||||
<p>同じサーバーに何度もリクエストするなら、Keep-Aliveを有効にしましょう。TCP接続を再利用するので効率的です。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">https://example.com</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_keep_alive</span><span style="color:#d3d0c8;">(</span><span style="color:#f99157;">true</span><span style="color:#d3d0c8;">);
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">https://example.com</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_keep_alive</span><span style="color:#c0c5ce;">(</span><span style="color:#d08770;">true</span><span style="color:#c0c5ce;">);
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">httplib::Client </span><span style="font-weight:bold;color:#795da3;">cli</span><span style="color:#323232;">(</span><span style="color:#183691;">"https://example.com"</span><span style="color:#323232;">);
|
||||
@@ -311,16 +313,16 @@
|
||||
</div></div>
|
||||
<h2>サーバーのミドルウェア</h2>
|
||||
<p>リクエスト処理の前後にフックを挟めます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_pre_routing_handler</span><span style="color:#d3d0c8;">([](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// すべてのリクエストの前に実行される
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">return</span><span style="color:#d3d0c8;"> httplib::Server::HandlerResponse::Unhandled; </span><span style="color:#747369;">// 通常のルーティングに進む
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_post_routing_handler</span><span style="color:#d3d0c8;">([](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#747369;">// レスポンスが返された後に実行される
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_header</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">X-Server</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">cpp-httplib</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_pre_routing_handler</span><span style="color:#c0c5ce;">([](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// すべてのリクエストの前に実行される
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">return</span><span style="color:#c0c5ce;"> httplib::Server::HandlerResponse::Unhandled; </span><span style="color:#65737e;">// 通常のルーティングに進む
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_post_routing_handler</span><span style="color:#c0c5ce;">([](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#65737e;">// レスポンスが返された後に実行される
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_header</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">X-Server</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">cpp-httplib</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.set_pre_routing_handler([](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -335,16 +337,16 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p><code>req.user_data</code> を使うと、ミドルウェアからハンドラーにデータを渡せます。認証トークンのデコード結果を共有するときに便利です。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_pre_routing_handler</span><span style="color:#d3d0c8;">([](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> req.</span><span style="color:#f2777a;">user_data</span><span style="color:#d3d0c8;">["</span><span style="color:#99cc99;">auth_user</span><span style="color:#d3d0c8;">"] = </span><span style="color:#6699cc;">std::string</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">alice</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">return</span><span style="color:#d3d0c8;"> httplib::Server::HandlerResponse::Unhandled;
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/me</span><span style="color:#d3d0c8;">", [](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> </span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> user = std::</span><span style="color:#6699cc;">any_cast</span><span style="color:#d3d0c8;"><std::string>(req.</span><span style="color:#f2777a;">user_data</span><span style="color:#d3d0c8;">.</span><span style="color:#6699cc;">at</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">auth_user</span><span style="color:#d3d0c8;">"));
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Hello, </span><span style="color:#d3d0c8;">" + user, "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_pre_routing_handler</span><span style="color:#c0c5ce;">([](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> req.</span><span style="color:#bf616a;">user_data</span><span style="color:#c0c5ce;">["</span><span style="color:#a3be8c;">auth_user</span><span style="color:#c0c5ce;">"] = </span><span style="color:#8fa1b3;">std::string</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">alice</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">return</span><span style="color:#c0c5ce;"> httplib::Server::HandlerResponse::Unhandled;
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/me</span><span style="color:#c0c5ce;">", [](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> </span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> user = std::</span><span style="color:#8fa1b3;">any_cast</span><span style="color:#c0c5ce;"><std::string>(req.</span><span style="color:#bf616a;">user_data</span><span style="color:#c0c5ce;">.</span><span style="color:#8fa1b3;">at</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">auth_user</span><span style="color:#c0c5ce;">"));
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Hello, </span><span style="color:#c0c5ce;">" + user, "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.set_pre_routing_handler([](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -359,15 +361,15 @@
|
||||
</span></pre>
|
||||
</div></div>
|
||||
<p>エラーや例外のハンドラーもカスタマイズできますよ。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_error_handler</span><span style="color:#d3d0c8;">([](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Custom Error Page</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/html</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_exception_handler</span><span style="color:#d3d0c8;">([](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">auto </span><span style="color:#d3d0c8;">&res, std::exception_ptr ep) {
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;">= </span><span style="color:#f99157;">500</span><span style="color:#d3d0c8;">;
|
||||
</span><span style="color:#d3d0c8;"> res.</span><span style="color:#6699cc;">set_content</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">Internal Server Error</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">text/plain</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_error_handler</span><span style="color:#c0c5ce;">([](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Custom Error Page</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/html</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_exception_handler</span><span style="color:#c0c5ce;">([](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">auto </span><span style="color:#c0c5ce;">&res, std::exception_ptr ep) {
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;">= </span><span style="color:#d08770;">500</span><span style="color:#c0c5ce;">;
|
||||
</span><span style="color:#c0c5ce;"> res.</span><span style="color:#8fa1b3;">set_content</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">Internal Server Error</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">text/plain</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.set_error_handler([](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">auto &</span><span style="color:#323232;">res) {
|
||||
@@ -382,10 +384,10 @@
|
||||
</div></div>
|
||||
<h2>ロギング</h2>
|
||||
<p>サーバーでもクライアントでもロガーを設定できます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_logger</span><span style="color:#d3d0c8;">([](</span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&req, </span><span style="color:#cc99cc;">const auto </span><span style="color:#d3d0c8;">&res) {
|
||||
</span><span style="color:#d3d0c8;"> std::cout << req.</span><span style="color:#f2777a;">method </span><span style="color:#d3d0c8;"><< " " << req.</span><span style="color:#f2777a;">path </span><span style="color:#d3d0c8;"><< " " << res.</span><span style="color:#f2777a;">status </span><span style="color:#d3d0c8;"><< std::endl;
|
||||
</span><span style="color:#d3d0c8;">});
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_logger</span><span style="color:#c0c5ce;">([](</span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&req, </span><span style="color:#b48ead;">const auto </span><span style="color:#c0c5ce;">&res) {
|
||||
</span><span style="color:#c0c5ce;"> std::cout << req.</span><span style="color:#bf616a;">method </span><span style="color:#c0c5ce;"><< " " << req.</span><span style="color:#bf616a;">path </span><span style="color:#c0c5ce;"><< " " << res.</span><span style="color:#bf616a;">status </span><span style="color:#c0c5ce;"><< std::endl;
|
||||
</span><span style="color:#c0c5ce;">});
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="color:#323232;">svr.set_logger([](</span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">req, </span><span style="font-weight:bold;color:#a71d5d;">const auto &</span><span style="color:#323232;">res) {
|
||||
@@ -395,11 +397,11 @@
|
||||
</div></div>
|
||||
<h2>Unix Domain Socket</h2>
|
||||
<p>TCP以外に、Unix Domain Socketでの通信にも対応しています。同じマシン上のプロセス間通信に使えます。</p>
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#747369;">// サーバー
|
||||
</span><span style="color:#d3d0c8;">httplib::Server svr;
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">set_address_family</span><span style="color:#d3d0c8;">(AF_UNIX);
|
||||
</span><span style="color:#d3d0c8;">svr.</span><span style="color:#6699cc;">listen</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/tmp/httplib.sock</span><span style="color:#d3d0c8;">", </span><span style="color:#f99157;">0</span><span style="color:#d3d0c8;">);
|
||||
<div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#65737e;">// サーバー
|
||||
</span><span style="color:#c0c5ce;">httplib::Server svr;
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">set_address_family</span><span style="color:#c0c5ce;">(AF_UNIX);
|
||||
</span><span style="color:#c0c5ce;">svr.</span><span style="color:#8fa1b3;">listen</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/tmp/httplib.sock</span><span style="color:#c0c5ce;">", </span><span style="color:#d08770;">0</span><span style="color:#c0c5ce;">);
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-style:italic;color:#969896;">// サーバー
|
||||
@@ -407,13 +409,13 @@
|
||||
</span><span style="color:#323232;">svr.set_address_family(AF_UNIX);
|
||||
</span><span style="color:#323232;">svr.listen(</span><span style="color:#183691;">"/tmp/httplib.sock"</span><span style="color:#323232;">, </span><span style="color:#0086b3;">0</span><span style="color:#323232;">);
|
||||
</span></pre>
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2d2d2d;">
|
||||
<span style="color:#747369;">// クライアント
|
||||
</span><span style="color:#d3d0c8;">httplib::Client </span><span style="color:#6699cc;">cli</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">http://localhost</span><span style="color:#d3d0c8;">");
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_address_family</span><span style="color:#d3d0c8;">(AF_UNIX);
|
||||
</span><span style="color:#d3d0c8;">cli.</span><span style="color:#6699cc;">set_hostname_addr_map</span><span style="color:#d3d0c8;">({{"</span><span style="color:#99cc99;">localhost</span><span style="color:#d3d0c8;">", "</span><span style="color:#99cc99;">/tmp/httplib.sock</span><span style="color:#d3d0c8;">"}});
|
||||
</span><span style="color:#d3d0c8;">
|
||||
</span><span style="color:#cc99cc;">auto</span><span style="color:#d3d0c8;"> res = cli.</span><span style="color:#6699cc;">Get</span><span style="color:#d3d0c8;">("</span><span style="color:#99cc99;">/</span><span style="color:#d3d0c8;">");
|
||||
</div></div><div class="code-block-wrapper"><div data-code-theme="dark"><pre style="background-color:#2b303b;">
|
||||
<span style="color:#65737e;">// クライアント
|
||||
</span><span style="color:#c0c5ce;">httplib::Client </span><span style="color:#8fa1b3;">cli</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">http://localhost</span><span style="color:#c0c5ce;">");
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_address_family</span><span style="color:#c0c5ce;">(AF_UNIX);
|
||||
</span><span style="color:#c0c5ce;">cli.</span><span style="color:#8fa1b3;">set_hostname_addr_map</span><span style="color:#c0c5ce;">({{"</span><span style="color:#a3be8c;">localhost</span><span style="color:#c0c5ce;">", "</span><span style="color:#a3be8c;">/tmp/httplib.sock</span><span style="color:#c0c5ce;">"}});
|
||||
</span><span style="color:#c0c5ce;">
|
||||
</span><span style="color:#b48ead;">auto</span><span style="color:#c0c5ce;"> res = cli.</span><span style="color:#8fa1b3;">Get</span><span style="color:#c0c5ce;">("</span><span style="color:#a3be8c;">/</span><span style="color:#c0c5ce;">");
|
||||
</span></pre>
|
||||
</div><div data-code-theme="light"><pre style="background-color:#ffffff;">
|
||||
<span style="font-style:italic;color:#969896;">// クライアント
|
||||
@@ -440,7 +442,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner">
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<a href="/cpp-httplib/ja/" class="header-title">cpp-httplib <span style="font-size:0.75em;font-weight:normal;margin-left:4px">v0.36.0</span></a>
|
||||
<div class="header-spacer"></div>
|
||||
<nav class="header-nav">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<a href="/cpp-httplib/ja/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||||
Home
|
||||
</a>
|
||||
|
||||
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<a href="/cpp-httplib/ja/tour/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>
|
||||
Tour
|
||||
</a>
|
||||
@@ -45,6 +45,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
</button>
|
||||
<button class="theme-toggle" aria-label="Toggle theme"></button>
|
||||
|
||||
<div class="lang-selector">
|
||||
<button class="lang-btn" aria-label="Language">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||||
@@ -58,6 +59,7 @@
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button class="sidebar-toggle" aria-label="Menu">☰</button>
|
||||
</div>
|
||||
@@ -121,7 +123,7 @@
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
© 2026 yhirose. All rights reserved.
|
||||
© 2026 Yuji Hirose. All rights reserved.
|
||||
</footer>
|
||||
|
||||
<!-- Search modal -->
|
||||
|
||||
Reference in New Issue
Block a user