【问题标题】:POSTing JSON to URL via WebClient in C#在 C# 中通过 WebClient 将 JSON 发布到 URL
【发布时间】:2013-02-12 00:47:18
【问题描述】:

我有一些 JavaScript 代码需要转换为 C#。我的 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");
}

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

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

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

谁能告诉我这里缺少什么?

谢谢!

【问题讨论】:

    标签: c# webclient


    【解决方案1】:

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

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

    PS:在大多数 .net 实现中,但not in all WebClient 是 IDisposable,因此当然最好对其进行“使用”或“处理”。但是在这种特殊情况下it is not really necessary

    【讨论】:

    • 并且,为了让你的 json “可读”:(在 vb.net 中)Dim json = { "field1": "value1", "status": "pending", "objField" : { "field2": true } }.ToString
    • 但是如何将参数插入到该 json 字符串中呢?
    【解决方案2】:

    以下示例演示如何通过WebClient.UploadString Method POST 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 library

    【讨论】:

    • 如果你使用完成的事件,我认为应该是 UploadStringAsync。
    • 您可以省略POST 参数,因为UploadString 默认隐式使用此方法。此外,如果您希望 JSON 作为返回值,您可能需要添加 client.Headers.Add(HttpRequestHeader.Accept, "application/json");
    • WebClient 是否真的实现了 IDisposable?几年后我在 .NET Framework 4.7.1 中工作,但我没有看到它。
    • @bubbleking 我在WebClient上按了F12,看到它是一个组件,组件实现了IDisposable public class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
    【解决方案3】:

    你需要一个 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();
    

    希望对你有帮助,

    【讨论】:

    • “parsedContent”应该是什么样子?不幸的是,我需要在这种情况下手动创建我的 JSON。谢谢。
    • 它看起来像 JSON 吗?或者我需要做一些特殊的编码是我想要的。
    • @EelsFan 通常选择任何 JSON 解析器都不是问题,您始终可以使用 JSON.Net 将 .net 对象解析为 JSON,但根据我的经验,有些云服务具有不同的 JSON解析器版本,我不得不做一些调整。做最适合你的场景的事情,这个讨论可能会帮助你看到一些没有 JSON.Net 的问题stackoverflow.com/questions/9573119/…
    • 为什么使用 ASCIIEncoding 而不是 UTF8?见stackoverflow.com/a/9254967/109392
    • +1 我第一次尝试使用WebClient 与 OP 类似,但没有让它工作。然后我尝试了这个解决方案,它就像一个魅力。我使用UTF8Encoding 而不是ASCIIEncoding 创建字节数组,因为我认为没有理由使用ASCII,这会以不可接受的方式减少可用字符。 ASCII 在字符集中只有 127 个字符。
    猜你喜欢
    • 2014-09-11
    • 2023-01-01
    • 2011-07-21
    • 2021-10-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多