无法使用Headers =“application / x-www-form-urlencoded”编码我的JSON对象insdie我的WebClient UploadString
我正在开发一个ASP.Net MVC 4 Web应用程序,我需要将JSON对象发布到第三方API。 现在我需要通过将内容类型设置为application/x-www-form-urlencoded
来编码我的JSON数据,如API文档中所述。 所以我尝试了以下内容,将Content-Type
指定为wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";
: –
var data = JsonConvert.SerializeObject(mainresourceinfo); using (WebClient wc = new WebClient()) { string url = currentURL + "resources?AUTHTOKEN=" + pmtoken; Uri uri = new Uri(url); // wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; wc.Headers["Content-Type"] = "application/x-www-form-urlencoded"; crudoutput = wc.UploadString(uri, "INPUT_DATA=" + data); }
但是数据仍然没有被编码..如果我在我的JSON字符串中发送一个123%456
类的值,它将被保存为第三部分系统内的123E6t
。 现在作为一种解决方法,我使用WebUtility.UrlEncode(data)
手动编码JSON对象,然后将其发送到第三方API,我可以看到123%456
等值将正确保存…但我不知道想要手动编码数据,我想设置内容类型来指定编码…这可能吗?
使用
wc.Headers["Content-Type"] = "application/json"
并尝试设置charset
wc.Encoding = Encoding.UTF8; crudoutput = wc.UploadString(uri, "INPUT_DATA=" + Encoding.UTF8.GetString(data));
Charset
指定文档的字符编码。 HTTP 1.1
默认字符集是ANSI,因为ANSI与ISO-8859-1
相同。
默认情况下,将WebClient.Encoding
设置为Encoding.Default
,这意味着您将获得ANSI代码页。 所有默认编码都会丢失数据,因此,您可能会使用UTF-8。
因此,如果设置charset并不意味着所有内容都必须编码为Unicode,但它确实意味着这些文档只能包含Unicode定义的字符。 这意味着您还需要将内容保存为UTF-8。 在这种情况下,您可以使用Encoding.UTF8.GetString()
试试这个 :
using (var client = new WebClient()) { string url = "URL"; client.Headers[HttpRequestHeader.ContentType] = "application/json"; client.Encoding = System.Text.Encoding.UTF8; string serialisedData = JsonConvert.SerializeObject(data); string response = client.UploadString(url, serialisedData); }
您可以使用WebClient.UploadValues(Uri, NameValueCollection)
方法。 它会自动为你做所有的事情。 您甚至不需要指定Content-Type
标头,因为它默认发送Content-Type: application/x-www-form-urlencoded
。
这是一个例子:
var data = JsonConvert.SerializeObject(mainresourceinfo); using (WebClient wc = new WebClient()) { string url = currentURL + "resources?AUTHTOKEN=" + pmtoken; Uri uri = new Uri(url); var body = new NameValueCollection { { "INPUT_DATA", data } }; crudoutput = wc.UploadValues(uri, body); }
我最近遇到了与第三方API相同的问题。 在我找到解决方案之前花了一段时间,这里已经给出的所有其他答案看起来很像我尝试过但没有用的东西。 对我有用的是UploadDataAsync。 在我的情况下,特殊字符(é,ü,ã等)在将json字符串发送到API时会导致错误。
using (WebClient client = new WebClient()) { client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); client.Headers.Add(HttpRequestHeader.Accept, "application/json"); client.UploadDataAsync(new Uri(apiUrl), "POST", Encoding.UTF8.GetBytes(jsonString)); }
这是我如何实现我的post方法
public static string Post(Exchange exchValues, string url) { WebClient wc = new WebClient(); wc.Encoding = Encoding.UTF8; wc.Headers[HttpRequestHeader.ContentType] = "application/json"; return wc.UploadString(url, "POST", Json.Stringify(exchValues)); }
这发送123%456并且数据不转换为123%456,我使用ASP.net Web API,Json.Stringify使用.net Json序列化
当我尝试使用GET方法时,我遇到同样的问题,密码参数包含%字符,Api保持解码,所以123 $ 45解码到123E6,所以我只是将%替换为%25,它的工作
HttpUtility.UrlDecode("123%456".Replace("%","%25")); // =>123%45
这里有一些链接可以帮助我MSDN , ASCII编码参考