POSTER JSON sur URL via WebClient en C #

89

J'ai du code JavaScript que je dois convertir en C #. Mon code JavaScript POST du JSON sur un service Web qui a été créé. Ce code JavaScript fonctionne correctement et ressemble à ce qui suit:

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

J'essaie de comprendre comment convertir cela en C #. Mon application utilise .NET 2.0. D'après ce que je peux dire, je dois faire quelque chose comme ce qui suit:

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

Je suis un peu coincé à ce stade. Je ne sais pas à quoi jsondevrait ressembler. Je ne sais pas si j'ai besoin de définir le type de contenu. Si je le fais, je ne sais pas comment faire cela. J'ai aussi vu UploadData. Donc, je ne sais pas si j'utilise même la bonne méthode. Dans un sens, la sérialisation de mes données est mon problème.

Quelqu'un peut-il me dire ce qui me manque ici?

Merci!

Fan d'anguilles
la source

Réponses:

70

Vous avez besoin d'un sérialiseur json pour analyser votre contenu, vous l'avez probablement déjà, pour votre question initiale sur la façon de faire une demande, cela pourrait être une idée:

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

J'espère que cela aide,

Jorge Alvarado
la source
1
à quoi doit ressembler "parsedContent"? Malheureusement, je dois créer manuellement mon JSON dans ce scénario. Merci.
Eels Fan
Cela peut-il ressembler à JSON? Ou dois-je faire une sorte d'encodage spécial est ce à quoi je veux en venir.
Eels Fan
@EelsFan n'est généralement pas un problème pour choisir un analyseur JSON, vous pouvez toujours JSON.Net pour analyser un objet .net en JSON, mais d'après mon expérience, certains services cloud avaient une version différente de l'analyseur JSON et j'ai dû en créer des ajustements. Faites ce qui est le mieux pour votre scénario, cette discussion pourrait vous aider aussi à voir certains problèmes sans JSON.Net stackoverflow.com/questions/9573119/…
Jorge Alvarado
5
Pourquoi utilisez-vous ASCIIEncoding, et non UTF8? Voir stackoverflow.com/a/9254967/109392 .
awe
2
+1 J'ai d'abord essayé une utilisation similaire à OP WebClient, et je ne l'ai pas fait fonctionner. Ensuite, j'ai essayé cette solution, et cela a fonctionné comme un charme. J'utilisais UTF8Encodingau lieu de ASCIIEncodingpour créer le tableau d'octets, car je ne vois aucune raison d'utiliser ASCII, qui réduit les caractères disponibles d'une manière inacceptable. ASCII n'a que 127 caractères dans le jeu de caractères.
awe
197

La question a déjà reçu une réponse mais je pense avoir trouvé la solution la plus simple et la plus pertinente pour le titre de la question, la voici:

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

PS: Dans la plupart des implémentations .net, mais pas dans toutes, WebClient est IDisposable, il est donc préférable de faire «utiliser» ou «éliminer» dessus. Cependant, dans ce cas particulier, ce n'est pas vraiment nécessaire .

sarh
la source
1
Et, pour rendre votre json "lisible": (dans vb.net) Dim json = <JSON> {"field1": "value1", "status": "pending", "objField": {"field2": true} } </JSON> .ToString
foxontherock
Mais qu'en est-il de l'inerpolation des paramètres dans cette chaîne json?
Tali B.
74

L'exemple suivant montre comment POST un JSON via la méthode 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);
}

Prérequis: bibliothèque Json.NET

Vadim Gremyachev
la source
4
Je pense que cela devrait être UploadStringAsync si vous utilisez l'événement terminé.
Sam Mackrill
Vous pouvez omettre l' POSTargument car il UploadStringutilise implicitement cette méthode par défaut. De plus, vous voudrez peut-être ajouter client.Headers.Add(HttpRequestHeader.Accept, "application/json");si vous prévoyez un JSONretour.
jimasun
WebClient implémente-t-il réellement IDisposable? Je travaille dans .NET Framework 4.7.1 quelques années plus tard et je ne le vois pas.
bubbleking
2
@bubbleking J'ai cliqué sur F12 sur WebClient et je vois que c'est un composant et un composant implémente IDisposablepublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
Lars Persson