Làm cách nào để thiết lập HTTPContent cho tham số thứ hai của HTTPClient PostAsync?


261
public static async Task<string> GetData(string url, string data)
{
    UriBuilder fullUri = new UriBuilder(url);

    if (!string.IsNullOrEmpty(data))
        fullUri.Query = data;

    HttpClient client = new HttpClient();

    HttpResponseMessage response = await client.PostAsync(new Uri(url), /*expects HttpContent*/);

    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response.EnsureSuccessStatusCode();
    string responseBody = await response.Content.ReadAsStringAsync();

    return responseBody;
}

Các PostAsynctham số khác cần phải được HttpContent.

Làm thế nào để tôi thiết lập một HttpContent? Không có tài liệu nào hoạt động cho Windows Phone 8.

Nếu tôi làm GetAsync, nó hoạt động rất tốt! nhưng nó cần phải được POST với nội dung của key = "bla", Something = "yay"

//BIÊN TẬP

Cảm ơn rất nhiều vì câu trả lời ... Điều này hoạt động tốt, nhưng vẫn còn một vài điều không chắc chắn ở đây:

    public static async Task<string> GetData(string url, string data)
    {
        data = "test=something";

        HttpClient client = new HttpClient();
        StringContent queryString = new StringContent(data);

        HttpResponseMessage response = await client.PostAsync(new Uri(url), queryString );

        //response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        response.EnsureSuccessStatusCode();
        string responseBody = await response.Content.ReadAsStringAsync();

        return responseBody;
    }

Dữ liệu "test = cái gì đó" tôi giả sử sẽ nhận về phía api dưới dạng "bài kiểm tra" dữ liệu, rõ ràng là không. Trong một vấn đề khác, tôi có thể cần phải đăng toàn bộ đối tượng / mảng thông qua dữ liệu bài đăng, vì vậy tôi cho rằng json sẽ là tốt nhất để làm như vậy. Bất kỳ suy nghĩ về cách tôi có được dữ liệu bài qua?

Có lẽ một cái gì đó như:

class SomeSubData
{
    public string line1 { get; set; }
    public string line2 { get; set; }
}

class PostData
{
    public string test { get; set; }
    public SomeSubData lines { get; set; }
}

PostData data = new PostData { 
    test = "something",
    lines = new SomeSubData {
        line1 = "a line",
        line2 = "a second line"
    }
}
StringContent queryString = new StringContent(data); // But obviously that won't work

Câu trả lời:


162

Điều này được trả lời trong một số câu trả lời cho Không thể tìm thấy cách sử dụng HttpContent cũng như trong bài đăng trên blog này .

Tóm lại, bạn không thể trực tiếp thiết lập một thể hiện HttpContentvì nó là một lớp trừu tượng . Bạn cần sử dụng một trong các lớp có nguồn gốc từ nó tùy thuộc vào nhu cầu của bạn. Rất có thể StringContent, cho phép bạn đặt giá trị chuỗi của phản hồi, mã hóa và loại phương tiện trong hàm tạo. Xem: http://msdn.microsoft.com/en-us/l Library / system.net.http.opescontent.aspx


2
Tôi sẽ kiểm tra cái này Tôi nghĩ rằng khi tôi phát hiện ra điều này, tôi sẽ phải đặt nó ở đâu đó nơi mọi người có thể nhìn thấy nó! Điều này đã khiến tôi phải mất 4 ngày nay, cố gắng đưa một REST đơn giản vào API.
Jimmyt1988

StringContent hoạt động rất tốt, nhưng thực tế, không thể có được PostData để truy cập vào trang web mà tôi đang gọi bây giờ: D. Tôi sẽ chỉnh sửa câu hỏi để cho bạn thấy những gì tôi hiện đang có
Jimmyt1988

2
Một câu trả lời nhanh cho "làm thế nào để tôi đăng một phần lặp lại JSON của lớp tôi" là "tuần tự hóa đối tượng thành JSON, có thể là với JSON.Net", nhưng điều đó thực sự thuộc về một câu hỏi riêng biệt.
Preston Guillot

92

Để thêm vào câu trả lời của Preston, đây là danh sách đầy đủ các HttpContentlớp dẫn xuất có sẵn trong thư viện chuẩn:

Tín dụng: https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-groupes-message-content/

Tín dụng : https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-groupes-message-content/

Cũng có một giả định ObjectContentnhưng tôi không thể tìm thấy nó trong ASP.NET Core.

Tất nhiên, bạn có thể bỏ qua toàn bộ HttpContentmọi thứ cùng với các Microsoft.AspNet.WebApi.Clienttiện ích mở rộng (bạn sẽ phải thực hiện nhập để làm cho nó hoạt động trong ASP.NET Core ngay bây giờ: https://github.com/aspnet/Home/issues/1558 ) và sau đó bạn có thể làm những việc như:

var response = await client.PostAsJsonAsync("AddNewArticle", new Article
{
    Title = "New Article Title",
    Body = "New Article Body"
});

3
Câu trả lời toàn diện nhất .. cách rất gọn gàng và sạch sẽ để đạt được nhiệm vụ rõ ràng phức tạp.
Salman
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.