我希望使用C#WebClient提供的简单语法将多个值发送到Google Translate API。要将多个值发送到API,每个值必须具有相同的查询字符串键,例如:q=value1&q=value2

我不能使用默认的GET机制,只能将这些值放在查询字符串上,因为我的某些值太大。因此,我必须发布这些值以确保设置了X-HTTP-Method-Override标头。

问题是,要发布我的值,我需要使用WebClient.UploadValues()方法,该方法希望将值显示为NameValueCollectionNameValueCollection支持具有相同键的多个值,但是Google Translate API不会将其识别为单独的值(它会在单个键唯一键下创建一个用逗号分隔的简单值集)。

如何使用WebClient类发布多个具有相同键的值?

有关更多阅读,请参阅:


Google Translate V2 cannot handle large text translations from C#
When making a POST call using a WebClient, how do I sendduplicate values in the NameValueCollection?

最佳答案

为此,您可以使用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);
    }
}


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

要正确发布此消息,您必须记住将WebClient.Encoding属性(在我的情况下设置为UTF8),因为WebClient在发布它们之前将要上传的字符串转换为字节数组。

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

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

关于c# - 如何使用简单的C#WebClient通过相同的键发布多个值(到Google Translate),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28193914/

10-12 23:12