【问题标题】:.NET HttpClient. How to POST string value?.NET HttpClient。如何发布字符串值?
【发布时间】:2013-02-17 01:32:32
【问题描述】:

如何使用 C# 和 HttpClient 创建以下 POST 请求:

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

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

【问题讨论】:

标签: c# asp.net-web-api dotnet-httpclient


【解决方案1】:
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);
        }
    }
}

【讨论】:

  • 嗯,我的 HttpClientExtensions 没有这样的过载...我使用框架 4.0
  • 您没有哪个重载?确保您已将Microsoft.AspNet.WebApi.Client NuGet 安装到您的项目中。 HttpClient 类是在 .NET 4.5 中构建的,而不是在 .NET 4.0 中构建的。如果你想在 .NET 4.0 中使用它,你需要 NuGet!
  • 我遇到的第一个 C# SSSCE。如果您来自具有适当 IDE 的语言,就好像让它运行起来是一件轻而易举的事。
  • 请注意,在 using 语句中使用 HttpClient 是 mistake
  • 你应该私有静态只读 HttpClient _client = new HttpClient();而是aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
【解决方案2】:

以下是同步调用的示例,但您可以使用 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)
{
}

【讨论】:

  • 我认为这行不通。您应该用空字符串替换“登录”,它应该是 KeyValuePair("", "abc"),请参阅接受的答案。
  • 这对我有用,在调用 $company_id = $_POST("company_id"); 的 php webservice 上工作像那样。如果我以 json 格式发送,php 将无法工作。
【解决方案3】:

Here 我发现这篇文章是使用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(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);
}

【讨论】:

    【解决方案4】:

    asp.net 网站上有一篇关于您的问题的文章。我希望它可以帮助你。

    如何用asp net调用api

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

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

    以下代码发送一个 POST 请求,其中包含 JSON 格式的 Product 实例:

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

    【讨论】:

    • 请求是表单 urlencoded,所以我认为 JSON 不会起作用
    • 它是 form-urlencoded。无论如何,DateTime 属性的 JSON 格式?序列化问题?
    • 我似乎没有注意到你的方法 "PostAsJsonAsync" 它在我的 HttpClient 实例中不可用。
    【解决方案5】:

    你可以这样做

    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 服务返回的值

    【讨论】:

    • 这里的问题是关于如何使用新的HttpClient 而不是旧的WebRequest
    • 是的,我没注意到,反正我会留下帖子,以防有人需要旧的...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多