.NET HttpClient. ¿Cómo publicar valor de cadena?

174

¿Cómo puedo crear usando C # y HttpClient la siguiente solicitud POST: User-Agent: Fiddler Tipo de contenido: application / x-www-form-urlencoded Host: localhost: 6740 Content-Length: 6

Necesito tal solicitud para mi servicio API WEB:

[ActionName("exist")]
[HttpPost]
public bool CheckIfUserExist([FromBody] string login)
{           
    return _membershipProvider.CheckIfExist(login);
}
Ievgen Martynov
fuente
1
¿Qué cliente HTTP estás usando en la imagen?
azufre
telerik.com/fiddler
Ievgen Martynov
1
El servicio es Web Api MVC. Formato JSON para solicitud?
Kiquenet

Respuestas:

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
fuente
1
hm, mi HttpClientExtensions no tiene tal sobrecarga ... uso framework 4.0
Ievgen Martynov
1
¿Qué sobrecarga no tienes? Asegúrese de haber instalado Microsoft.AspNet.WebApi.ClientNuGet en su proyecto. La HttpClientclase está construida en .NET 4.5, no en .NET 4.0. Si quieres usarlo en .NET 4.0, necesitas NuGet!
Darin Dimitrov
1
Primero C # SSSCE que encuentro. Como si fuera muy fácil hacerlo funcionar si vienes de un idioma con un IDE adecuado.
Buffalo
13
Solo una nota de que usar HttpClient en el uso de la declaración es un error
ren
26
Debería tener una lectura estática privada HttpClient _client = new HttpClient (); en lugar aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Sameer Alibhai
35

A continuación se muestra un ejemplo para llamar sincrónicamente, pero puede cambiar fácilmente a asíncrono mediante el uso de 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
fuente
1
No creo que esto funcione. debe reemplazar "login" con una cadena vacía, debe ser KeyValuePair <string, string> ("", "abc"), consulte la respuesta aceptada.
joedotnot
esto funciona para mí, trabaja en el servicio web php que está llamando $ company_id = $ _POST ("company_id"); como eso. Si envío como json, php no puede funcionar.
teapeng
8

Hay un artículo sobre su pregunta en el sitio web de asp.net. Espero que te pueda ayudar.

Cómo llamar a una api con asp net

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

Aquí hay una pequeña parte de la sección POST del artículo.

El siguiente código envía una solicitud POST que contiene una instancia de Producto en 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
fuente
La solicitud está codificada en el formulario, por lo que no creo que JSON funcione
ChrisFletcher
Está codificado por urlen . De todos modos, ¿ formato JSON para DateTimepropiedades? problemas de serialización?
Kiquenet
44
No parece notar su método "PostAsJsonAsync". No está disponible en mi instancia de HttpClient.
Tommy Holman
4

Aquí encontré este artículo que es enviar solicitud de envío usando JsonConvert.SerializeObject()& StringContent()a HttpClient.PostAsyncdatos

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
fuente
1

Podrías hacer algo como esto

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

Y luego strReponse debe contener los valores devueltos por su servicio web

Axel
fuente
25
La pregunta aquí era sobre cómo usar lo nuevo HttpClienty no lo viejo WebRequest.
Darin Dimitrov
Es cierto que no me di cuenta, dejaré la publicación de todos modos en caso de que alguien necesite la anterior ...
Axel