POSTANDO JSON para URL via WebClient em C #

87

Tenho alguns códigos JavaScript que preciso converter para C #. Meu código JavaScript faz um POST de algum JSON em um serviço da web que foi criado. Este código JavaScript funciona bem e se parece com o seguinte:

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

Estou tentando descobrir como converter isso para C #. Meu aplicativo está usando .NET 2.0. Pelo que posso dizer, preciso fazer algo como o seguinte:

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

Estou um pouco preso neste ponto. Não tenho certeza de como jsondeveria ser. Não tenho certeza se preciso definir o tipo de conteúdo. Se eu fizer isso, não tenho certeza de como fazer isso. Eu também vi UploadData. Portanto, não tenho certeza se estou usando o método certo. Em certo sentido, a serialização dos meus dados é meu problema.

Alguém pode me dizer o que estou perdendo aqui?

Obrigado!

Leque de enguias
fonte

Respostas:

69

Você precisa de um serializador json para analisar seu conteúdo, provavelmente você já o tem, para sua pergunta inicial sobre como fazer uma solicitação, esta pode ser uma ideia:

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

espero que ajude,

Jorge Alvarado
fonte
1
como deve ser "parsedContent"? Infelizmente, preciso criar manualmente meu JSON neste cenário. Obrigado.
Eels Fan
Ele pode se parecer com JSON? Ou eu preciso fazer algum tipo de codificação especial é o que estou chegando.
Eels Fan
@EelsFan geralmente não é um problema para escolher qualquer analisador JSON, você sempre pode JSON.Net para analisar um objeto .net em JSON, mas na minha experiência, havia alguns serviços em nuvem que tinham uma versão diferente do analisador JSON e tive que fazer alguns ajustes. Faça o que for melhor para o seu cenário, esta discussão pode ajudá-lo a ver alguns problemas sem JSON.Net stackoverflow.com/questions/9573119/…
Jorge Alvarado
5
Por que você usa ASCIIEncoding e não UTF8? Consulte stackoverflow.com/a/9254967/109392 .
espantoso
2
1 Eu primeiro tentei semelhante ao uso de OP WebClient, e não consegui fazer funcionar. Então tentei esta solução e funcionou como um encanto. Eu estava usando em UTF8Encodingvez de ASCIIEncodingpara criar a matriz de bytes, porque não vejo razão para usar ASCII, o que reduz os caracteres disponíveis de uma forma que é inaceitável. ASCII tem apenas 127 caracteres no conjunto de caracteres.
assombrado
191

A pergunta já foi respondida, mas acho que encontrei a solução que é mais simples e mais relevante para o título da pergunta, aqui está:

var cli = new WebClient();
cli.Headers[HttpRequestHeader.ContentType] = "application/json";
string response = cli.UploadString("http://some/address", "{some:\"json data\"}");
sarh
fonte
1
E, para tornar seu json "legível": (em vb.net) Dim json = <JSON> {"campo1": "valor1", "status": "pendente", "objField": {"campo2": verdadeiro} } </JSON> .ToString
foxontherock
Mas e quanto a interpolação de parâmetros nessa string json?
Tali B.
72

O exemplo a seguir demonstra como fazer um POST de JSON por meio do método 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é-requisitos: biblioteca Json.NET

Vadim Gremyachev
fonte
4
Acho que deve ser UploadStringAsync se você estiver usando o evento concluído.
Sam Mackrill
Você pode omitir o POSTargumento, pois UploadStringusa esse método implicitamente como padrão. Além disso, você pode querer adicionar client.Headers.Add(HttpRequestHeader.Accept, "application/json");se espera um JSONretorno.
jimasun
O WebClient realmente implementa IDisposable? Estou trabalhando no .NET Framework 4.7.1 alguns anos depois e não consigo ver.
bolha em
2
@bubbleking Cliquei em F12 em WebClient e vi que é um componente e implementa IDisposablepublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
Lars Persson