.NET httpClient. Làm thế nào để POST giá trị chuỗi?


174

Làm cách nào tôi có thể tạo bằng C # và HttpClient theo yêu cầu POST sau: Tác nhân người dùng: Fiddler Loại nội dung: application / x-www-form-urlencoding Host: localhost: 6740 Độ dài nội dung: 6

Tôi cần một yêu cầu như vậy cho dịch vụ API WEB của mình:

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

1
Bạn đang sử dụng ứng dụng HTTP nào trong ảnh?
vôi


1
Dịch vụ này là Web Api MVC. Định dạng JSON cho yêu cầu?
Kiquenet

Câu trả lời:


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, httpClientExtensions của tôi không có quá tải như vậy ... tôi sử dụng khung 4.0
Ievgen Martynov

1
Quá tải mà bạn không có? Hãy chắc chắn rằng bạn đã cài đặt Microsoft.AspNet.WebApi.ClientNuGet cho dự án của bạn. Các HttpClientlớp học được xây dựng trong .NET 4.5, không phải trong .NET 4.0. Nếu bạn muốn sử dụng nó trong .NET 4.0, bạn cần NuGet!
Darin Dimitrov

1
C # SSSCE đầu tiên tôi đi qua. Như thể thật dễ dàng để khiến nó chạy nếu bạn đến từ một ngôn ngữ có IDE phù hợp.
Trâu

13
Chỉ cần một lưu ý rằng việc sử dụng HttpClient trong việc sử dụng tuyên bố là một sai lầm
ren

26
Bạn nên đọc riêng tư tĩnh httpClient _client = new HttpClient (); thay vì aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Sameer Alibhai

35

Dưới đây là ví dụ để gọi đồng bộ nhưng bạn có thể dễ dàng thay đổi thành async bằng cách sử dụng 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
Tôi không nghĩ rằng điều này sẽ làm việc. bạn nên thay thế "đăng nhập" bằng chuỗi trống, nó phải là KeyValuePair <chuỗi, chuỗi> ("", "abc"), xem câu trả lời được chấp nhận.
joedotnot

cái này hoạt động với tôi, hoạt động trên dịch vụ web php đang gọi $ company_id = $ _POST ("company_id"); như thế Nếu tôi gửi dưới dạng json, php không thể hoạt động.
teapeng

8

Có một bài viết về câu hỏi của bạn trên trang web của asp.net. Tôi hy vọng nó có thể giúp bạn.

Cách gọi api với asp net

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

Đây là một phần nhỏ từ phần POST của bài viết

Đoạn mã sau gửi yêu cầu POST chứa phiên bản Sản phẩm ở định dạng 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;
}

Yêu cầu được mã hóa theo mẫu, vì vậy tôi không nghĩ JSON sẽ hoạt động
ChrisFletcher

Đó là dạng urlencoding . Dù sao, định dạng JSON cho DateTimecác thuộc tính? vấn đề nối tiếp?
Kiquenet

4
Tôi dường như không nhận thấy phương thức của bạn "PostAsJsonAsync" Nó không có sẵn trong ví dụ httpClient của tôi.
Tommy Holman

4

Ở đây tôi tìm thấy bài viết này là gửi yêu cầu bài viết bằng cách sử dụng JsonConvert.SerializeObject()& StringContent()đến HttpClient.PostAsyncdữ liệu

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

Bạn có thể làm một cái gì đó như thế này

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

Và sau đó strReponse sẽ chứa các giá trị được trả về bởi dịch vụ web của bạn


25
Câu hỏi ở đây là về cách sử dụng cái mới HttpClientchứ không phải cái cũ WebRequest.
Darin Dimitrov

Đúng là tôi không để ý, dù sao tôi cũng sẽ rời khỏi bài viết trong trường hợp ai đó cần cái cũ ...
Axel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.