Comment publier JSON d'un serveur à l'aide de C#?
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;
Quand je suis à court de cela, je suis toujours 500 erreur interne du serveur.
Ce que je fais mal?
- Tout d'abord, assurez-vous que les données que vous publiez est ce que le serveur attend.
- en fait, il semble que j'ai été l'affichage des données non valides...
- Pour la facilité de travail, vous pouvez ajouter des json de la bibliothèque de visual studio
- Le serveur ne doit pas se bloquer avec des données incorrectes. Remplir un rapport de bogue.
Vous devez vous connecter pour publier un commentaire.
La façon dont je le fais et cela fonctionne:
J'ai écrit une bibliothèque pour effectuer cette tâche de manière plus simple, c'est ici: https://github.com/ademargomes/JsonRequest
Espère que cela aide.
Close
lorsque dansusing
?public ActionResult SomeAction(string key)
?async
méthodes où il y a de disponible est une bonne chose à faire si vous êtes dans un async contexte. Une autre chose que je voudrais souligner est que l'utilisation devar httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url");
pourquoi voulez-vous créer unWebRequest
instance, puis de l'analyser pourHttpWebRequest
alors que vous avez une méthodeCreateHttp
? Vous permet d'économiser de l'analyse de l'objet. e.gvar httpWebRequest = WebRequest.CreateHttp("http://url");
Ademar de la solution peut être améliorée par l'optimisation des
JavaScriptSerializer
'sSerialize
méthode pour fournir la conversion implicite de l'objet JSON.En outre, il est possible de tirer parti de la
using
déclaration de la fonctionnalité par défaut afin d'omettre appelant explicitementFlush
etClose
.application/json
est correct.JavaScriptSerializer
ne fonctionne pas sur Unity3D. J'ai utiliséusing System.Web.Script.Serialization
directive, mais de l'espace de nomsWeb
n'existe pas.La
HttpClient
type est une nouvelle de mise en œuvre de laWebClient
etHttpWebRequest
.Vous pouvez simplement utiliser les lignes suivantes.
Lorsque vous avez besoin de votre
HttpClient
plus d'une fois, il est recommandé de n'en créer qu'une seule instance et de le réutiliser ou de l'utilisation de la nouvelleHttpClientFactory
.HttpClientFactory
. Je n'ai pas lu toutes les réponses dans la question, mais je pense qu'il doit être mis à jour comme il ne mentionne pas l'usine.Plus à Sean post, il n'est pas nécessaire de nid à l'aide de relevés. Par
using
le StreamWriter il sera vidé et fermé à la fin du bloc, donc pas besoin d'appeler explicitement laFlush()
etClose()
méthodes:Prendre soin de le Type de Contenu que vous utilisez :
Sources :
RFC4627
D'autres post
Si vous avez besoin d'appeler de manière asynchrone puis utilisez
J'ai récemment est venu avec un moyen beaucoup plus simple pour poster un JSON, avec l'étape supplémentaire de la conversion à partir d'un modèle dans mon application. Notez que vous avez à faire le modèle [JsonObject] pour votre contrôleur pour obtenir des valeurs et de faire la conversion.
Demande:
Modèle:
Côté serveur:
Cette option n'est pas mentionné:
Différents et propre façon d'y parvenir est par l'utilisation de HttpClient comme ceci:
PostAsJsonAsync
n'est plus disponible depuis .NET 4.5.2. UtilisationPostAsync
à la place. Plus iciusing
instruction de ce genreIDisposable
interface pour une raisonJ'ai finalement invoqué en mode de synchronisation, y compris par la .Résultat
var data = Encoding.ASCII.GetBytes(json);
byte[] postBytes = Encoding.UTF8.GetBytes(json);
Utiliser ASCII au lieu de UFT8
AVERTISSEMENT! J'ai une très forte position sur ce sujet.
.NET web existants les clients ne sont pas développeur sympathique! WebRequest & WebClient sont d'excellents exemples de "comment déjouer un développeur". Ils sont prolixes & compliqué de travailler avec; quand tout ce que vous voulez faire, c'est une simple requête Post en C#. HttpClient va d'une certaine manière dans la résolution de ces problèmes, mais il est encore loin. Sur le dessus de la documentation de Microsoft est mal ... vraiment mal; sauf si vous voulez parcourir des pages et des pages de techniques de blurb.
Open-source à la rescousse. Il y a trois excellents open-source, gratuit NuGet les bibliothèques comme des alternatives. Dieu merci! Ces sont tous bien pris en charge, documenté et oui, facile de correction...super facile à travailler avec.
Il n'y a pas beaucoup d'entre eux, mais je donnerais ServiceStack.Texte le léger avantage ...
Ok - donc, ce n'est une Requête Post en JSON ressembler au sein de ServiceStack.Texte?
Qui est une ligne de code. Concis & facile! Comparer ci-dessus pour .NET Http bibliothèques.