0

我正在创建一个 .Net Core Web API,它将进一步调用外部 API。

设想:

在 .Net Core Web API 中,我想向 UiPath Orchestrator API 发出 Post 请求以获取身份验证令牌。以下是我要提出的请求的链接 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
}

并且此响应(身份验证令牌)将发送到另一个发布请求以启动进程 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
 }

我必须在一两天内完成它,我不知道如何才能做到这一点。

任何帮助都感激不尽。

4

1 回答 1

1

如果我正确理解您想要一个端点,它将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...
}

注意:

  1. 此代码不是线程安全的(因为 anHttpClient不是线程安全的)。如果您希望它是线程安全的,请考虑使用IHttpClientFactory.

有用的链接:

于 2021-03-28T21:50:57.983 回答