如何使用C#将JSON发布到服务器?

这是我正在使用的代码:

// create a request HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); request.KeepAlive = false; request.ProtocolVersion = HttpVersion.Version10; request.Method = "POST"; // turn our request string into a byte stream byte[] postBytes = Encoding.UTF8.GetBytes(json); // this is important - make sure you specify type this way request.ContentType = "application/json; charset=UTF-8"; request.Accept = "application/json"; request.ContentLength = postBytes.Length; request.CookieContainer = Cookies; request.UserAgent = currentUserAgent; Stream requestStream = request.GetRequestStream(); // now send it requestStream.Write(postBytes, 0, postBytes.Length); requestStream.Close(); // grab te response and print it out to the console along with the status code HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string result; using (StreamReader rdr = new StreamReader(response.GetResponseStream())) { result = rdr.ReadToEnd(); } return result; 

当我运行它时,我总是得到500内部服务器错误。

我究竟做错了什么?

我这样做并且正在工作的方式是:

 var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url"); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = "POST"; using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { string json = "{\"user\":\"test\"," + "\"password\":\"bla\"}"; streamWriter.Write(json); streamWriter.Flush(); streamWriter.Close(); } var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); } 

我写了一个库以更简单的方式执行此任务,它位于: https : //github.com/ademargomes/JsonRequest

希望能帮助到你。

通过利用JavaScriptSerializerSerialize方法提供对象到JSON的隐式转换,可以改进Ademar的解决方案。

此外,可以利用using语句的默认function,以省略显式调用FlushClose

 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 { user = "Foo", password = "Baz" }); streamWriter.Write(json); } var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); } 

继Sean的post之后,没有必要嵌套using语句。 通过using StreamWriter,它将在块的末尾被刷新和关闭,因此不需要显式调用Flush()Close()方法:

 var request = (HttpWebRequest)WebRequest.Create("http://url"); request.ContentType = "application/json"; request.Method = "POST"; using (var streamWriter = new StreamWriter(request.GetRequestStream())) { string json = new JavaScriptSerializer().Serialize(new { user = "Foo", password = "Baz" }); streamWriter.Write(json); } var response = (HttpWebResponse)request.GetResponse(); using (var streamReader = new StreamReader(response.GetResponseStream())) { var result = streamReader.ReadToEnd(); } 

照顾您正在使用的内容类型:

 application/json 

资料来源:

RFC4627

其他post

如果需要异步调用则使用

 var request = HttpWebRequest.Create("http://www.maplegraphservices.com/tokkri/webservices/updateProfile.php?oldEmailID=" + App.currentUser.email) as HttpWebRequest; request.Method = "POST"; request.ContentType = "text/json"; request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request); private void GetRequestStreamCallback(IAsyncResult asynchronousResult) { HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; // End the stream request operation Stream postStream = request.EndGetRequestStream(asynchronousResult); // Create the post data string postData = JsonConvert.SerializeObject(edit).ToString(); byte[] byteArray = Encoding.UTF8.GetBytes(postData); postStream.Write(byteArray, 0, byteArray.Length); postStream.Close(); //Start the web request request.BeginGetResponse(new AsyncCallback(GetResponceStreamCallback), request); } void GetResponceStreamCallback(IAsyncResult callbackResult) { HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState; HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult); using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream())) { string result = httpWebStreamReader.ReadToEnd(); stat.Text = result; } } 

HttpClient类型是一个较新的实现,然后是WebClientHttpWebRequest

您只需使用以下行。

 string myJson = "{'Username': 'myusername','Password':'pass'}"; using (var client = new HttpClient()) { var response = await client.PostAsync( "http://yourUrl", new StringContent(myJson, Encoding.UTF8, "application/json")); } 

在此处输入图像描述

当你需要更多的HttpClient时,建议只创建一个实例并重用它或使用新的HttpClientFactory。

我最近提出了一种更简单的发布JSON的方法,还有从我的应用程序中的模型转换的额外步骤。 请注意,您必须为控制器创建模型[JsonObject]以获取值并进行转换。

请求:

  var model = new MyModel(); using (var client = new HttpClient()) { var uri = new Uri("XXXXXXXXX"); var json = new JavaScriptSerializer().Serialize(model); var stringContent = new StringContent(json, Encoding.UTF8, "application/json"); var response = await Client.PutAsync(uri,stringContent).Result; ... ... } 

模型:

 [JsonObject] [Serializable] public class MyModel { public Decimal Value { get; set; } public string Project { get; set; } public string FilePath { get; set; } public string FileName { get; set; } } 

服务器端:

 [HttpPut] public async Task PutApi([FromBody]MyModel model) { ... ... } 

未提及此选项 :

 using (var client = new HttpClient()) { client.BaseAddress = new Uri("http://localhost:9000/"); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var foo = new User { user = "Foo", password = "Baz" } await client.PostAsJsonAsync("users/add", foo); } 

实现这一目的的一些不同和干净的方法是使用像这样的HttpClient:

 public async Task PostResult(string url, ResultObject resultObject) { using (var client = new HttpClient()) { HttpResponseMessage response = new HttpResponseMessage(); try { response = await client.PostAsJsonAsync(url, resultObject); } catch (Exception ex) { throw ex } return response; } } 

var data = Encoding.ASCII.GetBytes(json);

byte[] postBytes = Encoding.UTF8.GetBytes(json);

使用ASCII而不是UFT8

我最终通过包含.Result在同步模式下调用

 HttpResponseMessage response = null; try { using (var client = new HttpClient()) { response = client.PostAsync( "http://localhost:8000/....", new StringContent(myJson,Encoding.UTF8,"application/json")).Result; if (response.IsSuccessStatusCode) { MessageBox.Show("OK"); } else { MessageBox.Show("NOK"); } } } catch (Exception ex) { MessageBox.Show("ERROR"); }