如何使用 C# 在 POST 请求中发送 json 数据 [重复]

Posted

技术标签:

【中文标题】如何使用 C# 在 POST 请求中发送 json 数据 [重复]【英文标题】:How to send json data in POST request using C# [duplicate] 【发布时间】:2017-11-24 09:18:44 【问题描述】:

我想使用 C# 在 POST 请求中发送 json 数据。

我尝试了几种方法,但面临很多问题。我需要使用请求正文作为来自字符串的原始 json 和来自 json 文件的 json 数据来请求。

如何使用这两种数据形式发送请求。

Ex: json 中的认证请求体 --> "Username":"myusername","Password":"pass"

对于其他 API,请求正文应从外部 json 文件中检索。

【问题讨论】:

你能把你的代码放在这里,我们很容易理解 【参考方案1】:

你可以用HttpWebRequest做到这一点:

var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://yourUrl");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))

    string json = new javascriptSerializer().Serialize(new
            
                Username = "myusername",
                Password = "pass"
            );
    streamWriter.Write(json);
    streamWriter.Flush();
    streamWriter.Close();


var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))

    var result = streamReader.ReadToEnd();

【讨论】:

这显示错误:An unhandled exception of type 'System.Net.WebException' occurred in System.dll Additional information: The underlying connection was closed: An unexpected error occurred on a send 涉及 GetResponse()。我只添加了一个额外的标头参数 - API Key 你可以试试 httpWebRequest.KeepAlive = false; 吗?我已经更新了答案。 不,同一行中仍然有同样的错误! 安全协议会导致这个错误,你也可以试试ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 |安全协议类型.Tls11 |安全协议类型.Tls;。更新了答案。 据我了解,如果 Streamwriter 是使用 using 创建的,则不需要 Flush and Close。【参考方案2】:

您可以使用HttpClientRestSharp。由于我不知道你的代码是什么,这里是一个使用HttpClient的例子:

using (var client = new HttpClient())

    // This would be the like http://www.uber.com
    client.BaseAddress = new Uri("Base Address/URL Address");

    // serialize your json using newtonsoft json serializer then add it to the StringContent
    var content = new StringContent(YourJson, Encoding.UTF8, "application/json") 

    // method address would be like api/callUber:SomePort for example
    var result = await client.PostAsync("Method Address", content);
    string resultContent = await result.Content.ReadAsStringAsync();   

【讨论】:

^^不讨厌,但现在它是我帖子的副本^^ @NtFreX 这就是我投票支持它的原因:)【参考方案3】:

这对我有用。

var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
using (var streamWriter = new 

StreamWriter(httpWebRequest.GetRequestStream()))

    string json = new JavaScriptSerializer().Serialize(new
                
                    Username = "myusername",
                    Password = "password"
                );

    streamWriter.Write(json);

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))

    var result = streamReader.ReadToEnd();

【讨论】:

这也显示与上述答案相同的错误:System.dll 中发生了“System.Net.WebException”类型的未处理异常附加信息:底层连接已关闭:发生意外错误当涉及到 GetResponse() 时发送。我只添加了一个额外的标头参数 - API Key

以上是关于如何使用 C# 在 POST 请求中发送 json 数据 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 HttpClient 和 C# 在 post 请求中发送 json

C# HttpClient:如何在 POST 请求中发送查询字符串

使用 C# 和 HttpWebRequest 向端点发送 POST 请求

带有包含数组的 Json 的 C# POST 请求

求一个c#的 post请求 json 并且接收返回json数据的一个demo。

如何在 Swift 3 中使用 Alamofire 在 POST 请求中将给定的 JSON 作为参数发送?