2016-12-09 3 views
3

Как можно использовать HttpClient и установить метод динамически, без необходимости делать что-то вроде:.NET HttpClient: Как установить метод запроса динамически?

public async Task<HttpResponseMessage> DoRequest(string url, HttpContent content, string method) 
    { 
     HttpResponseMessage response; 

     using (var client = new HttpClient()) 
     { 
      switch (method.ToUpper()) 
      { 
       case "POST": 
        response = await client.PostAsync(url, content); 
        break; 
       case "GET": 
        response = await client.GetAsync(url); 
        break; 
       default: 
        response = null; 
        // Unsupported method exception etc. 
        break; 
      } 
     } 

     return response; 
    } 

На данный момент это выглядит, как вы должны использовать:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
req.Method = "POST"; 
+1

Вы можете httprequestmessage и установить метод, URL-адрес и контент. Затем используйте метод отправки httpclient – Nkosi

+0

. Обратите внимание, что вы не должны использовать 'new HttpClient()' для запроса, или вы можете исчерпать пул сокетов по шкале. Используйте один статический экземпляр. –

ответ

2

HttpRequestMessage содержит конструктор, принимающий экземпляр HttpMethod, но нет готового конструктора, который преобразует строку метода HTTP в HttpMethod, поэтому вы не можете избежать этого переключателя (в той или иной форме).

Однако вы не должны дублировать код при различных случаях коммутации, поэтому реализация будет что-то вроде этого:

private HttpMethod CreateHttpMethod(string method) 
{ 
    switch (method.ToUpper()) 
    { 
     case "POST": 
      return HttpMethod.Post; 
     case "GET": 
      return HttpMethod.Get; 
     default: 
      throw new NotImplementedException(); 
    } 
} 

public async Task<HttpResponseMessage> DoRequest(string url, HttpContent content, string method) 
{ 
    var request = new HttpRequestMessage(CreateHttpMethod(method), url) 
    { 
     Content = content 
    }; 

    return await client.SendAsync(request); 
} 

Если вам не нравится, что switch вы могли бы избежать его с помощью словаря с помощью метода строку- но такое решение не будет проще или быстрее.

+0

Вы также можете передать 'HttpMethod httpMethod' в качестве параметра, а затем выполнить новый HttpRequestMessage (httpMethod, url)' – ECH

0

но нет готового конструктора, который преобразует метод HTTP строку HTTPMethod

Ну это не так больше ... https://msdn.microsoft.com/en-us/library/system.net.http.httpmethod.httpmethod(v=vs.118).aspx

public HttpMethod(string method); 

Может использоваться как это:

var httpMethod = new HttpMethod(method.ToUpper()); 

Настоящий рабочий код ,

using System.Collections.Generic; 
using System.Net.Http; 
using System.Text; 

namespace MyNamespace.HttpClient 
{ 
public static class HttpClient 
{ 
    private static readonly System.Net.Http.HttpClient NetHttpClient = new System.Net.Http.HttpClient(); 
    static HttpClient() 
    {} 

    public static async System.Threading.Tasks.Task<string> ExecuteMethod(string targetAbsoluteUrl, string methodName, List<KeyValuePair<string, string>> headers = null, string content = null, string contentType = null) 
    { 
     var httpMethod = new HttpMethod(methodName.ToUpper()); 

     var requestMessage = new HttpRequestMessage(httpMethod, targetAbsoluteUrl); 

     if (!string.IsNullOrWhiteSpace(content) || !string.IsNullOrWhiteSpace(contentType)) 
     { 
      var contentBytes = Encoding.UTF8.GetBytes(content); 
      requestMessage.Content = new ByteArrayContent(contentBytes); 

      headers = new List<KeyValuePair<string, string>> 
      { 
       new KeyValuePair<string, string>("Content-type", contentType) 
      }; 
     } 

     headers?.ForEach(kvp => { requestMessage.Headers.Add(kvp.Key, kvp.Value); }); 

     var response = await NetHttpClient.SendAsync(requestMessage); 

     return await response.Content.ReadAsStringAsync(); 

    } 
} 
} 
Смежные вопросы