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

1
¿Qué cliente HTTP estás usando en la imagen?
azufre


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

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)
{
}

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

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

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.