2016-12-09 3 views
3

Comment peut-on utiliser HttpClient et définir la méthode dynamique sans avoir à faire quelque chose comme:.NET HttpClient: Comment définir la méthode de requête de façon dynamique?

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; 
    } 

le moment, il semble que vous devez utiliser:

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

Vous pouvez httprequestmessage et définir la méthode, l'URL et le contenu. Ensuite, utilisez la méthode d'envoi de httpclient – Nkosi

+0

Notez que vous ne devriez pas 'new HttpClient()' par requête, ou vous pouvez épuiser votre pool de socket à l'échelle. Utilisez une seule instance statique. –

Répondre

2

HttpRequestMessage contient constructeur prenant exemple de HttpMethod mais il n'existe aucun constructeur prêt qui convertit la chaîne de méthode HTTP en HttpMethod, donc vous ne pouvez pas éviter ce commutateur (sous une forme ou une autre).

Cependant, vous ne devriez pas avoir de code dupliqué dans différents cas de commutation, de sorte que la mise en œuvre serait quelque chose comme ceci:

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

Si vous n'êtes pas comme ça switch, vous pouvez l'éviter en utilisant le dictionnaire avec chaîne de méthode comme clé, cependant cette solution ne sera pas plus simple ou plus rapide.

+0

Vous pouvez également passer dans 'HttpMethod httpMethod' en tant que paramètre, puis faire' new HttpRequestMessage (httpMethod, url) ' – ECH

0

mais il n'y a pas de constructeur prêt qui convertit la chaîne de méthode HTTP à HttpMethod

Eh bien, ce n'est pas vrai plus longtemps ... https://msdn.microsoft.com/en-us/library/system.net.http.httpmethod.httpmethod(v=vs.118).aspx

public HttpMethod(string method); 

Peut être utilisé comme ceci:

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

Voici le code de fonctionnement .

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

    } 
} 
}