如何使用简单的 C# WebClient POST 具有相同键的多个值(到 Google 翻译)

How do I POST multiple values with the same key (to Google Translate) using the simple C# WebClient

我希望使用 C# WebClient 提供的简单语法将多个值发送到 Google 翻译 API。要将多个值发送到 API,每个值都必须具有相同的 query-string 键,例如:q=value1&q=value2

我不能使用默认的 GET 机制,只能将这些值放在 query-string 上,因为我的某些值太大了。因此,我必须 POST 这些值,确保我设置 X-HTTP-Method-Override header。

问题是,对于 POST 我的值,我需要使用 WebClient.UploadValues() 方法,该方法期望值显示为 NameValueCollectionNameValueCollection 支持具有相同键的多个值,但不是 Google 翻译 API 将识别为单独值的方式(它创建了一组简单的逗号分隔值,保存在单键唯一键)。

如何使用 POST 多个值,每个值都具有相同的键,使用 WebClient class?

如需进一步阅读,请参阅:

要执行此操作,您可以使用 WebClient.UploadString() 方法,但有几个陷阱需要注意。首先是一些代码:

using (var webClient = new WebClient())
{
    webClient.Encoding = Encoding.UTF8;
    webClient.Headers.Add("X-HTTP-Method-Override", "GET");
    webClient.Headers.Add("content-type", "application/x-www-form-urlencoded");
    var data = string.Format("key={0}&source={1}&target={2}&q={3}&q={4}", myApiKey, "en", "fr", urlEncodedValue1, urlEncodedvalue2);
    try
    {
        var json = webClient.UploadString(GoogleTranslateApiUrl, "POST", data);
        var result = JsonConvert.DeserializeObject<dynamic>(json);
        translatedValue1 = result.data.translations[0].translatedText;
        translatedValue2 = result.data.translations[1].translatedText;
    }
    catch (Exception ex)
    {
        loggingService.Error(ex.Message);
    }
}

你可以看到我正在格式化要发送到 Google Translate API 的数据作为 application/x-www-form-urlencoded 字符串。这允许将具有相同键的多个值一起格式化。

到post这个正确你必须记住设置WebClient.Encoding 属性,在我的例子中设置为UTF8,因为WebClient转换字符串在 posting 它们之前被上传到一个字节数组中。

您还必须记住将 content-type header 设置为 application/x-www-form-urlencoded 以确保有效载荷被正确打包。

最后,您必须记住对要翻译的值进行 urlencode。