web-dev-qa-db-ja.com

1つのWebAPIが他のWebAPIにリクエストを転送するための最良の方法

異なるサーバーで実行されているWebサービスがいくつかあり、残りの「前」で1つのWebサービスを実行して、ヘッダー値に基づいて要求を転送するWebサービス(サーバー)を決定したいと考えています。

アイデアは、クライアントがリクエストを送信するというものです。

http://api.mysite.com/cars

Mysite.comのAPIはリクエストを検査し、APIキー(ヘッダーで提供されます)から情報を抽出し、適切なサーバーにリダイレクトします。

http://server4.mysite.com/api/cars

これはうまくいくでしょうか? 「server4」からクライアントに応答(データ付き)を返す方法が心配です。応答は最初のサーバーにのみ返されますか、それともクライアントはその応答を達成しますか?

10
msk

同じタスクに遭遇し、YazanATIの回答に加えてさらにいくつかの行を追加する必要があります。

    [HttpPost]
    [HttpGet]
    [Route("api/TestBot/{*remaining}")]
    public Task<HttpResponseMessage> SendMessage()
    {
        const string Host = "facebook.botframework.com";
        string forwardUri = $"https://{Host}/api/v1/bots/billycom{Request.RequestUri.Query}";

        Request.Headers.Remove("Host");
        Request.RequestUri = new Uri(forwardUri);
        if (Request.Method == HttpMethod.Get)
        {
            Request.Content = null;
        }

        var client = new HttpClient();
        return client.SendAsync(Request, HttpCompletionOption.ResponseHeadersRead);
    }
5
Veikedo

あなたがする必要があるのは、次のようなWeb APIDelegatingHandlerを構築することです。

public class ProxyHandler : DelegatingHandler
{
  protected override async System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
  {
    UriBuilder forwardUri = new UriBuilder(request.RequestUri);
    //strip off the proxy port and replace with an Http port
    forwardUri.Port = 80;
    //send it on to the requested URL
    request.RequestUri = forwardUri.Uri;
    HttpClient client = new HttpClient();
    var response = await  client.SendAsync(request,HttpCompletionOption.ResponseHeadersRead);
    return response;
  }
} 
5
Yazan Ati