Как использовать actix_web :: guard :: Header? - PullRequest
0 голосов
/ 09 июля 2019

Чтобы поддерживать application/json и multipart/form-data для одного и того же URL, я бы хотел проверить заголовок «Content-Type» и выбрать правильный тип Data<T> для передачи функции .data App::new.

Если я раскомментирую строку .guard, то curl -X POST -H "Content-Type: multipart/form-data" -F files=\"qqq\" localhost:8080/upload удаляется.Но без строки .guard все работает как положено.Что не так?

HttpServer::new(move || {
    App::new()
        .service(resource("/upload")
     // .guard(actix_web::guard::Header("Content-Type", "multipart/form-data"))
        .data(form.clone())
        .route(post()
        .to(upload_multipart)
        )   
    )
})

Как правильно объединить их в одном экземпляре приложения?

1 Ответ

0 голосов
/ 09 июля 2019

В настоящее время actix-web 1.0.3 не поддерживает multipart / form-data , но вы можете использовать actix_multipart . Поскольку основное внимание уделяется десериализации одних и тех же данных с различными типами контента, я упростил использование application/x-www-form-urlencoded.

Чтобы поддерживать два разных типа контента, вложите web::resource и добавьте охрану для каждого из обработчиков:

web::resource("/")
    .route(
        web::post()
            .guard(guard::Header(
                "content-type",
                "application/x-www-form-urlencoded",
            ))
            .to(form_handler),
    )
    .route(
        web::post()
            .guard(guard::Header("content-type", "application/json"))
            .to(json_handler),
    ),

Создание обработчиков, принимающих десериализованные данные, и отправка данных в общий обработчик:

fn form_handler(user: web::Form<User>) -> String {
    handler(user.into_inner())
}

fn json_handler(user: web::Json<User>) -> String {
    handler(user.into_inner())
}

fn handler(user: User) -> String {
    format!("Got username: {}", user.username)
}

Результат:

$ curl -d 'username=adsf' localhost:8000
Got username: asdf⏎
$ curl -d '{"username": "asdf"}' localhost:8000
Parse error⏎
$ curl -d '{"username": "asdf"}' -H 'content-type: application/json' localhost:8000
Got username: asdf⏎

Чтобы создать собственный десериализатор, используйте черту FromRequest.

...