Publicar JSON en una URL a través de WebClient en C #

89

Tengo un código JavaScript que necesito convertir a C #. Mi código JavaScript envía algún JSON a un servicio web que se ha creado. Este código JavaScript funciona bien y se parece a lo siguiente:

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");
}

Estoy tratando de averiguar cómo convertir esto a C #. Mi aplicación usa .NET 2.0. Por lo que puedo decir, necesito hacer algo como lo siguiente:

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

Estoy un poco estancado en este punto. No estoy seguro de cómo jsondebería verse. No estoy seguro de si necesito configurar el tipo de contenido. Si lo hago, no estoy seguro de cómo hacerlo. Yo también vi UploadData. Entonces, no estoy seguro de si estoy usando el método correcto. En cierto sentido, la serialización de mis datos es mi problema.

¿Alguien puede decirme qué me estoy perdiendo aquí?

¡Gracias!

Fan de las anguilas
fuente

Respuestas:

70

Necesita un serializador json para analizar su contenido, probablemente ya lo tenga, para su pregunta inicial sobre cómo realizar una solicitud, esta podría ser una idea:

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();

Espero eso ayude,

Jorge Alvarado
fuente
1
¿Cómo debería verse "parsedContent"? Desafortunadamente, necesito crear manualmente mi JSON en este escenario. Gracias.
Eels Fan
¿Puede verse como JSON? ¿O necesito hacer algún tipo de codificación especial? Es a lo que me refiero.
Eels Fan
@EelsFan generalmente no es un problema para elegir cualquier analizador JSON, siempre puede JSON.Net analizar un objeto .net en JSON, pero en mi experiencia había algunos servicios en la nube que tenían una versión diferente del analizador JSON y tuve que hacer algunos retoques. Haga lo que sea mejor para su escenario, esta discusión también podría ayudarlo a ver algunos problemas sin JSON.Net stackoverflow.com/questions/9573119/…
Jorge Alvarado
5
¿Por qué utiliza ASCIIEncoding y no UTF8? Consulte stackoverflow.com/a/9254967/109392 .
asombro
2
+1 Primero probé un uso similar al de OP WebClient, y no lo conseguí. Luego probé esta solución y funcionó a las mil maravillas. Estaba usando en UTF8Encodinglugar de ASCIIEncodingcrear la matriz de bytes, porque no veo ninguna razón para usar ASCII, lo que reduce los caracteres disponibles de una manera que es inaceptable. ASCII solo tiene 127 caracteres en el juego de caracteres.
asombro
197

La pregunta ya está respondida pero creo que encontré la solución que es más simple y más relevante para el título de la pregunta, aquí está:

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

PD: En la mayoría de las implementaciones de .net, pero no en todas, WebClient es IDisposable, por lo que, por supuesto, es mejor hacer 'using' o 'Dispose' en él. Sin embargo, en este caso particular no es realmente necesario .

sarh
fuente
1
Y, para que su json sea "legible": (en vb.net) Dim json = <JSON> {"field1": "value1", "status": "pendiente", "objField": {"field2": true} } </JSON> .ToString
foxontherock
Pero, ¿qué pasa con la inerporación de parámetros en esa cadena json?
Tali B.
74

El siguiente ejemplo demuestra cómo PUBLICAR un JSON a través del método WebClient.UploadString :

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);
}

Requisitos previos: biblioteca Json.NET

Vadim Gremyachev
fuente
4
Creo que debería ser UploadStringAsync si está utilizando el evento completado.
Sam Mackrill
Puede omitir el POSTargumento ya que UploadStringimplícitamente utiliza este método como predeterminado. Además, es posible que desee agregar client.Headers.Add(HttpRequestHeader.Accept, "application/json");si lo espera JSONcomo devolución.
jimasun
¿WebClient realmente implementa IDisposable? Estoy trabajando en .NET Framework 4.7.1 unos años después y no lo veo.
burbujeo
2
@bubbleking Hice clic en F12 en WebClient y veo que es un componente y los implementos de componentes IDisposablepublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
Lars Persson