为 reqwest 客户端构建具有多个值的参数的查询字符串

JBa*_*art 3 urlencode rust reqwest

我正在尝试使用构建器的 query() 方法为 reqwest 客户端构建查询字符串。但其中一个参数必须是像这样编码的多个值

 ?dt=t&dt=at&dt=m
Run Code Online (Sandbox Code Playgroud)

我不知道怎么办。

use reqwest::blocking::Client;
use serde_json::{json, Value as JsonValue};


fn main() {
    let query = json!({
        "client": "gtx",
        "ie": "UTF-8",   // input encoding
        "oe": "UTF-8",   // output encoding
        "sl": "auto",    // source language
        "tl": "en",      // target language
        "dt": ["t", "at", "m"],  // <<<<< ERROR
        "q": "salut les gars. ca va? on y va!",       // text to translate
    });
    let client = Client::new();
    let response = client.get("https://translate.googleapis.com/translate_a/single")
                         .query(&query)
                         .send()
                         .unwrap();
    if response.status().is_success() {
        let body: JsonValue = response.json().unwrap();
        println!("detected language {:}", body.get(2).unwrap());

        for item in body.get(0).and_then(JsonValue::as_array).unwrap() {
            println!("{:}", item[1]);
            println!("{:}", item[0]);
        }
    } else {
        println!("fail {:?}", response);
    }
}


 reqwest::Error { kind: Builder, source: Custom("unsupported value") }
Run Code Online (Sandbox Code Playgroud)

也许不支持?我想我可以用格式手动构建字符串!作为最后的手段

Pet*_*all 5

您可以将查询参数构建为IntoIterator键值对。

例如,

let query = vec![
    ("client", "gtx"),
    ("ie", "UTF-8"),   // input encoding
    ("oe", "UTF-8"),   // output encoding
    ("sl", "auto"),    // source language
    ("tl", "en"),      // target language
    ("dt", "t"),
    ("dt", "at"),
    ("dt", "m"),
    ("q", "salut les gars. ca va? on y va!"), // text to translate
];

let client = Client::new();
let response = client.get("https://translate.googleapis.com/translate_a/single")
                     .query(&query)
                     .send()
Run Code Online (Sandbox Code Playgroud)