.NET HttpClient。如何发布字符串值?


175

如何使用C#和HttpClient创建以下POST请求: 用户代理:Fiddler内容类型:application / x-www-form-urlencoded主机:localhost:6740内容长度:6

我的WEB API服务需要这样的请求:

[ActionName("exist")]
[HttpPost]
public bool CheckIfUserExist([FromBody] string login)
{           
    return _membershipProvider.CheckIfExist(login);
}

1
您在图像中使用什么HTTP客户端?
硫磺


1
该服务是Web Api MVC。请求的JSON格式
Kiquenet '18

Answers:


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
嗯,我的HttpClientExtensions没有这样的重载...我使用框架4.0
Ievgen Martynov 2013年

1
您没有哪个过载?确保已将Microsoft.AspNet.WebApi.ClientNuGet 安装到项目中。该HttpClient班是建立在.NET 4.5,而不是在.NET 4.0。如果要在.NET 4.0中使用它,则需要NuGet!
Darin Dimitrov

1
我遇到的第一个C#SSSCE。如果您来自具有适当IDE的语言,就好像让它运行起来是一件轻而易举的事情。
布法罗2015年

13
请注意,在using语句中使用HttpClient是一个错误
ren

26
您应该私有静态只读HttpClient _client = new HttpClient();。而是aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Sameer Alibhai

35

以下是同步调用的示例,但是您可以使用await-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
我认为这行不通。您应该用空字符串替换“登录”,它应该是KeyValuePair <string,string>(“”,“ abc”),请参见接受的答案。
joedotnot

这对我有用,在调用$ company_id = $ _POST(“ company_id”)的php webservice上工作;像那样。如果我以json格式发送,则php无法正常工作。
teapeng

8

在asp.net的网站上有一篇关于您的问题的文章。希望对您有所帮助。

如何使用ASP NET调用API

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

这是本文的POST部分的一小部分

以下代码发送包含JSON格式的Product实例的POST请求:

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

该请求采用表单编码,因此我认为JSON不起作用
ChrisFletcher '17

它是urlencoded形式的。不管怎么说,JSON格式DateTime属性?序列化问题?
Kiquenet '18

4
我似乎没有注意到您的方法“ PostAsJsonAsync”,它在我的HttpClient实例中不可用。
汤米·霍尔曼

4

在这里,我找到了这篇文章,该文章使用JsonConvert.SerializeObject()StringContent()发送HttpClient.PostAsync数据

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

    var json = Newtonsoft.Json.JsonConvert.SerializeObject(param);
    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

你可以做这样的事情

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

然后strReponse应该包含您的Web服务返回的值


25
这里的问题是关于如何使用新的HttpClient而不是旧的WebRequest
Darin Dimitrov

没错,我没注意到,如果有人需要旧的东西,我还是会留下来...
Axel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.