Skip to content

Commit d88652c

Browse files
committed
add json-post
1 parent c66dd73 commit d88652c

File tree

5 files changed

+51
-49
lines changed

5 files changed

+51
-49
lines changed

docs/chapter1/section3/1_json-response.md

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,17 +88,12 @@ inspectある?
8888
## 自分のサーバーでPOSTを受け取ってみよう
8989

9090
POST で JSON を受け取って、内容をそのまま返すサーバーを作ってみます。
91-
`e.GET`と同じように、`e.POST`と書くことで POST を受け取ることができます。
92-
POST のハンドラは、受け取りたい JSON を示す空の変数を先に用意し、`Context``Bind`に渡すことで送られてきたデータを取り出すことができます。
93-
データが存在しなかったりした場合には、返り値の`err`にエラーが入ります。
94-
逆にエラーがないときは`err``nil`が返ってくるので、`if`で条件分岐をします。
91+
`get()`と同じように、`post()`と書くことで POST を受け取ることができます。
92+
POST のハンドラでは `Result` 型を受け取っています。
93+
パースに成功した場合は、match の中の Ok に入り、失敗した場合は Err に入ります。
9594

96-
<<< @/chapter1/section3/src/2-2_echo-server.go
95+
<<< @/chapter1/section3/src/2-2_echo-server.rs
9796

9897
Postman を使って実際に受け取れている / 送り返せているか確認してみましょう。
9998

100-
:::info
101-
omitempty を指定していると false, 0, 空文字("")は返ってきません。(omitempty は、ゼロ値の場合はそのフィールドを出力しないという意味でしたね。)
102-
:::
103-
10499
![](assets/postman-echo.png)

docs/chapter1/section3/src/2-1_json-server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ async fn main() {
1818
}
1919

2020
// JSONで返すための構造体を定義
21-
// 構造体を JSON に変換するためにserde::Serializeを導出する
21+
// 構造体を JSON に変換するためにserde::Serializeトレイトを導出する
2222
#[derive(serde::Serialize)]
2323
struct JsonData {
2424
number: i32,

docs/chapter1/section3/src/2-2_echo-server.go

Lines changed: 0 additions & 38 deletions
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use core::fmt;
2+
3+
use axum::{
4+
extract::rejection::JsonRejection,
5+
http::StatusCode,
6+
routing::{get, post},
7+
Json, Router,
8+
};
9+
10+
#[tokio::main]
11+
async fn main() {
12+
// post() メソッドを使ってPOSTリクエストを処理する
13+
let app = Router::new()
14+
.route("/post", post(post_handler));
15+
16+
// ポート8080でリスナーを作成する
17+
let listener = tokio::net::TcpListener::bind("127.0.0.1:8080")
18+
.await
19+
.unwrap();
20+
21+
println!("listening on {}", listener.local_addr().unwrap());
22+
23+
// サーバーを起動する
24+
axum::serve(listener, app).await.unwrap();
25+
}
26+
27+
// JSONを受け取るための構造体を定義
28+
// 構造体を JSON に変換するためにserde::Serializeを導出する
29+
#[derive(serde::Deserialize, serde::Serialize)]
30+
struct JsonData {
31+
number: i32,
32+
string: String,
33+
bool: bool,
34+
}
35+
36+
async fn post_handler(
37+
query: Result<Json<JsonData>, JsonRejection>,
38+
) -> Result<Json<JsonData>, (StatusCode, JsonRejection)> {
39+
match query {
40+
// 正常なときリクエストデータをそのまま返す
41+
Ok(data) => Ok(data),
42+
// 正常でないときステータスコード 400 Bad Requestを返す
43+
Err(rejection) => Err((StatusCode::BAD_REQUEST, rejection)),
44+
}
45+
}

docs/web_basic/2_backend.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ async fn main() {
186186
axum::serve(listener, app).await.unwrap();
187187
}
188188

189-
// 構造体を JSON に変換するためにserde::Serializeを導出する
189+
// 構造体を JSON に変換するためにserde::Serializeトレイトを導出する
190190
#[derive(serde::Serialize)]
191191
struct JsonData {
192192
number: i32,

0 commit comments

Comments
 (0)