Aqui está o código que estou usando:
// 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;
Quando estou executando isso, sempre recebo 500 erros internos do servidor.
O que estou fazendo de errado?
c#
json
post
httpwebrequest
Arsen Zahray
fonte
fonte
Respostas:
A maneira como faço e trabalho é:
Eu escrevi uma biblioteca para executar esta tarefa de uma maneira mais simples, está aqui: https://github.com/ademargomes/JsonRequest
Espero que ajude.
fonte
A solução de Ademar pode ser aprimorada usando
JavaScriptSerializer
oSerialize
método de alavancagem para fornecer conversão implícita do objeto em JSON.Além disso, é possível aproveitar a
using
funcionalidade padrão da instrução para omitir explicitamente a chamadaFlush
eClose
.fonte
application/json
está correto.O
HttpClient
tipo é uma implementação mais recente que oWebClient
eHttpWebRequest
.Você pode simplesmente usar as seguintes linhas.
Quando você precisar
HttpClient
mais de uma vez, é recomendável criar apenas uma instância e reutilizá-la ou usar a novaHttpClientFactory
.fonte
HttpClientFactory
. Não li todas as respostas no problema vinculado, mas acho que ele precisa ser atualizado, pois não menciona a fábrica.Após a publicação de Sean, não é necessário aninhar as instruções using. Pelo
using
StreamWriter, ele será liberado e fechado no final do bloco, portanto, não é necessário chamar explicitamente os métodosFlush()
eClose()
:fonte
Se você precisar chamar de forma assíncrona, use
fonte
postStream.Write(postData);
- e, dependendo da API, pode precisar usar um emrequest.ContentType = "application/json";
vez detext/json
.Cuide do tipo de conteúdo que você está usando:
Fontes :
RFC4627
Outro post
fonte
Recentemente, criei uma maneira muito mais simples de postar um JSON, com a etapa adicional de converter de um modelo no meu aplicativo. Observe que você precisa criar o modelo [JsonObject] para seu controlador para obter os valores e fazer a conversão.
Solicitação:
Modelo:
Lado do servidor:
fonte
Esta opção não é mencionada:
fonte
Uma maneira diferente e limpa de conseguir isso é usando o HttpClient assim:
fonte
PostAsJsonAsync
não está mais disponível desde o .NET 4.5.2. Use emPostAsync
vez disso. Mais aquiusing
declaração como estaIDisposable
interface para uma razãoAVISO! Eu tenho uma visão muito forte sobre esse assunto.
Os clientes da Web existentes do .NET não são compatíveis com o desenvolvedor! WebRequest e WebClient são exemplos principais de "como frustrar um desenvolvedor". Eles são detalhados e complicados de se trabalhar; quando tudo o que você deseja fazer é uma simples solicitação de postagem em c #. O HttpClient ajuda de alguma maneira a resolver esses problemas, mas ainda fica aquém. Além disso, a documentação da Microsoft é ruim ... muito ruim; a menos que você queira vasculhar páginas e páginas de resumo técnico.
Código aberto para o resgate. Existem três excelentes bibliotecas NuGet gratuitas de código aberto como alternativas. Obrigado Senhor! Tudo isso é bem suportado, documentado e, sim, fácil - correção ... super fácil - de se trabalhar.
Não há muito entre eles, mas eu daria ao ServiceStack.Text a ligeira vantagem…
Ok - então, como é uma Solicitação de postagem em JSON no ServiceStack.Text?
Essa é uma linha de código. Conciso e fácil! Compare o acima com as bibliotecas Http do .NET.
fonte
Finalmente invoquei no modo de sincronização incluindo o .Result
fonte
var data = Encoding.ASCII.GetBytes(json);
byte[] postBytes = Encoding.UTF8.GetBytes(json);
Use ASCII em vez de UFT8
fonte