Добавление заголовков к вызову GET - PullRequest
0 голосов
/ 22 октября 2019

Я новичок в Rust и пытаюсь вызвать API, используя reqwest ящик. Я хочу, чтобы мой код:

  1. Включил в запрос GET заголовок 'Content-Disposition: Inline'.
  2. Возврат и печать JSON в виде текста

Я не уверен, что я делаю неправильно, и надеюсь, что кто-то может помочь определить это для меня.

Запрос отлично работает для меня в JS и в Postman и возвращает данные массива JSON, также в моемКод RUST под запросом возвращает успех 200.

Но я не вижу данных ответов, и удаленный сервер отвечает с заголовком "Content-Disposition" по умолчанию (а не «inline», как я указал).

Мой код Rust, который прекрасно компилируется и, кажется, отправляет нормально:

extern crate reqwest;
use reqwest::header::HeaderName;
use reqwest::header::HeaderValue;
use reqwest::header::ACCEPT;
use reqwest::header::CONTENT_DISPOSITION;

fn main() {
    let client = reqwest::Client::new();
    let response_text = client
        .get("http://nemlog.com.au/show/1h/NEMLOG.json?id1=RRP.DISPATCHPRICE0&k1=vic")
        .header(CONTENT_DISPOSITION, "inline")
        .header(ACCEPT, "*/*")
        .send()
        .unwrap();

    println!("Response Text: {:#?}", response_text);
}

ответ, который я получаю в консоли от вышеуказанного запроса:

Response Text: Response {
  url: "http://nemlog.com.au/show/1h/NEMLOG.json?id1=RRP.DISPATCHPRICE0&k1=vic",
  status: 200,
  headers: {
    "date": "Tue, 22 Oct 2019 06:33:45 GMT",
    "server": "Apache/2.4.6 (CentOS) PHP/5.4.16 mod_wsgi/3.4 Python/2.7.5",
    "content-disposition": "attachment; filename=NEMLOG.json",
    "transfer-encoding": "chunked",
    "content-type": "text/json; name=\"NEMLOG.json\"",
  },
}

Вывод, который я хочучтобы увидеть это встроенный ответ на вызов, который выглядит следующим образом:

{"SETTLEMENTDATE":"2019-10-22T10:45:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":91.272}
{"SETTLEMENTDATE":"2019-10-22T10:50:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":75.7859}
{"SETTLEMENTDATE":"2019-10-22T10:55:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":74.8683}
{"SETTLEMENTDATE":"2019-10-22T11:00:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":25.14}
{"SETTLEMENTDATE":"2019-10-22T11:05:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":16.4812}
{"SETTLEMENTDATE":"2019-10-22T11:10:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":56.4572}
{"SETTLEMENTDATE":"2019-10-22T11:15:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":38.5679}
{"SETTLEMENTDATE":"2019-10-22T11:20:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":47.5941}
{"SETTLEMENTDATE":"2019-10-22T11:25:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":25.14}
{"SETTLEMENTDATE":"2019-10-22T11:30:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":51.8465}
{"SETTLEMENTDATE":"2019-10-22T11:35:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":71.7957}
{"SETTLEMENTDATE":"2019-10-22T11:40:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":72.0757}

Ответы [ 3 ]

0 голосов
/ 22 октября 2019

send - это ленивый: он возвращается, как только заголовки ответа получены, не ожидая тела. Вы можете получить текст с помощью метода text, который действительно ожидает получения полного текста, или вы можете использовать реализацию Read для обработки его в виде кусков:

let mut response = client
    .get("http://nemlog.com.au/show/1h/NEMLOG.json?id1=RRP.DISPATCHPRICE0&k1=vic")
    .header(CONTENT_DISPOSITION, "inline")
    .header(ACCEPT, "*/*")
    .send()
    .unwrap();

println!("Response: {:#?}", response);
println!("Response text: {}", response.text().unwrap());

Что касается content-disposition ответа, вы уверены, что ваш сервер учитывает заголовок content-disposition? Можете ли вы проверить заголовки ответов, которые вы получаете с JS и Postman?

0 голосов
/ 23 октября 2019

Спасибо, Питер и Омер.

Мне удалось исправить это, и ответ был комбинацией ваших предложений. Мне нужно было добавить следующее в мой код для отправки, развернуть ответ и запустить текстовый метод:

.send()
.unwrap()
.text();

Большое спасибо обоим!

0 голосов
/ 22 октября 2019

У меня нет глубоких знаний ни о ржавчине, ни о reqwest, но из того, что я вижу, вы трансформируете объект Response в текст и печатаете структуру Response без тела сообщения или полезной нагрузки. С помощью быстрого поиска в Google я нашел метод text(), принадлежащий объекту Response, который должен дать вам полезную нагрузку.

Вот ссылка: https://docs.rs/reqwest/0.8.4/reqwest/struct.Response.html

Это может быть решением:

extern crate reqwest;
use reqwest::header::HeaderName;
use reqwest::header::HeaderValue;
use reqwest::header::ACCEPT;
use reqwest::header::CONTENT_DISPOSITION;

fn main() {
    let client = reqwest::Client::new();
    let response_text = client
        .get("http://nemlog.com.au/show/1h/NEMLOG.json?id1=RRP.DISPATCHPRICE0&k1=vic")
        .header(CONTENT_DISPOSITION, "inline")
        .header(ACCEPT, "*/*")
        //.send() <-- it seems that you do not have to send explicitly
        .text();  // <-- !!!!!!! Change

    println!("Response Text: {:#?}", response_text);
}
...