C# HttpClient Generic SendAysnc 不工作
C# HttpClient Generic SendAysnc not working
我不熟悉用 C# 编写泛型方法,我想在我的 c# 项目中创建一个泛型 SendAsync
方法。代码如下。
HttpClientHelper.cs
public static async Task<T2t> ExecuteRequest<T1,T2>(T2 request, string url)
{
Uri requestUri = new Uri(url);
string payload = JsonConvert.SerializeObject(request);
HttpContent httpContent = new StringContent(payload, "application/json");
HttpRequestMessage requestMessage = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = requestUri,
Content = httpContent
};
return await SendUriAsync<T2>(requestMessage);
}
public static async Task<T> SendUriAsync<T>(HttpRequestMessage requestMessage)
{
string clint_id = "1234";
var clineCred = Encoding.UTF8.GetBytes($"{client_id}");
using(var result = await client.SendAsync(requestMessage))
{
result.EnsureSuccessStatusCode();
var response = await result.Content.ReadAsStringAsync();
if(result.IsSuccessStatusCode && response != null)
{
return JsonConvert.DeserializeObject<T>(response);
}
else
{
return null;
}
}
}
这里是调用这些方法的控制器class:
CarSalesController.cs
string thirdpartyUrl = "someurl";
var responseObject = await HttpClientHelper.ExecuteRequest<CarObject, string>(requestObject, thirdpartyUrl);
我在 HttpClientHelper
class 中遇到错误。错误是:
ResponseStatusCode does not indicate success. StatusCode:401 - UnAuthorised
但是当我使用 postman 时,同样的 API 效果很好。他是 cURL
curl --location --request GET 'someurl'
--header 'client_id:1234'
--header 'Authorization: Basic asdf'
--header 'Content-Type: application/json'
--数据原始'{
“数据1”:“一些数据1”,
“数据2”:“一些数据2”
}'
我的代码可能有什么问题?
问题可能出在 DeserializeObject
。尝试使用:
response.Content.ReadAsStringAsync()
这不是你想做的吗?
public async Task<TOut> ExecuteRequestAsync<TIn, TOut>( TIn request, string url )
{
var requestUri = new Uri( url );
var payload = JsonConvert.SerializeObject( request );
var httpContent = new StringContent( payload, Encoding.UTF8, "application/json" );
var requestMessage = new HttpRequestMessage()
{
Method = HttpMethod.Post,
RequestUri = requestUri,
Content = httpContent
};
return await SendUriAsync<TOut>( requestMessage );
}
public static async Task<T> SendUriAsync<T>( HttpRequestMessage requestMessage )
{
using (var client = CreateClient( 1234 ))
{
var result = await client.SendAsync( requestMessage );
result.EnsureSuccessStatusCode();
var response = await result.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>( response );
}
}
private static HttpClient CreateClient(int clientId)
{
var clientCred = Encoding.UTF8.GetBytes( clientId.ToString() );
var auth = Convert.ToBase64String( clientCred );
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Basic", auth );
client.DefaultRequestHeaders.Add( "client_id", "1234" );
return client;
}
我不熟悉用 C# 编写泛型方法,我想在我的 c# 项目中创建一个泛型 SendAsync
方法。代码如下。
HttpClientHelper.cs
public static async Task<T2t> ExecuteRequest<T1,T2>(T2 request, string url)
{
Uri requestUri = new Uri(url);
string payload = JsonConvert.SerializeObject(request);
HttpContent httpContent = new StringContent(payload, "application/json");
HttpRequestMessage requestMessage = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = requestUri,
Content = httpContent
};
return await SendUriAsync<T2>(requestMessage);
}
public static async Task<T> SendUriAsync<T>(HttpRequestMessage requestMessage)
{
string clint_id = "1234";
var clineCred = Encoding.UTF8.GetBytes($"{client_id}");
using(var result = await client.SendAsync(requestMessage))
{
result.EnsureSuccessStatusCode();
var response = await result.Content.ReadAsStringAsync();
if(result.IsSuccessStatusCode && response != null)
{
return JsonConvert.DeserializeObject<T>(response);
}
else
{
return null;
}
}
}
这里是调用这些方法的控制器class:
CarSalesController.cs
string thirdpartyUrl = "someurl";
var responseObject = await HttpClientHelper.ExecuteRequest<CarObject, string>(requestObject, thirdpartyUrl);
我在 HttpClientHelper
class 中遇到错误。错误是:
ResponseStatusCode does not indicate success. StatusCode:401 - UnAuthorised
但是当我使用 postman 时,同样的 API 效果很好。他是 cURL
curl --location --request GET 'someurl'
--header 'client_id:1234'
--header 'Authorization: Basic asdf'
--header 'Content-Type: application/json'
--数据原始'{
“数据1”:“一些数据1”,
“数据2”:“一些数据2”
}'
我的代码可能有什么问题?
问题可能出在 DeserializeObject
。尝试使用:
response.Content.ReadAsStringAsync()
这不是你想做的吗?
public async Task<TOut> ExecuteRequestAsync<TIn, TOut>( TIn request, string url )
{
var requestUri = new Uri( url );
var payload = JsonConvert.SerializeObject( request );
var httpContent = new StringContent( payload, Encoding.UTF8, "application/json" );
var requestMessage = new HttpRequestMessage()
{
Method = HttpMethod.Post,
RequestUri = requestUri,
Content = httpContent
};
return await SendUriAsync<TOut>( requestMessage );
}
public static async Task<T> SendUriAsync<T>( HttpRequestMessage requestMessage )
{
using (var client = CreateClient( 1234 ))
{
var result = await client.SendAsync( requestMessage );
result.EnsureSuccessStatusCode();
var response = await result.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>( response );
}
}
private static HttpClient CreateClient(int clientId)
{
var clientCred = Encoding.UTF8.GetBytes( clientId.ToString() );
var auth = Convert.ToBase64String( clientCred );
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Basic", auth );
client.DefaultRequestHeaders.Add( "client_id", "1234" );
return client;
}