Aquí está el código que estoy usando:
// 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;
Cuando ejecuto esto, siempre recibo 500 errores internos del servidor.
¿Qué estoy haciendo mal?
c#
json
post
httpwebrequest
Arsen Zahray
fuente
fuente
Respuestas:
La forma en que lo hago y funciona es:
Escribí una biblioteca para realizar esta tarea de una manera más simple, está aquí: https://github.com/ademargomes/JsonRequest
Espero eso ayude.
fuente
La solución de Ademar se puede mejorar aprovechando
JavaScriptSerializer
elSerialize
método para proporcionar la conversión implícita del objeto a JSON.Además, es posible aprovechar la
using
funcionalidad predeterminada de la declaración para omitir llamar explícitamenteFlush
yClose
.fuente
application/json
es correcto.El
HttpClient
tipo es una implementación más nueva que laWebClient
yHttpWebRequest
.Simplemente puede usar las siguientes líneas.
Cuando necesite su
HttpClient
más de una vez, se recomienda crear solo una instancia y reutilizarla o usar la nuevaHttpClientFactory
.fuente
HttpClientFactory
. No leí todas las respuestas en el problema vinculado, pero creo que necesita actualizarse, ya que no menciona la fábrica.Además de la publicación de Sean, no es necesario anidar las declaraciones de uso. Por
using
el StreamWriter que se vaciará y cerrado en el extremo del bloque así que no hay necesidad de explícitamente llamar alFlush()
yClose()
métodos:fuente
Si necesita llamar de forma asíncrona, use
fuente
postStream.Write(postData);
, y dependiendo de la API, podría tener que usar un enrequest.ContentType = "application/json";
lugar detext/json
.Cuide el tipo de contenido que está utilizando:
Fuentes:
RFC4627
Otra publicación
fuente
Recientemente se me ocurrió una forma mucho más simple de publicar un JSON, con el paso adicional de convertir de un modelo en mi aplicación. Tenga en cuenta que debe crear el modelo [JsonObject] para que su controlador obtenga los valores y realice la conversión.
Solicitud:
Modelo:
Lado del servidor:
fuente
Esta opción no se menciona:
fuente
Una forma diferente y limpia de lograr esto es mediante el uso de HttpClient de esta manera:
fuente
PostAsJsonAsync
ya no está disponible desde .NET 4.5.2. Usar en suPostAsync
lugar. Más aquíusing
declaración como estaIDisposable
interfaz por una razón¡ADVERTENCIA! Tengo una opinión muy fuerte sobre este tema.
¡Los clientes web existentes de .NET no son compatibles con los desarrolladores! WebRequest y WebClient son excelentes ejemplos de "cómo frustrar a un desarrollador". Son detallados y complicados para trabajar; cuando todo lo que quiere hacer es una simple solicitud de publicación en C #. HttpClient ayuda a resolver estos problemas, pero aún se queda corto. Además de eso, la documentación de Microsoft es mala ... realmente mala; a menos que quiera examinar páginas y páginas de publicidad técnica.
De código abierto al rescate. Hay tres excelentes bibliotecas NuGet gratuitas de código abierto como alternativas. ¡Gracias a dios! Todos estos están bien soportados, documentados y sí, fáciles de corregir ... súper fáciles de trabajar.
No hay mucho entre ellos, pero le daría a ServiceStack.Text una ligera ventaja ...
Ok, entonces, ¿cómo se ve una solicitud de publicación en JSON dentro de ServiceStack.Text?
Esa es una línea de código. Conciso y fácil! Compare lo anterior con las bibliotecas Http de .NET.
fuente
Finalmente invoqué en modo de sincronización incluyendo el .Result
fuente
var data = Encoding.ASCII.GetBytes(json);
byte[] postBytes = Encoding.UTF8.GetBytes(json);
Use ASCII en lugar de UFT8
fuente