Azure Logic Apps问题:Http连接器遗漏自定义响应头
解决Azure Logic Apps HTTP连接器丢失自定义响应头的问题
我之前处理过完全一样的场景,Azure Logic Apps的HTTP连接器确实会默认过滤掉一些敏感或非标准的响应头(比如你提到的Authorization),不过有几个靠谱的解决方案可以试试:
方案1:用Azure Functions做中间代理层
这是最稳妥的办法,因为Azure Functions的HTTP触发器可以完整捕获第三方API返回的所有响应头,再把它们原封不动(或者按需筛选)返回给Logic Apps。
步骤很简单:
- 创建一个HTTP触发的Azure Function,在函数内部调用你的第三方API,获取完整的响应内容和所有头信息。
- 在Function的返回响应中,把需要的自定义头(比如
Authorization)添加到响应头集合里。 - 让Logic Apps调用这个Azure Function,而不是直接调用第三方API,这样就能拿到所有你需要的头了。
给你一段C#的示例代码参考:
using System.Net; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using System.Net.Http; public class ThirdPartyApiProxy { private readonly HttpClient _httpClient; public ThirdPartyApiProxy(HttpClient httpClient) { _httpClient = httpClient; } [Function("ThirdPartyApiProxy")] public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req) { // 调用目标第三方API var apiResponse = await _httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Post, "https://your-third-party-api-endpoint.com")); // 构建返回给Logic Apps的响应 var response = req.CreateResponse(apiResponse.StatusCode); await response.BodyWriter.WriteAsync(await apiResponse.Content.ReadAsByteArrayAsync()); // 复制所有响应头(包括自定义头) foreach (var header in apiResponse.Headers) { if (!response.Headers.Contains(header.Key)) { response.Headers.TryAddWithoutValidation(header.Key, header.Value); } } // 别忘了复制内容头 foreach (var header in apiResponse.Content.Headers) { if (!response.Headers.Contains(header.Key)) { response.Headers.TryAddWithoutValidation(header.Key, header.Value); } } return response; } }
方案2:直接访问HTTP动作的原始输出
有时候Logic Apps其实已经拿到了这些头,只是在默认的可视化输出里没显示出来。你可以尝试直接用表达式读取:
- 在HTTP动作之后添加一个「Compose」动作。
- 在Compose的输入框里输入表达式:
@{outputs('HTTP')['headers']},或者更精准的@{outputs('HTTP')['headers']['Authorization']}。 - 运行Logic Apps后查看Compose的输出,说不定就能找到你要的头。
不过要注意:如果这个头属于Logic Apps默认屏蔽的敏感头(比如Authorization),这个方法可能就不生效了,这时候还是得用方案1。
方案3:修改第三方API的自定义头名称
如果可以协调第三方API的维护方,把自定义头改成以X-开头的格式(比如X-Custom-Authorization),Azure Logic Apps的HTTP连接器通常不会过滤这类自定义前缀的头,这样就能直接拿到了。
内容的提问来源于stack exchange,提问作者Kiran H
相关产品推荐
相关产品推荐

