簡體   English   中英

如果我在 GET 上使用 FromRequest 參數,Rocket 找不到路線

[英]Rocket cannot find a route if I use a FromRequest param on a GET

我不能使用通過 #get 方法實現 FromRequest 的參數。 它與#post完美配合

在下面的代碼中,只要我不使用 header 參數,/keyserver/key (GET) 就可以工作。 否則,我會得到:

GET /keyserver/key text/html:
    => Matched: GET /keyserver/key (key_list)
    => Outcome: Forward
    => Error: No matching routes for GET /keyserver/key text/html.
    => Warning: Responding with 404 Not Found catcher.
    => Response succeeded.

如何在 GET 方法中獲取 header 信息?

/keyserver/add_key (POST) 與 header 參數配合得很好。

#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use] extern crate rocket;
#[macro_use] extern crate serde_derive;

use rocket_contrib::json::Json;

extern crate serde;

use rocket::request::FromRequest;
use rocket::{Request, request};
use rocket::outcome::Outcome::{Success, Forward};

#[derive(Serialize, Deserialize, Debug)]
struct MyReply {
    uuid: String,
}

#[derive(Serialize, Deserialize, Debug)]
struct RequestHeader {
    content_type: String,
}

impl<'a, 'r> FromRequest<'a, 'r> for RequestHeader {
    type Error = ();

    fn from_request(request: &'a Request<'r>) -> request::Outcome<Self, ()> {
        let content_type = request.headers().get_one("Content-Type").unwrap_or("");
        if request.content_type().is_some() {
            Success(RequestHeader{
                content_type : content_type.to_string(),
            })
        } else {
            Forward(())
        }
    }
}

#[get("/key")]
fn key_list( /* header : RequestHeader*/ ) -> Json<MyReply> {
    //println!("my header {:?}", &header.content_type);
    let key = MyReply {
        uuid: "Bonjour".to_string(),
    };
    Json(key)
}

#[post("/add_key", format = "application/json", data = "<customer>")]
fn add_key(customer: Json<MyReply>, header : RequestHeader ) -> Json<MyReply> {
    println!("my header {:?}", &header.content_type);
    let key = MyReply {
        uuid: customer.uuid.clone(),
    };
    Json(key)
}

fn main() {
    rocket::ignite()
        .mount("/keyserver", routes![key_list, add_key])
        .launch();
}

我找到了一個使用元組結構的解決方案

#[derive(Serialize, Deserialize, Debug)]
struct RequestHeader(String);

而不是以前的 RequestHeader 結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM