2013-09-24 19 views
148
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; 
} 

PostAsync lấy một thông số khác cần phải là HttpContent.Làm cách nào để thiết lập HttpContent cho tham số thứ hai HttpClient PostAsync của tôi?

Làm cách nào để thiết lập một số HttpContent? Không có tài liệu nào ở bất cứ nơi nào hoạt động cho Windows Phone 8.

Nếu tôi làm GetAsync, nó hoạt động tuyệt vời! nhưng nó cần phải được POST với nội dung của key = "bla", một cái gì đó = "yay"

// EDIT

Cảm ơn rất nhiều cho câu trả lời ... này hoạt động tốt, nhưng vẫn còn một vài trường hợp không chắc chắn tại đâ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 = something" Tôi giả định sẽ nhận phía api dưới dạng dữ liệu bài "", rõ ràng là không. Trên một vấn đề khác, tôi có thể cần phải đăng toàn bộ các đối tượng/mảng thông qua dữ liệu bài, vì vậy tôi giả sử json sẽ là tốt nhất để làm như vậy. Bất kỳ suy nghĩ về cách tôi nhận được dữ liệu bài qua?

Có lẽ 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 

Trả lời

89

này được trả lời trong một số câu trả lời cho Can't find how to use HttpContent cũng như trong blog post này.

Tóm lại, bạn không thể trực tiếp thiết lập phiên bản HttpContent vì đây là lớp trừu tượng . Bạn cần phải sử dụng một trong những lớp học bắt nguồn từ nó tùy thuộc vào nhu cầu của bạn. Nhiều khả năng là 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/library/system.net.http.stringcontent.aspx

+2

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

+0

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

+2

Câu trả lời nhanh cho "làm cách nào để tôi đăng một lớp reprsentation JSON của lớp của tôi" là "serialize đối tượng vào JSON, có thể với JSON.Net", nhưng điều đó thực sự thuộc về một câu hỏi riêng. –

29

Để thêm vào câu trả lời của Preston, đây là danh sách đầy đủ của HttpContent các lớp thừa kế có sẵn trong thư viện chuẩn:

Credit: https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/

Credit: https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/

Ngoài ra còn có một giả ObjectContent như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ộ HttpContent mọi thứ cùng với tiện ích mở rộng Microsoft.AspNet.WebApi.Client (bạn sẽ phải thực hiện nhập để làm việc trong ASP.NET Core hiện tại: 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 Post 
{ 
    Title = "New Article Title", 
    Body = "New Article Body" 
});