Esta es la primera vez que uso JSON System.Net
y WebRequest
en cualquiera de mis aplicaciones. Se supone que mi aplicación envía una carga útil JSON, similar a la que se muestra a continuación, a un servidor de autenticación:
{
"agent": {
"name": "Agent Name",
"version": 1
},
"username": "Username",
"password": "User Password",
"token": "xxxxxx"
}
Para crear esta carga útil, utilicé la JSON.NET
biblioteca. ¿Cómo enviaría estos datos al servidor de autenticación y recibiría su respuesta JSON? Esto es lo que he visto en algunos ejemplos, pero sin contenido JSON:
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();
Sin embargo, esto parece ser mucho código comparado con el uso de otros lenguajes que he usado en el pasado. ¿Estoy haciendo esto correctamente? ¿Y cómo obtendría la respuesta JSON para poder analizarla?
Gracias, Elite.
Código actualizado
// 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();
}
}
WebClient.UploadString(JsonConvert.SerializeObjectobj(yourobj))
oHttpClient.PostAsJsonAsync
Respuestas:
Me encontré usando HttpClient biblioteca para consultar las API RESTful ya que el código es muy sencillo y completamente asincrónico.
(Editar: Agregar JSON de la pregunta para mayor claridad)
{ "agent": { "name": "Agent Name", "version": 1 }, "username": "Username", "password": "User Password", "token": "xxxxxx" }
Con dos clases que representan la estructura JSON que publicó, que puede verse así:
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; } }
podría tener un método como este, que haría su solicitud 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 } }
fuente
JsonProperty
para cada propiedad. Simplemente use el CamelCasePropertyNamesContractResolver integrado de Json.Net o un personalizadoNamingStrategy
para personalizar el proceso de serializaciónusing
conHttpClient
. Ver: aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongCon el paquete JSON.NET NuGet y los tipos anónimos, puede simplificar lo que sugieren los otros carteles:
// ... string payload = JsonConvert.SerializeObject(new { agent = new { name = "Agent Name", version = 1, }, username = "username", password = "password", token = "xxxxx", }); var client = new HttpClient(); var content = new StringContent(payload, Encoding.UTF8, "application/json"); HttpResponseMessage response = await client.PostAsync(uri, content); // ...
fuente
Puede construir su
HttpContent
usando la combinación deJObject
para evitarJProperty
y luego invocarloToString()
cuando construyaStringContent
:/*{ "agent": { "name": "Agent Name", "version": 1 }, "username": "Username", "password": "User Password", "token": "xxxxxx" }*/ JObject payLoad = new JObject( new JProperty("agent", new JObject( new JProperty("name", "Agent Name"), new JProperty("version", 1) ), new JProperty("username", "Username"), new JProperty("password", "User Password"), new JProperty("token", "xxxxxx") ) ); using (HttpClient client = new HttpClient()) { var httpContent = new StringContent(payLoad.ToString(), Encoding.UTF8, "application/json"); using (HttpResponseMessage response = await client.PostAsync(requestUri, httpContent)) { response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); return JObject.Parse(responseBody); } }
fuente
Exception while executing function. Newtonsoft.Json: Can not add Newtonsoft.Json.Linq.JProperty to Newtonsoft.Json.Linq.JArray
errores?También puede utilizar el método PostAsJsonAsync () disponible en HttpClient ()
fuente
var obj= new Credentials { Agent = new Agent { Name = "Agent Name", Version = 1 }, Username = "Username", Password = "User Password", Token = "xxxxx" };
Y luego, sin tener que convertirlo a httpContent, puede usar PostAsJsonAsync () pasando la URL del extremo y el propio objeto JSON convertido.