Skip to content

Commit

Permalink
add json-post
Browse files Browse the repository at this point in the history
  • Loading branch information
kenken714 committed Oct 11, 2024
1 parent c66dd73 commit d88652c
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 49 deletions.
13 changes: 4 additions & 9 deletions docs/chapter1/section3/1_json-response.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,17 +88,12 @@ inspectある?
## 自分のサーバーでPOSTを受け取ってみよう

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

<<< @/chapter1/section3/src/2-2_echo-server.go
<<< @/chapter1/section3/src/2-2_echo-server.rs

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

:::info
omitempty を指定していると false, 0, 空文字("")は返ってきません。(omitempty は、ゼロ値の場合はそのフィールドを出力しないという意味でしたね。)
:::

![](assets/postman-echo.png)
2 changes: 1 addition & 1 deletion docs/chapter1/section3/src/2-1_json-server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ async fn main() {
}

// JSONで返すための構造体を定義
// 構造体を JSON に変換するためにserde::Serializeを導出する
// 構造体を JSON に変換するためにserde::Serializeトレイトを導出する
#[derive(serde::Serialize)]
struct JsonData {
number: i32,
Expand Down
38 changes: 0 additions & 38 deletions docs/chapter1/section3/src/2-2_echo-server.go

This file was deleted.

45 changes: 45 additions & 0 deletions docs/chapter1/section3/src/2-2_echo-server.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
use core::fmt;

use axum::{
extract::rejection::JsonRejection,
http::StatusCode,
routing::{get, post},
Json, Router,
};

#[tokio::main]
async fn main() {
// post() メソッドを使ってPOSTリクエストを処理する
let app = Router::new()
.route("/post", post(post_handler));

// ポート8080でリスナーを作成する
let listener = tokio::net::TcpListener::bind("127.0.0.1:8080")
.await
.unwrap();

println!("listening on {}", listener.local_addr().unwrap());

// サーバーを起動する
axum::serve(listener, app).await.unwrap();
}

// JSONを受け取るための構造体を定義
// 構造体を JSON に変換するためにserde::Serializeを導出する
#[derive(serde::Deserialize, serde::Serialize)]
struct JsonData {
number: i32,
string: String,
bool: bool,
}

async fn post_handler(
query: Result<Json<JsonData>, JsonRejection>,
) -> Result<Json<JsonData>, (StatusCode, JsonRejection)> {
match query {
// 正常なときリクエストデータをそのまま返す
Ok(data) => Ok(data),
// 正常でないときステータスコード 400 Bad Requestを返す
Err(rejection) => Err((StatusCode::BAD_REQUEST, rejection)),
}
}
2 changes: 1 addition & 1 deletion docs/web_basic/2_backend.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ async fn main() {
axum::serve(listener, app).await.unwrap();
}

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

0 comments on commit d88652c

Please sign in to comment.