这是我第一次在任何应用程序中使用JSON System.Net和WebRequest。我的应用程序应该将JSON有效负载(类似于以下内容)发送到身份验证服务器:
System.Net
WebRequest
{ "agent": { "name": "Agent Name", "version": 1 }, "username": "Username", "password": "User Password", "token": "xxxxxx" }
为了创建此有效负载,我使用了JSON.NET库。如何将这些数据发送到身份验证服务器并接收其JSON响应?这是一些示例中看到的内容,但没有JSON内容:
JSON.NET
var http = (HttpWebRequest)WebRequest.Create(new Uri(baseUrl)); http.Accept = "application/json"; http.ContentType = "application/json"; http.Method = "POST"; string parsedContent = "Parsed JSON Content needs to go here"; 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();
但是,这似乎与使用我过去使用的其他语言相比有很多代码缺陷。我这样做正确吗?以及如何获取JSON响应以进行解析?
谢谢,精英。
更新的代码
// Send the POST Request to the Authentication Server // Error Here string json = await Task.Run(() => JsonConvert.SerializeObject(createLoginPayload(usernameTextBox.Text, password))); var httpContent = new StringContent(json, Encoding.UTF8, "application/json"); using (var httpClient = new HttpClient()) { // Error here var httpResponse = await httpClient.PostAsync("URL HERE", httpContent); if (httpResponse.Content != null) { // Error Here var responseContent = await httpResponse.Content.ReadAsStringAsync(); } }
我发现自己使用HttpClient库查询RESTful API,因为代码非常简单并且完全异步。
(编辑:为了清楚起见,从问题中添加JSON)
使用两个代表您发布的JSON结构的类,看起来像这样:
public class Credentials { [JsonProperty("agent")] public Agent Agent { get; set; } [JsonProperty("username")] public string Username { get; set; } [JsonProperty("password")] public string Password { get; set; } [JsonProperty("token")] public string Token { get; set; } } public class Agent { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("version")] public int Version { get; set; } }
您可能有一个像这样的方法,它将执行您的POST请求:
var payload = new Credentials { Agent = new Agent { Name = "Agent Name", Version = 1 }, Username = "Username", Password = "User Password", Token = "xxxxx" }; // Serialize our concrete class into a JSON String var stringPayload = await Task.Run(() => JsonConvert.SerializeObject(payload)); // Wrap our JSON inside a StringContent which then can be used by the HttpClient class var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json"); using (var httpClient = new HttpClient()) { // Do the actual request and await the response var httpResponse = await httpClient.PostAsync("http://localhost/api/path", httpContent); // If the response contains content we want to read it! if (httpResponse.Content != null) { var responseContent = await httpResponse.Content.ReadAsStringAsync(); // From here on you could deserialize the ResponseContent back again to a concrete C# type using Json.Net } }