¿Cómo obtener la respuesta json usando system.net.webrequest en c #?

80

Necesito obtener datos json de un dominio externo. Usé webrequest para obtener la respuesta de un sitio web. Aquí está el código:

var request = WebRequest.Create(url);
string text;
var response = (HttpWebResponse) request.GetResponse();

using (var sr = new StreamReader(response.GetResponseStream()))
{
    text = sr.ReadToEnd();
}

¿Alguien sabe por qué no puedo obtener los datos json?

h3n
fuente
¿Alguien sabe por qué no puedo obtener los datos json?
h3n
6
Necesitas using (var response = request.GetResponse()){ ... }. Puede que no resuelva el problema, pero evita la pérdida de recursos.
John Saunders

Respuestas:

67

Debe solicitar explícitamente el tipo de contenido.

Agrega esta línea:

 request.ContentType = "application/json; charset=utf-8";
En el lugar apropiado

Oren A
fuente
¿Es posible pasar el parámetro con esta solicitud?
Jidheesh Rajan
7
Request Content-Type describe el tipo de cuerpo de la solicitud. Se utiliza para decirle al servidor en qué formato se envían los datos al servidor. No tiene nada que ver con el tipo de respuesta de contenido. El cliente puede solicitar responder con tipos específicos usando el Acceptencabezado, pero el servidor puede ignorarlo por otras razones.
temoto
Sí Jidheesh, vea esto stackoverflow.com/questions/10263082/…
Zameer Ansari
Sé que esta es una respuesta antigua, pero para completar quería responder a @SHEKHARSHETE: puede usar algo como el excelente NewtonSoft JSON.Net que hará el trabajo por usted y recomiendo leer las guías útiles para ejercitar cómo hacer esto aquí: newtonsoft.com/json
Tahir Khalid
73

Algunas API quieren que proporciones el encabezado "Aceptar" apropiado en la solicitud para obtener el tipo de respuesta deseado.

Por ejemplo, si una API puede devolver datos en XML y JSON y desea obtener el resultado JSON, deberá establecer la HttpWebRequest.Acceptpropiedad en "application / json" .

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(requestUri);
httpWebRequest.Method = WebRequestMethods.Http.Get;
httpWebRequest.Accept = "application/json";
Martín Buberl
fuente
1
¿Es posible pasar el parámetro con esto?
Jidheesh Rajan
Quizás pueda intentar agregar sus parámetros a requestUriIe localhost / api / product / 123
DmitryBoyko
@JidheeshRajan Vea esta pregunta / respuestas sobre cómo agregar parámetros a WebRequest stackoverflow.com/questions/3279888/…
Martin Buberl
1
Agregar solo request.ContentType = "application / json; no fue suficiente para mí, así que creo que su solución es la correcta.
Campinho
Esta respuesta debe aceptarse porque la respuesta aceptada actual no es correcta. Otro ejemplo de no usar "Aceptar" cuando sea apropiado ...
Arkaine55