如何使用简单的 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()
方法,该方法期望值显示为 NameValueCollection
。 NameValueCollection
支持具有相同键的多个值,但不是 Google 翻译 API 将识别为单独值的方式(它创建了一组简单的逗号分隔值,保存在单键唯一键)。
如何使用 POST 多个值,每个值都具有相同的键,使用 WebClient
class?
如需进一步阅读,请参阅:
- Google Translate V2 cannot handle large text translations from C#
- 使用 WebClient 进行 POST 调用时,如何发送
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);
}
}
你可以看到我正在格式化要发送到 Google Translate API 的数据作为 application/x-www-form-urlencoded
字符串。这允许将具有相同键的多个值一起格式化。
到post这个正确你必须记住设置WebClient.Encoding
属性,在我的例子中设置为UTF8
,因为WebClient
转换字符串在 posting 它们之前被上传到一个字节数组中。
您还必须记住将 content-type
header 设置为 application/x-www-form-urlencoded
以确保有效载荷被正确打包。
最后,您必须记住对要翻译的值进行 urlencode。
我希望使用 C# WebClient
提供的简单语法将多个值发送到 Google 翻译 API。要将多个值发送到 API,每个值都必须具有相同的 query-string 键,例如:q=value1&q=value2
。
我不能使用默认的 GET 机制,只能将这些值放在 query-string 上,因为我的某些值太大了。因此,我必须 POST 这些值,确保我设置 X-HTTP-Method-Override
header。
问题是,对于 POST 我的值,我需要使用 WebClient.UploadValues()
方法,该方法期望值显示为 NameValueCollection
。 NameValueCollection
支持具有相同键的多个值,但不是 Google 翻译 API 将识别为单独值的方式(它创建了一组简单的逗号分隔值,保存在单键唯一键)。
如何使用 POST 多个值,每个值都具有相同的键,使用 WebClient
class?
如需进一步阅读,请参阅:
- Google Translate V2 cannot handle large text translations from C#
- 使用 WebClient 进行 POST 调用时,如何发送 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);
}
}
你可以看到我正在格式化要发送到 Google Translate API 的数据作为 application/x-www-form-urlencoded
字符串。这允许将具有相同键的多个值一起格式化。
到post这个正确你必须记住设置WebClient.Encoding
属性,在我的例子中设置为UTF8
,因为WebClient
转换字符串在 posting 它们之前被上传到一个字节数组中。
您还必须记住将 content-type
header 设置为 application/x-www-form-urlencoded
以确保有效载荷被正确打包。
最后,您必须记住对要翻译的值进行 urlencode。