无法使用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编码参考