如何 return 来自 Controller 的通用响应?
How to return Generic response from Controller?
Net 核心应用程序并调用其他 .Net Core Web API 应用程序。我正在调用控制器方法如下
public async Task<T> SendRequest<T, U>(U request, string methodName, HttpMethod reqtype, string token)
{
T res = default(T);
try
{
string url = methodName;
string contentJson = JsonConvert.SerializeObject(request);
var content = new StringContent(contentJson, Encoding.UTF8, "application/json");
var actualRequest = new HttpRequestMessage(reqtype, url);
actualRequest.Content = content;
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Add("Authorization", token);
var rawData = await _httpClient.SendAsync(actualRequest);
var processedData = await rawData.Content.ReadAsStringAsync().ConfigureAwait(false);
res = JsonConvert.DeserializeObject<T>(processedData);
}
catch (Exception ex)
{
_reqHandler.RaiseBusinessException(MethodBase.GetCurrentMethod()?.DeclaringType?.DeclaringType?.Name
, MethodBase.GetCurrentMethod().Name,
"InputType: " + typeof(U) + " || OutputType: " + typeof(T) + " || Error Message: " + ex.Message);
}
return res;
}
以下是 return 来自 API 控制器
的示例
return StatusCode(404, result.MapFileFileUploadSummary);
return StatusCode((int)System.Net.HttpStatusCode.Unauthorized);
在上面的代码中,当我 return 一些状态代码时,我想将它绑定到通用类型 T。例如,我正在调用一个方法
_Client.SendRequest<ObjectResult, requestModel>()
我正在发送 return 类型的 ObjectResult。例如,我在 processedData 中得到的响应低于
"{\"type\":\"https://tools.ietf.org/html/rfc7235#section-3.1\",\"title\":\"Unauthorized\",\"status\":401,\"traceId\":\"00-e517f28f9c0b0441a8634c1c703a1cae-f64589d11056ad45-00\"}"
但是无法绑定到
res = JsonConvert.DeserializeObject<T>(processedData);
return没什么 我在这里添加截图
这里 T 是 ObjectResult 类型。我在这里寻找通用响应类型,以便我始终可以将它绑定到类型 T。有人可以帮助我完成此实现吗?任何帮助,将不胜感激。谢谢
您遇到的问题是:如果出现错误,JSON 将与成功时完全不同。
为了示例,我将隐藏有关 HTTP 请求的大部分内容:
public async Task<ActionResult<T>> SendRequest<T, U>(U request, string methodName, HttpMethod reqtype, string token);
对我来说,你不应该 return “T”,而是“ActionResult”。您的代码仍然不知道实际内容 (T) 是什么,但知道它将 return ActionResult。它将减轻其余部分。
var response = await _httpClient.SendAsync(actualRequest);
if (!response.IsSuccessStatusCode)
{
return new StatusCodeResult((int)response.StatusCode)
}
var responseData = JsonConvert.DeserializeObject<T>(await rawData.Content.ReadAsStringAsync());
return new ObjectResult(responseData);
在所有情况下,您都会有一个可以直接从您的控制器return获取的 ActionResult。
如果出现错误,结果只会是其他服务器 return 编辑的状态代码。
如果成功,您将收到另一台服务器发送的数据。
我认为如果出现错误 return 将状态代码发送给您的用户就足够了,但如果要发送整个对象,您也可以这样做。您只需要先创建一个 class 来表示在出现错误时发送的数据,然后:
var response = await _httpClient.SendAsync(actualRequest);
object responseData;
if (response.IsSuccessStatusCode)
{
responseData = JsonConvert.DeserializeObject<T>(await rawData.Content.ReadAsStringAsync());
}
else
{
responseData = JsonConvert.DeserializeObject<YourClassInCaseOfError>(await rawData.Content.ReadAsStringAsync());
}
return new ObjectResult(responseData)
{
StatusCode = (int)response.StatusCode,
}
并且您还必须将方法签名更改为:
public async Task<ActionResult> SendRequest<T, U>(U request, string methodName, HttpMethod reqtype, string token);
由于第二个示例可能会 return 2 种不同的类型(数据类型或错误类型),因此您必须使用 ActionResult,而不是 ActionResult<>
Net 核心应用程序并调用其他 .Net Core Web API 应用程序。我正在调用控制器方法如下
public async Task<T> SendRequest<T, U>(U request, string methodName, HttpMethod reqtype, string token)
{
T res = default(T);
try
{
string url = methodName;
string contentJson = JsonConvert.SerializeObject(request);
var content = new StringContent(contentJson, Encoding.UTF8, "application/json");
var actualRequest = new HttpRequestMessage(reqtype, url);
actualRequest.Content = content;
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Add("Authorization", token);
var rawData = await _httpClient.SendAsync(actualRequest);
var processedData = await rawData.Content.ReadAsStringAsync().ConfigureAwait(false);
res = JsonConvert.DeserializeObject<T>(processedData);
}
catch (Exception ex)
{
_reqHandler.RaiseBusinessException(MethodBase.GetCurrentMethod()?.DeclaringType?.DeclaringType?.Name
, MethodBase.GetCurrentMethod().Name,
"InputType: " + typeof(U) + " || OutputType: " + typeof(T) + " || Error Message: " + ex.Message);
}
return res;
}
以下是 return 来自 API 控制器
的示例return StatusCode(404, result.MapFileFileUploadSummary);
return StatusCode((int)System.Net.HttpStatusCode.Unauthorized);
在上面的代码中,当我 return 一些状态代码时,我想将它绑定到通用类型 T。例如,我正在调用一个方法
_Client.SendRequest<ObjectResult, requestModel>()
我正在发送 return 类型的 ObjectResult。例如,我在 processedData 中得到的响应低于
"{\"type\":\"https://tools.ietf.org/html/rfc7235#section-3.1\",\"title\":\"Unauthorized\",\"status\":401,\"traceId\":\"00-e517f28f9c0b0441a8634c1c703a1cae-f64589d11056ad45-00\"}"
但是无法绑定到
res = JsonConvert.DeserializeObject<T>(processedData);
return没什么 我在这里添加截图
您遇到的问题是:如果出现错误,JSON 将与成功时完全不同。
为了示例,我将隐藏有关 HTTP 请求的大部分内容:
public async Task<ActionResult<T>> SendRequest<T, U>(U request, string methodName, HttpMethod reqtype, string token);
对我来说,你不应该 return “T”,而是“ActionResult
var response = await _httpClient.SendAsync(actualRequest);
if (!response.IsSuccessStatusCode)
{
return new StatusCodeResult((int)response.StatusCode)
}
var responseData = JsonConvert.DeserializeObject<T>(await rawData.Content.ReadAsStringAsync());
return new ObjectResult(responseData);
在所有情况下,您都会有一个可以直接从您的控制器return获取的 ActionResult。
如果出现错误,结果只会是其他服务器 return 编辑的状态代码。
如果成功,您将收到另一台服务器发送的数据。
我认为如果出现错误 return 将状态代码发送给您的用户就足够了,但如果要发送整个对象,您也可以这样做。您只需要先创建一个 class 来表示在出现错误时发送的数据,然后:
var response = await _httpClient.SendAsync(actualRequest);
object responseData;
if (response.IsSuccessStatusCode)
{
responseData = JsonConvert.DeserializeObject<T>(await rawData.Content.ReadAsStringAsync());
}
else
{
responseData = JsonConvert.DeserializeObject<YourClassInCaseOfError>(await rawData.Content.ReadAsStringAsync());
}
return new ObjectResult(responseData)
{
StatusCode = (int)response.StatusCode,
}
并且您还必须将方法签名更改为:
public async Task<ActionResult> SendRequest<T, U>(U request, string methodName, HttpMethod reqtype, string token);
由于第二个示例可能会 return 2 种不同的类型(数据类型或错误类型),因此您必须使用 ActionResult,而不是 ActionResult<>