在C#中通过WebClient将JSON发布到URL


87

我有一些JavaScript代码需要转换为C#。我的JavaScript代码将一些JSON POST到已创建的Web服务。此JavaScript代码可以正常运行,如下所示:

var vm = { k: "1", a: "2", c: "3", v: "4" };
$.ajax({
  url: "http://www.mysite.com/1.0/service/action",
  type: "POST",
  data: JSON.stringify(vm),
  contentType: "application/json;charset=utf-8",
  success: action_Succeeded,
  error: action_Failed
});

function action_Succeeded(r) {
  console.log(r);
}

function log_Failed(r1, r2, r3) {
  alert("fail");
}

我试图弄清楚如何将其转换为C#。我的应用程序正在使用.NET 2.0。据我所知,我需要执行以下操作:

using (WebClient client = new WebClient())
{
  string json = "?";
  client.UploadString("http://www.mysite.com/1.0/service/action", json);
}

在这一点上,我有点卡住了。我不确定json应该是什么样。我不确定是否需要设置内容类型。如果我这样做,我不确定该怎么做。我也看到了UploadData。因此,我不确定是否使用正确的方法。从某种意义上说,我的数据序列化是我的问题。

有人可以告诉我我在这里想念的吗?

谢谢!

Answers:


70

您需要一个json序列化程序来解析您的内容,可能已经有了它,对于有关如何发出请求的最初问题,这可能是一个主意:

var baseAddress = "http://www.example.com/1.0/service/action";

var http = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
http.Accept = "application/json";
http.ContentType = "application/json";
http.Method = "POST";

string parsedContent = <<PUT HERE YOUR JSON PARSED CONTENT>>;
ASCIIEncoding encoding = new ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(parsedContent);

Stream newStream = http.GetRequestStream();
newStream.Write(bytes, 0, bytes.Length);
newStream.Close();

var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

希望能帮助到你,


1
“ parsedContent”应该是什么样?不幸的是,在这种情况下,我需要手动创建JSON。谢谢。
鳗鱼粉丝

可以看起来像JSON吗?还是我需要做一些特殊的编码?
鳗鱼粉丝

@EelsFan通常不是选择任何JSON解析器的问题,您始终可以通过JSON.Net将.net对象解析为JSON,但是根据我的经验,有些云服务具有不同的JSON解析器版本,因此我必须做一些调整。做什么是最适合你的情况下,这种讨论可以帮助你太看到一些问题,而没有的Json.NET stackoverflow.com/questions/9573119/...
豪尔赫·阿尔瓦拉多

5
为什么使用ASCIIEncoding而不使用UTF8?参见stackoverflow.com/a/9254967/109392
畏惧

2
+1我首先尝试使用类似于OP WebClient,但没有使其正常工作。然后,我尝试了这种解决方案,它就像一种魅力。我之所以使用UTF8Encoding而不是ASCIIEncoding创建字节数组,是因为我没有理由使用ASCII,这会以一种无法接受的方式减少可用字符。ASCII字符集中只有127个字符。
畏惧

197

该问题已经回答,但我想我已经找到了更简单,更与问题标题相关的解决方案,这里是:

var cli = new WebClient();
cli.Headers[HttpRequestHeader.ContentType] = "application/json";
string response = cli.UploadString("http://some/address", "{some:\"json data\"}");

1
并且,要使您的json“可读” :(在vb.net中)Dim json = <JSON> {“ field1”:“ value1”,“ status”:“待定”,“ objField”:{“ field2”:true} } </ JSON> .ToString
foxont​​herock,2016年

但是如何将参数内插到该json字符串中呢?
塔利B.

74

以下示例演示如何通过WebClient.UploadString方法发布JSON :

var vm = new { k = "1", a = "2", c = "3", v=  "4" };
using (var client = new WebClient())
{
   var dataString = JsonConvert.SerializeObject(vm);
   client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
   client.UploadString(new Uri("http://www.contoso.com/1.0/service/action"), "POST", dataString);
}

先决条件:Json.NET库


4
我认为如果您使用Completed事件,则应该为UploadStringAsync。
山姆·麦克里尔

您可以忽略该POST参数,UploadString因为默认情况下隐式使用此方法。此外,client.Headers.Add(HttpRequestHeader.Accept, "application/json");如果您希望获得JSON回报,则可能要添加。
jimasun

WebClient是否实际实现IDisposable?几年后,我正在使用.NET Framework 4.7.1,但我没有看到它。
冒泡

2
@bubbleking我在WebClient上单击F12,看到它是一个组件,并且该组件实现了IDisposablepublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
Lars Persson,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.