Voici le code que j'utilise:
// 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;
Lorsque j'exécute cela, j'obtiens toujours 500 erreurs de serveur interne.
Qu'est-ce que je fais mal?
c#
json
post
httpwebrequest
Arsen Zahray
la source
la source
Réponses:
La façon dont je le fais et fonctionne est:
J'ai écrit une bibliothèque pour effectuer cette tâche de manière plus simple, c'est ici: https://github.com/ademargomes/JsonRequest
J'espère que ça aide.
la source
La solution d'Ademar peut être améliorée en exploitant
JavaScriptSerializer
laSerialize
méthode de pour fournir une conversion implicite de l'objet en JSON.De plus, il est possible de tirer parti des
using
fonctionnalités par défaut de l' instruction afin d'omettre explicitement d'appelerFlush
etClose
.la source
application/json
est correct.Le
HttpClient
type est une implémentation plus récente que leWebClient
etHttpWebRequest
.Vous pouvez simplement utiliser les lignes suivantes.
Lorsque vous avez besoin de
HttpClient
plusieurs fois, il est recommandé de ne créer qu'une seule instance et de la réutiliser ou d'utiliser la nouvelleHttpClientFactory
.la source
HttpClientFactory
. Je n'ai pas lu toutes les réponses dans le problème lié, mais je pense qu'il doit être mis à jour car il ne mentionne pas l'usine.Suite à la publication de Sean, il n'est pas nécessaire d'imbriquer les instructions using. Par
using
StreamWriter, il sera vidé et fermé à la fin du bloc, donc pas besoin d'appeler explicitement les méthodesFlush()
etClose()
:la source
Si vous devez appeler de manière asynchrone, utilisez
la source
postStream.Write(postData);
- et selon l'API, vous devrez peut-être utiliser unrequest.ContentType = "application/json";
au lieu detext/json
.Prenez soin du type de contenu que vous utilisez:
Sources :
RFC4627
Autre poste
la source
J'ai récemment trouvé un moyen beaucoup plus simple de publier un JSON, avec l'étape supplémentaire de conversion à partir d'un modèle dans mon application. Notez que vous devez créer le modèle [JsonObject] pour que votre contrôleur obtienne les valeurs et effectue la conversion.
Demande:
Modèle:
Du côté serveur:
la source
Cette option n'est pas mentionnée:
la source
Une façon différente et propre d'y parvenir est d'utiliser HttpClient comme ceci:
la source
PostAsJsonAsync
n'est plus disponible depuis .NET 4.5.2. UtilisezPostAsync
plutôt. Plus iciusing
déclaration comme celle-ciIDisposable
interface pour une raisonAVERTISSEMENT! J'ai une opinion très forte sur ce sujet.
Les clients Web existants de .NET ne sont pas adaptés aux développeurs! WebRequest et WebClient sont des exemples de "comment frustrer un développeur". Ils sont verbeux et compliqués à travailler; quand tout ce que vous voulez faire est une simple demande de publication en C #. HttpClient va dans une certaine mesure pour résoudre ces problèmes, mais il est toujours . En plus de cela, la documentation de Microsoft est mauvaise… vraiment mauvaise; sauf si vous souhaitez parcourir les pages et les pages de texte technique.
Open-source à la rescousse. Il existe trois excellentes bibliothèques NuGet libres et open source comme alternatives. Dieu merci! Tout cela est bien pris en charge, documenté et oui, facile - correction… super facile - avec lequel travailler.
Il n'y a pas grand-chose entre eux, mais je donnerais à ServiceStack.Text le léger avantage…
Ok - alors à quoi ressemble une demande de publication dans JSON dans ServiceStack.Text?
C'est une ligne de code. Concis et facile! Comparez ce qui précède aux bibliothèques Http de .NET.
la source
J'ai finalement invoqué en mode sync en incluant le .Result
la source
var data = Encoding.ASCII.GetBytes(json);
byte[] postBytes = Encoding.UTF8.GetBytes(json);
Utilisez ASCII au lieu de UFT8
la source