如果我正确理解您想要一个端点,它将POST
向第三方 API 发出两个请求。第一个请求将检索Authorization Token。第二个请求将使用其 Headers 中的Token来传递授权。
要实现此行为,您应该在 API 中有一个端点,而不是两个端点(如上面的示例)。
另外,我建议您有一个单独的类,它负责与您的第三方 API(使用postman.uipath.rocks
)进行通信。
因此,您调用第三方 API 的单个端点可能如下所示:
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
文件可能如下所示:
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
文件可能如下所示:
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");
}
}
另外不要忘记在以下IPostmanApi
范围内注册您的服务Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
// another code...
services.AddScoped<IPostmanApi, PostmanApi>();
// another code...
}
注意:
- 此代码不是线程安全的(因为 an
HttpClient
不是线程安全的)。如果您希望它是线程安全的,请考虑使用IHttpClientFactory
.
有用的链接: