将对 Azure 函数的请求转发到另一个端点

Forward request made to Azure function to another endpoint

我需要将对 Azure 函数(通过 proxies.json)发出的 HttpRequest 转发到不同的端点。请求需要使用查询字符串和 headers 原封不动地转发。我需要修改响应 body,然后再将其发送回原始呼叫者。

Proxies.json

"Transactions.BatchImport.Settlements": {
      "matchCondition": {
        "methods": [ "GET" ],
        "route": "/transactions/v1/getsettlementsbyid/{batchId}"
      },
      "backendUri": "http://localhost/api/storebox/settlements/{batchId}"
    },

所需功能的伪代码

    [FunctionName(nameof(GetStoreboxSettlements))]
    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "GET", Route = "storebox/settlements/{batchId}")]
        HttpRequest request, string batchId)
    {
        var response = ForwardRequest(request, $"www.anotherEndpoint.com/{batchId}");
        response.Body = TransformBody(response.Body);
        return new OkObjectResult(response);
    }

欢迎提供替代解决方案。

如果有人感兴趣,这就是我解决问题的方法:

Proxies.json

    "Transactions.BatchImport.Settlements": {
  "matchCondition": {
    "methods": [ "GET" ],
    "route": "/transactions/v1/getsettlementsbyid/{batchId}"
  },
  "backendUri": "http://localhost/api/v1/settlements/{batchId}"
},

函数代码

        [FunctionName(nameof(GetStoreboxSettlementsProxy))]
    public async Task<HttpResponseMessage> Run(
        [HttpTrigger(AuthorizationLevel.Function, "GET", Route = "v1/settlements/{batchId?}")]
        HttpRequest request)
    {
        var baseUri = _environment.Get(Constants.Api.Endpoint);
        var requestUri = new UriBuilder(baseUri)
        {
            Path = $"{request.Path}",
            Query = request.QueryString.Value,
        }.Uri;

        var httpRequestMessage = new HttpRequestMessage();
        httpRequestMessage.Headers.Authorization = AuthenticationHeaderValue.Parse(request.Headers["Authorization"]);
        httpRequestMessage.RequestUri = requestUri;
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.BadRequest);
        try
        {
            response = await _httpClient.SendAsync(httpRequestMessage);
            response.EnsureSuccessStatusCode();
            var json = response.Content.ReadAsStringAsync().Result;
            var storeBoxTransactionData = JsonConvert.DeserializeObject<StoreBoxTransactionData>(json);
            if (storeBoxTransactionData.TotalSize > 0)
            {
                //Transform storebox settlement data
                var transformedStoreBoxData = _processStoreBoxSettlementService.Process(storeBoxTransactionData);
                response.Content = new StringContent(JsonConvert.SerializeObject(transformedStoreBoxData), Encoding.UTF8, "application/json");
                return response;
            }
        }
        catch (Exception e)
        {
            _logger.LogError($"Failed to get settlements {e}");
        }

        return response;
    }