2014-12-09 16 views
10

tôi sử dụng mã dưới đây để gửi yêu cầu POST đến một máy chủ:C#: HttpClient với POST thông số

string url = "http://myserver/method?param1=1&param2=2"  
HttpClientHandler handler = new HttpClientHandler(); 
HttpClient httpClient = new HttpClient(handler); 
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url); 
HttpResponseMessage response = await httpClient.SendAsync(request); 

Tôi không có quyền truy cập vào máy chủ để gỡ lỗi nhưng tôi muốn biết, là yêu cầu này được gửi như POST hoặc GET?

Nếu GET, Làm cách nào tôi có thể thay đổi mã của mình để gửi param1 & param2 làm dữ liệu POST (không có trong URL)?

+3

Nó được gửi dưới dạng bài đăng, 'HttpRequestMessage mới (HttpMethod.Post, url) ', bằng cách chuyển trong' HttpMethod.Post' bạn đang tạo một yêu cầu POST. Param1 và param2 là gì? –

+0

Thử sử dụng Fiddler? – SanyTiger

+0

@BenRobinson Cảm ơn. param1 & param2 là các tham số của tôi mà tôi muốn gửi chúng dưới dạng tham số POST BUT chuỗi truy vấn. –

Trả lời

-3

Như Ben nói, bạn đang gửi bài yêu cầu của bạn (HttpMethod.Post quy định trong mã của bạn)

Các chuỗi truy vấn (được) các thông số bao gồm trong url của bạn có thể sẽ không làm gì cả.

Hãy thử điều này:

string url = "http://myserver/method";  
string content = "param1=1&param2=2"; 
HttpClientHandler handler = new HttpClientHandler(); 
HttpClient httpClient = new HttpClient(handler); 
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url); 
HttpResponseMessage response = await httpClient.SendAsync(request,content); 

HTH,

bovako

+0

@JohnCroneh tính năng này không hoạt động nữa. Vui lòng chấp nhận câu trả lời khác bên dưới! –

+0

@JohnCroneh vui lòng thay đổi câu trả lời được chấp nhận thành một công trình –

+1

@ R.McManaman Trên thực tế, đó là câu trả lời hay nếu bạn muốn tạo một loại phương thức không xác định. Nó thiếu một số "sử dụng" để đảm bảo rằng nó được xử lý và "đảm bảo nó được chuyển đổi", nhưng nó tuân theo việc thực hiện trình bao bọc PostAsync. – HellBaby

22

Một sạch thay thế sẽ được sử dụng một Dictionary để xử lý các thông số. Họ là những cặp khóa-giá trị sau khi tất cả.

private static readonly HttpClient HttpClient; 

static MyClassName() 
{ 
    // HttpClient is intended to be instantiated once and re-used throughout the life of an application. 
    // Instantiating an HttpClient class for every request will exhaust the number of sockets available under heavy loads. 
    // This will result in SocketException errors. 
    // https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.7.1 
    HttpClient = new HttpClient();  
} 

var url = "http://myserver/method"; 
var parameters = new Dictionary<string, string> { { "param1", "1" }, { "param2", "2" } }; 
var encodedContent = new FormUrlEncodedContent (parameters); 

var response = await HttpClient.PostAsync (url, encodedContent).ConfigureAwait (false); 
if (response.StatusCode == HttpStatusCode.OK) { 
    // Do something with response. Example get content: 
    // var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait (false); 
} 

Cũng không quên Dispose() HttpClient, nếu bạn không sử dụng từ khóa using

Như đã trình bày trong phần chú thích của lớp HttpClient trong Microsoft docs, HttpClient nên được khởi tạo một lần và tái sử dụng .

Edit:

Bạn có thể muốn xem xét response.EnsureSuccessStatusCode(); thay vì if (response.StatusCode == HttpStatusCode.OK).

Bạn có thể muốn giữ HttpClient và không Dispose(). Xem: Do HttpClient and HttpClientHandler have to be disposed?

Các vấn đề liên quan