Как решить эту ошибку заголовка reqwest или ошибку API в Rust - PullRequest
0 голосов
/ 08 апреля 2020

Я создаю веб-приложение Rust. Я пытаюсь выполнить запросы API и передать результат запроса в качестве ответа веб-представлению. Есть файлы main.rs, route.rs и common.rs. В основном файл main.rs вызывает соответствующий маршрут, а затем маршрут вызовет функцию. Дело в том, что теперь при его сборке ошибок нет. Но, когда я попытался запустить его с помощью веб-браузера, он выдает мне эту ошибку в браузере.

This page isn’t working
127.0.0.1 didn’t send any data.
ERR_EMPTY_RESPONSE

И это также отображается в терминале.

thread 'actix-rt:worker:2' panicked at 'assertion failed: !headers.contains_key(CONTENT_TYPE)', src\search\routes\common.rs:15:9

Я хочу знать, правильно ли я отправляю заголовки или нет? Или я что-то не так делаю? Как я могу это исправить?

route.rs

use crate::search::User;
use actix_web::{get, post, put, delete, web, HttpResponse, Responder};
use serde_json::json;
extern crate reqwest;
extern crate serde;
mod bfm;
mod common;
use actix_web::Result;
use actix_web::error;
use actix_web::http::{StatusCode};

#[get("/token")]
async fn get_token() -> Result<String> {

    let set_token = common::authenticate(); 
    return set_token.await
    .map_err(|_err| error::InternalError::new(
    std::io::Error::new(std::io::ErrorKind::Other, "failed to get token"), 
         StatusCode::INTERNAL_SERVER_ERROR
    ).into());
}

pub fn init_routes(cfg: &mut web::ServiceConfig) {
    cfg.service(get_token);
}

common.rs

extern crate reqwest;
use reqwest::header::HeaderMap;
use reqwest::header::AUTHORIZATION;
use reqwest::header::CONTENT_TYPE;

pub async fn authenticate() -> Result<String, reqwest::Error> {

    fn construct_headers() -> HeaderMap {
        let mut headers = HeaderMap::new();

        headers.insert(AUTHORIZATION, "Basic bghtyujhu==".parse().unwrap());
        headers.insert(CONTENT_TYPE, "application/x-www-form-urlencoded".parse().unwrap());

        assert!(headers.contains_key(AUTHORIZATION));
        assert!(!headers.contains_key(CONTENT_TYPE));

        headers
    }

    let client = reqwest::Client::new();

    let reszr = client.post("https://api.test.com/auth/token")
    .headers(construct_headers())
    .body("grant_type=client_credentials")
        .send()
        .await?
        .text()
        .await;

        return reszr;
}
...