gpt4 book ai didi

c# - 如何从第二个 API 调用返回相同的状态代码

转载 作者:行者123 更新时间:2023-12-04 16:21:04 24 4
gpt4 key购买 nike

我有一个调用第二个 API 的 ASP.NET Core API。

如果第二个 API 出现错误,我会在我的服务层抛出一个异常:

var response = await httpClient.SendAsync(request); //call second API

if (!response.IsSuccessStatusCode)
{
//return HTTP response with StatusCode = X, if response.StatusCode == X
throw new HttpRequestException(await response.Content.ReadAsStringAsync());
//this always returns 400
}

我如何抛出一个异常,该异常将返回具有与第二次 API 调用相同的状态代码的响应?

如果我使用 HttpRequestException,它将始终返回 400,即使 response 对象有 StatusCode = 500

编辑:第一个 API 端点如下所示:

            public async Task<ActionResult<HttpResponseMessage>> CreateTenancy([FromBody]TenancyRequest tenancy)
{
//Make some calls...
return Created(string.Empty, new { TenancyID = newTenancyExternalId });
}

第二个 API 端点如下所示:

    [HttpPost]
public IHttpActionResult CreateTenancy([FromBody]TenancyDTO tenancyDTO)
{
var tenancy = GetTenancy();
return Created(string.Empty, tenancy);
}

我试过使用 throw new HttpResponseException(response); 但这会删除描述性异常消息,有效负载最终如下所示:

{
"Code": 500,
"CorrelationId": "2df08016-e5e3-434a-9136-6824495ed907",
"DateUtc": "2020-01-30T02:02:48.4428978Z",
"ErrorMessage": "Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.",
"ErrorType": "InternalServerError"
}

我想在原始负载中保留 ErrorMessage 值:

{
"Code": 400,
"CorrelationId": "ff9466b4-8c80-4dab-b5d7-9bba1355a567",
"DateUtc": "2020-01-30T03:05:13.2397543Z",
"ErrorMessage": "\"Specified cast is not valid.\"",
"ErrorType": "BadRequest"
}

最终目标是返回:

{
"Code": 500,
"CorrelationId": "ff9466b4-8c80-4dab-b5d7-9bba1355a567",
"DateUtc": "2020-01-30T03:05:13.2397543Z",
"ErrorMessage": "\"Specified cast is not valid.\"",
"ErrorType": "InternalServerError"
}

最佳答案

我尝试了一些简单的操作,例如更改 API 端点的返回类型并在出现错误时按原样返回对象。否则,构建您自己的 HttpResponseMessage 并返回它。下面的代码片段使用文本,但您可以使用序列化器序列化其他内容(如果有的话)。

public async Task<HttpResponseMessage> Test(string str)
{
var httpClient = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, $"myAPI that returns different errors 400, 404, 500 etc based on str");

var response = await httpClient.SendAsync(request);
if (!response.IsSuccessStatusCode)
return response;

// do something else
return new HttpResponseMessage(System.Net.HttpStatusCode.OK) { Content = new StringContent("Your Text here") };
}

Other approach of using Filters

使用 IHttpActionResult 作为返回类型的另一种方法是,您可以使用过滤器使所有 HttpResponseMessages 符合 IHttpActionResult。

过滤器:创建一个单独的 cs 文件并使用此过滤器定义。

public class CustomObjectResponse : IHttpActionResult
{
private readonly object _obj;

public CustomObjectResponse(object obj)
{
_obj = obj;
}

public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage response = _obj as HttpResponseMessage;
return Task.FromResult(response);
}
}

在您的 API 中,您可以像这样使用您的过滤器,

public async Task<IHttpActionResult> Test(string str)
{
var httpClient = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, $"http://localhost:4500/api/capacity/update-mnemonics/?mnemonic_to_update={str}");

var response = await httpClient.SendAsync(request);
if (!response.IsSuccessStatusCode)
return new CustomObjectResponse(response);

// Other Code here

// Return Other objects
KeyValuePair<string, string> testClass = new KeyValuePair<string, string>("Sheldon", "Cooper" );
return new OkWithObjectResult(testClass);

// Or Return Standard HttpResponseMessage
return Ok();

}

关于c# - 如何从第二个 API 调用返回相同的状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59977967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com