.Net 核心 Web API 调用其他外部 API [英] .Net core Web API who calls other external APIs
问题描述
我正在创建一个 .Net Core Web API,它将进一步调用外部 API.
I'm creating a .Net Core web API which will further call an external API.
场景:
在 .Net Core Web API 中,我想向 UiPath Orchestrator API 发出 Post 请求以获取身份验证令牌.以下是我要提出的请求的链接https://postman.uipath.rocks/#8f3b38d8-57dc-4d79-876d-0d2ff897f61a
In .Net Core web API, I want to make a Post request to UiPath Orchestrator API to get authentication token. Following is the link for the Request that I want to make https://postman.uipath.rocks/#8f3b38d8-57dc-4d79-876d-0d2ff897f61a
[HttpPost]
public Task<IActionResult> GetAccessToken()
{
//Here I want to make a Post request to the API to Authenticate
}
这个响应(Auth token)将被发送到另一个post请求来启动一个进程https://postman.uipath.rocks/#738c3beb-1c19-4257-8474-841a054c4220
And response (Auth token) of this will be sent to another post request to start a process https://postman.uipath.rocks/#738c3beb-1c19-4257-8474-841a054c4220
[HttpPost]
public Task<IActionResult> StartProcess(string token)
{
//Here I want to make a Post request to the other API in which token from the previous call will be
sent in header
}
我必须在一两天内完成它,但我不知道如何才能做到这一点.
I have to complete it in a day or two and I can't figure out how can I achieve this.
任何帮助将不胜感激.
推荐答案
如果我正确理解您想要一个端点,它将向第三方 API 发出两个 POST
请求.第一个请求将检索授权令牌.第二个请求将使用其标头中的 Token 来传递授权.
If I correctly understand you want to have an endpoint, which will make two POST
requests to third-party API. The first request will retrieve an Authorization Token. The second request will use the Token in its Headers to pass an authorization.
要实现此行为,您的 API 中应该有一个端点,而不是两个端点(如上面的示例所示).
To achive this behavior, you should to have a single endpoint in your API, instead of two endpoints (as in your example above).
另外,我建议你有一个单独的类,它负责与你的第三方 API 通信(使用 postman.uipath.rocks
).
Also, I recommend you to have a separate class, which will responsible for communicating with your third-party API (with the postman.uipath.rocks
).
因此,您调用第三方 API 的单个端点可能如下所示:
So, your single endpoint to call a third-party API may looks like this:
public class Controller
{
// another Controller's code...
private readonly IPostmanApi postmanApi;
public Controller(IPostmanApi postmanApi)
{
this.postmanApi = postmanApi;
}
[HttpPost]
public async Task<IActionResult> StartPostmanProcess()
{
string token = await postmanApi.GetToken();
await postmanApi.StartProcess(token);
return Accepted();
}
// another Controller's code...
}
您的 IPostmanApi.cs
文件可能如下所示:
Your IPostmanApi.cs
file may looks like this:
public interface IPostmanApi
{
///<summary>
/// A method to get Authorization Token from Postman
///</summary>
Task<string> GetToken();
///<summary>
/// A method to get start a process in Postman
///</summary>
///<param name="token">Postman's authorization token</param>
Task StartProcess(string token);
}
您的 PostmanApi.cs
文件可能如下所示:
Your PostmanApi.cs
file may looks like this:
public class PostmanApi
{
Task<string> GetToken()
{
using (HttpClient client = new HttpClient())
{
var response = await client.PostAsync("https://postman.uipath.rocks/#8f3b38d8-57dc-4d79-876d-0d2ff897f61a");
// Note: this code assumes that the whole response body is a string Token.
// If the `postman.uipath.rocks` returns an JSON object, which contains a
// Token inside some field, you may use Newtonsoft.Json library to deserialize
// it, and then retrieve your Token from corresponding field.
// See example here: https://stackoverflow.com/questions/24131067/deserialize-json-to-array-or-list-with-httpclient-readasasync-using-net-4-0-ta
return await response.Content.ReadAsStringAsync();
}
}
Task StartProcess(string token)
{
using (HttpClient client = new HttpClient())
{
// Note: this code assumes that the `postman.uipath.rocks` receives
// a **Bearer** token. If it receives another kind of authentication
// scheme, you should use it instead of "Bearer".
client.DefaultRequestHeaders.Authorization
= new AuthenticationHeaderValue("Bearer", token);
await client.PostAsync("https://postman.uipath.rocks/#738c3beb-1c19-4257-8474-841a054c4220");
}
}
另外不要忘记在 Startup.cs
中注册你的 IPostmanApi
服务:
Also don't forget to register your IPostmanApi
service within Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
// another code...
services.AddScoped<IPostmanApi, PostmanApi>();
// another code...
}
注意:
- 此代码不是线程安全的(因为
HttpClient
不是线程安全的).如果您希望它是线程安全的,请考虑使用IHttpClientFactory
.
- This code is not thread-safe (because an
HttpClient
is not thread safe). If you want it to be thread-safe, consider to useIHttpClientFactory
.
有用的链接:
- .NET Core 中 Rest API 的使用方式应用
- https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-5.0
这篇关于.Net 核心 Web API 调用其他外部 API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!