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

Eel*_*Fan 82 c# webclient

我有一些我需要转换为C#的JavaScript代码.我的JavaScript代码将一些JSON发布到已创建的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");
}
Run Code Online (Sandbox Code Playgroud)

我正在试图找出如何将其转换为C#.我的应用程序使用的是.NET 2.0.据我所知,我需要做以下事情:

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

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

谁能告诉我我在这里失踪了什么?

谢谢!

sar*_*arh 179

问题已经得到解答,但我认为我找到的解决方案更简单,与问题标题更相关,这里是:

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


Jor*_*ado 67

您需要一个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();
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你,

  • 为什么使用ASCIIEncoding而不是UTF8?请参见http://stackoverflow.com/a/9254967/109392. (5认同)
  • +1我首先尝试使用WebClient类似于OP,但没有使其正常工作。然后,我尝试了这种解决方案,它就像一种魅力。我使用UTF8Encoding而不是ASCIIEncoding来创建字节数组,因为我没有理由使用ASCII,这会以一种无法接受的方式减少可用字符。ASCII字符集中只有127个字符。 (2认同)

Vad*_*hev 67

以下示例演示如何通过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);
}
Run Code Online (Sandbox Code Playgroud)

先决条件:Json.NET库

  • 如果您使用的是已完成的事件,我认为应该是UploadStringAsync. (4认同)
  • @bubbleking我在WebClient上单击F12,看到它是一个组件,并且该组件实现了IDisposable`public class WebClient:Component` public class Component:MarshalByRefObject,IComponent,IDisposable` (2认同)