.NET HttpClient: Как динамически установить метод запроса?
Как можно использовать 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";
4 ответа
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
Вы можете избежать этого, используя словарь со строкой метода в качестве ключа, однако такое решение не будет проще или быстрее.
но нет готового конструктора, который преобразует строку метода HTTP в HttpMethod
Ну, это не так больше... 1
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();
}
}
}
.Net Core
var hc = _hcAccessor.HttpContext;
var hm = new HttpMethod(hc.Request.Method.ToUpper());
var hrm = new HttpRequestMessage(hm, 'url');
Более поздние версии .NET Core:
HttpClient client = new HttpClient();
// Add headers etc...
// Post
response = await client.PostAsync(uri, content);
// Get
response = await client.GetAsync(uri);