API 请求在 Postman 上完美运行,但返回空正文以响应 Mulesoft API

Posted

技术标签:

【中文标题】API 请求在 Postman 上完美运行,但返回空正文以响应 Mulesoft API【英文标题】:API Request works perfectly on Postman but returns empty body in response from Mulesoft API 【发布时间】:2021-05-03 19:59:45 【问题描述】:

我正在对 Postman 和 Mule Flow 执行相同的请求。 如果我使用一个简单的请求正文(例如一个 60 行的 JSON),它在两者上都可以正常工作。 但是,当我使用一个大请求(它有 5545 行)时,就会出现这个问题。

编辑:

好的,只是为了说清楚,因为它基本上都是虚拟数据,我需要帮助。如果请求正文在订单数组中只有这 5 个项目(此帖子的请求太长,所以我将其缩小,例如目的)它工作正常:



"orders": [

    

        "increment_id": "000001501",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,

    

        "increment_id": "000001502",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,

    

        "increment_id": "000001503",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,

    

        "increment_id": "000001504",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,

    

        "increment_id": "000001505",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,

]


但是,如果同一请求在“订单”数组中包含 8 个或更多项目,则响应正文返回空:



"orders": [

    

        "increment_id": "000001501",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,

    

        "increment_id": "000001502",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,



        "increment_id": "000001503",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,


        "increment_id": "000001504",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,


        "increment_id": "000001505",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,



        "increment_id": "000001506",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,



        "increment_id": "000001507",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,



        "increment_id": "000001508",

        "old_order_id": "",

        "total_qty_ordered": 1,

    ,



        "increment_id": "000001509",

        "old_order_id": "",

        "total_qty_ordered": 1,

    

]


请求头的不同之处如下:

Mulesoft 请求标头:

POST /api/v1/SALES_ORDER HTTP/1.1
x-correlation-id: 1a0d03f0-626d-11eb-9b2e-b663a1179158
Host: HOST:PORT
User-Agent: AHC/1.0
Connection: keep-alive
Accept: */*
Content-Type: application/json; charset=UTF-8
Content-Length: 165216

邮递员请求头:

POST /api/v1/SALES_ORDER HTTP/1.1
Host: HOST:PORT
User-Agent: PostmanRuntime/7.26.10
Connection: keep-alive
Accept: */*
Content-Type: application/json; charset=UTF-8
Content-Length: 165216

再次,我正在发送 SAME BODY 请求,但即使响应是 200 状态代码,Mulesoft 上的正文也返回空(即使“内容长度”标头仅在 Mulesoft 上为 0)

Mulesoft 响应头:

HTTP/1.1 200 OK
Date: Fri, 29 Jan 2021 17:51:06 GMT
Server: Apache
Upgrade: h2
Connection: Upgrade, Keep-Alive
X-Powered-By: Undertow/1
Set-Cookie: JSESSIONID=5rNuv5ZX5ohn96xcd9YKahXSw414wxzZ7Y3PIRqw.loyaltyqaukpt; path=/b2becon
Set-Cookie: com.anm.octashop.country=IN; path=/
Set-Cookie: com.anm.octashop.lang=pt; path=/
country: IN
Content-Length: 0
Content-Language: pt-
Keep-Alive: timeout=5, max=100
Content-Type: text/html;charset=UTF-8

邮递员响应标头:

HTTP/1.1 200 OK
Date: Fri, 29 Jan 2021 17:51:06 GMT
Server: Apache
Upgrade: h2
Connection: Upgrade, Keep-Alive
X-Powered-By: Undertow/1
Set-Cookie: JSESSIONID=xeqWEjuRcZ319zd8ZXtOnF0xN_-NEi-xygwGk05p.loyaltyqaukpt; path=/b2becon
Set-Cookie: com.anm.octashop.country=IN; path=/
Set-Cookie: com.anm.octashop.lang=pt; path=/
country: IN
Content-Length: 4372
Content-Language: pt-
Keep-Alive: timeout=5, max=100
Content-Type: text/html;charset=UTF-8

编辑(版本): Mule 服务器运行时:4.3.0

API 套件模块:1.4

Anypoint MQ 连接器 - Mule 4:3.1.2

HTTP 连接器 - Mule 4:1.5.23

MUnit:2.3.1

MUnit 工具:2.3.1

安全配置属性扩展 - Mule 4:1.2.3

插座连接器:1.2.1

【问题讨论】:

听起来 MuleSoft 被配置为在响应中不包含正文,您能验证一下吗? MulesSoft 是公司名称。我猜您正在从部署到 Mule 运行时的 Mule 应用程序中的流中发出 HTTP 请求。骡子是什么版本?如果 Mule 4.x.x,HTTP 连接器的版本是什么?添加流和 HTTP 连接器配置。有效载荷来自哪里?请求中是否完整?和邮递员的要求一样吗? @blurfus 我该如何验证?我还有其他 8 个流也可以进行外部 API 调用,它们工作正常(同样,它们都收到一个小的 JSON 请求,而这个问题似乎与请求正文大小有关) @aled 使用已使用的版本编辑了问题。我可以保证它与 Mule 和 Postman 中使用的请求正文相同,因为在转换有效负载后,我在 HTTP 请求上放置了一个断点,并将相同的请求从 Mule 复制到 Postman。在 Postman 上运行良好,但我在 Mule 上收到一个空的身体响应。 这不是解决此问题的最佳方法。以防万一发送的内容不同,请启用 HTTP 线路日志记录:help.mulesoft.com/s/article/How-to-Enable-HTTP-Wire-Logging 请注意,有一个不同的标头:x-correlation-id: 1a0d03f0-626d-11eb-9b2e-b663a1179158。在任何情况下,对于显然相同的请求(没有所述标头)返回不同答案的是服务器。你是从服务器端检查的吗?排除故障的另一种方法是使用wireshark/tcpdump 捕获流量(如果不是HTTPS),以真正确定任何差异。 【参考方案1】:

据我了解您的问题,通过邮递员的请求工作正常,但在 mules 流程中它造成的问题比我们的 mule 流程中的问题

尝试调试您的代码并放置调试点

    在您在 mule 流中访问的外部 API 的 HTTP 请求者处 在 HTTP 请求者之后

在调试器中检查 HTTP 请求者是否为空之后的响应。

谢谢

【讨论】:

是的,它为 Mule 返回一个空响应,但仅当“订单”数组中有 8 个或更多项目时。如果不清楚,我已经用请求示例进行了编辑。同样,Postman 上的任何数量都可以正常工作,但是 Mule 我有 0 到 7 件物品的限制。不仅如此,它总是返回空。 如我所说,你在调试模式下检查了吗?

以上是关于API 请求在 Postman 上完美运行,但返回空正文以响应 Mulesoft API的主要内容,如果未能解决你的问题,请参考以下文章

简单实现 web/app端 经API GateWay 将请求转发至微服务,并将数据返回给client客户端

POST 请求适用于 Postman,但不适用于 Guzzle

获取在 Postman 上工作的请求,但不在 React.js 中?

POST 请求适用于 Postman,但不适用于 axios.post()

对 API 的请求在 Postman 中有效,但在我尝试使用 laravel/guzzle 时无效

postman 请求接口Could not get any response(完美解决)