.NET HttpClient. Como POST valor da string?

174

Como posso criar usando C # e HttpClient a seguinte solicitação POST: Agente do usuário: Fiddler Tipo de conteúdo: application / x-www-form-urlencoded Host: localhost: 6740 Comprimento do conteúdo: 6

Preciso de uma solicitação para meu serviço de API da WEB:

[ActionName("exist")]
[HttpPost]
public bool CheckIfUserExist([FromBody] string login)
{           
    return _membershipProvider.CheckIfExist(login);
}
Ievgen Martynov
fonte
1
Qual cliente HTTP você está usando na imagem?
enxofre
Telerik.com/Fiddler
Ievgen Martynov
1
O serviço é Web Api MVC. Formato JSON para solicitação?
Kiquenet

Respostas:

433
using System;
using System.Collections.Generic;
using System.Net.Http;

class Program
{
    static void Main(string[] args)
    {
        Task.Run(() => MainAsync());
        Console.ReadLine();
    }

    static async Task MainAsync()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:6740");
            var content = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("", "login")
            });
            var result = await client.PostAsync("/api/Membership/exists", content);
            string resultContent = await result.Content.ReadAsStringAsync();
            Console.WriteLine(resultContent);
        }
    }
}
Darin Dimitrov
fonte
1
hm, meu HttpClientExtensions não tem essa sobrecarga ... eu uso o framework 4.0
Ievgen Martynov 2/13/13
1
Qual sobrecarga você não tem? Verifique se você instalou o Microsoft.AspNet.WebApi.ClientNuGet no seu projeto. A HttpClientclasse é criada no .NET 4.5, não no .NET 4.0. Se você quiser usá-lo no .NET 4.0, precisará do NuGet!
precisa
1
Primeiro C # SSSCE me deparei. Como se fosse muito fácil fazê-lo funcionar, se você vem de um idioma com um IDE adequado.
Buffalo1 /
13
Apenas uma nota que o uso de HttpClient em usar declaração é um erro
ren
26
Você deve incluir estática privada somente leitura HttpClient _client = new HttpClient (); em vez aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Sameer Alibhai
35

Abaixo está um exemplo para chamar de forma síncrona, mas você pode facilmente mudar para assíncrono usando wait-sync:

var pairs = new List<KeyValuePair<string, string>>
            {
                new KeyValuePair<string, string>("login", "abc")
            };

var content = new FormUrlEncodedContent(pairs);

var client = new HttpClient {BaseAddress = new Uri("http://localhost:6740")};

    // call sync
var response = client.PostAsync("/api/membership/exist", content).Result; 
if (response.IsSuccessStatusCode)
{
}
cuongle
fonte
1
Eu não acho que isso vai funcionar. você deve substituir "login" por uma string vazia, deve ser KeyValuePair <string, string> ("", "abc"), consulte a resposta aceita.
Joedotnot 28/02/19
isso funciona para mim, trabalho no php webservice que está chamando $ company_id = $ _POST ("company_id"); Curtiu isso. Se eu enviar como json, o php não funcionará.
teapeng 19/03
8

Há um artigo sobre sua pergunta no site do asp.net. Espero que possa ajudá-lo.

Como chamar uma API com asp net

http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

Aqui está uma pequena parte da seção POST do artigo

O código a seguir envia uma solicitação POST que contém uma instância do produto no formato JSON:

// HTTP POST
var gizmo = new Product() { Name = "Gizmo", Price = 100, Category = "Widget" };
response = await client.PostAsJsonAsync("api/products", gizmo);
if (response.IsSuccessStatusCode)
{
    // Get the URI of the created resource.
    Uri gizmoUrl = response.Headers.Location;
}
oneNiceFriend
fonte
O pedido é form-urlencoded então eu não acho JSON vai funcionar
ChrisFletcher
É codificado em formulário . Enfim, formato JSON para DateTimepropriedades? problemas de serialização?
Kiquenet
4
Parece que não percebi o seu método "PostAsJsonAsync". Ele não está disponível na minha instância do HttpClient.
Tommy Holman #
4

Aqui encontrei este artigo que é enviar solicitação de postagem usando JsonConvert.SerializeObject()& StringContent()para HttpClient.PostAsyncdados

static async Task Main(string[] args)
{
    var person = new Person();
    person.Name = "John Doe";
    person.Occupation = "gardener";

    var json = Newtonsoft.Json.JsonConvert.SerializeObject(person);
    var data = new System.Net.Http.StringContent(json, Encoding.UTF8, "application/json");

    var url = "https://httpbin.org/post";
    using var client = new HttpClient();

    var response = await client.PostAsync(url, data);

    string result = response.Content.ReadAsStringAsync().Result;
    Console.WriteLine(result);
}
Ravi Makwana
fonte
1

Você poderia fazer algo assim

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:6740/api/Membership/exist");

req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";         
req.ContentLength = 6;

StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
streamOut.Write(strRequest);
streamOut.Close();
StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
string strResponse = streamIn.ReadToEnd();
streamIn.Close();

E então strReponse deve conter os valores retornados pelo seu serviço da web

Axel
fonte
25
A questão aqui era sobre como usar o novo HttpCliente não o antigo WebRequest.
precisa
É verdade que eu não notei, vou deixar o post de qualquer maneira, caso alguém precise do antigo ... #
Axel