web-dev-qa-db-fra.com

Envoi de JSON à une URL via WebClient en C #

J'ai du code JavaScript que je dois convertir en C #. Mon code JavaScript envoie du JSON à un service Web créé. Ce code JavaScript fonctionne bien et se présente comme 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 ceci:

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 suis pas sûr de ce à quoi devrait ressembler json. Je ne suis pas sûr de devoir 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 suis pas sûr si j'utilise même la bonne méthode. En un sens, la sérialisation de mes données est mon problème.

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

Je vous remercie!

81
Eels Fan

Vous avez besoin d'un sérialiseur json pour analyser votre contenu. Vous l'avez probablement déjà, pour votre première question sur la manière 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 ça aide,

67
Jorge Alvarado

La question a déjà reçu une réponse, mais je pense avoir trouvé la solution plus simple et 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\"}");
175
sarh

L'exemple suivant montre comment POST un JSON via 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

63
Vadim Gremyachev