Azure APIM - 单个请求中的多个 API 调用(发送请求或替代方法)

问题描述 投票:0回答:2

目前我正在开发 APIM,我已经设置了两个 api

  • 生成PDF API(应用服务1)
  • 电子邮件 PDF API(应用服务 2)

在 UI 中,用户单击“生成并发送电子邮件 API”。此时我需要调用生成的pdf api和电子邮件pdf api。另外,我不想向 UI 公开电子邮件 API。

我在 APIM 中尝试的首先称为“GeneratePDF API”,在其中我使用“Email PDF API”进行调用。

这里的问题是引发内部服务器错误。但API直接运行完全没问题。

我需要知道

  • 我的方法适合我的功能吗?
  • 如何从生成 API 执行电子邮件 API?
azure azure-api-management azure-appservice
2个回答
1
投票

使用发送请求策略在 APIM 级别完全可以做到这一点:https://learn.microsoft.com/en-us/azure/api-management/api-management-sample-send-request。在进行实验时,请务必使用 Azure 门户中的 API 测试控制台,因为它具有内置的跟踪功能,可以极大地帮助您了解调用可能失败的原因。


1
投票

是的,这可以通过使用 APIM 编排策略来实现。基本上,是一个嵌套的发送请求策略。

过程

  • 发送 pdf 请求
  • 检查 200 或发送错误
  • 发送包含 pdf 信息的电子邮件请求

查看示例脚本。这里最困难的部分是确定 JSON 文档的规范。这应该在 set-body 策略中完成。

<send-request mode="new" response-variable-name="pdfRespose" ignore-error="false">
    <set-url>API-HERE</set-url>
    <set-method>POST</set-method>  
    <set-body>@{    
        // any transformation here or remove to use request document
    }</set-body>         
</send-request>
<choose>
    <!-- Check 200 status code and run the next step -->
    <when condition="@(context.Response.StatusCode < 400)">
        <!-- Send email request with required parameters-->
        <send-request mode="new" response-variable-name="emailREsponse" ignore-error="false">
            <set-url>API-HERE</set-url>
            <set-method>POST</set-method>
            
            <set-body>@{    
                    var document = (JObject)context.Variables["pdfRespose"];                            
                    return document?.ToString();                                                  
                }</set-body>
        </send-request>
        <choose>
            <!-- Check 200 status -->
            <when condition="@(context.Response.StatusCode < 400)">
                <return-response>
                    <set-status code="@(context.Response.StatusCode)" />
                    <set-body>@{
                    // send response and status code
                    }</set-body>
                </return-response>
            </when>
        </choose>
    </when>
    <otherwise>
        <return-response>
            <set-status code="@(context.Response.StatusCode)" reason="Error" />                                   
        </return-response>
    </otherwise>
</choose>
© www.soinside.com 2019 - 2024. All rights reserved.