【问题标题】:Make POST request from Mule ESB从 Mule ESB 发出 POST 请求
【发布时间】:2015-08-12 06:23:43
【问题描述】:

我一直坚持向 Web 服务器发出正确的 HTTP 请求(在 PHP 下运行)。 我需要发送带有属性json 和一些值的POST 请求,例如{ "employee_id":191, "date":"2015-08-11", "time":"14:26:00" }

例如,如果我从 Postman 或 cURL 发出请求,它会起作用,请求看起来像这样

POST /DeliveryDetails/ HTTP/1.1
Host: 192.168.0.100:80
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

json=%7B+%22employee_id%22%3A191%2C+%22date%22%3A%222015-08-11%22%2C+%22time%22%3A%2214%3A26%3A00%22+%7D

我也可以发送内容类型multipart/form-data

POST /DeliveryDetails/ HTTP/1.1
Host: 192.168.0.100:80
Cache-Control: no-cache
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="json"

{ "employee_id":191, "date":"2015-08-11", "time":"14:26:00" }
----WebKitFormBoundary7MA4YWxkTrZu0gW

或使用 cURL

curl -d "json={ \"employee_id\":191, \"date\":\"2015-08-11\", \"time\":\"14:26:00\" }" http://192.168.0.100:80/DeliveryDetails/

但是当我尝试从 Mule ESB 发出请求时,由于请求不正确,它无法正常工作。

流程是这样的

<sub-flow name="my-flow">
    <logger message="Request: #[payload]" level="INFO" doc:name="Log request"/>
    <http:request config-ref="request-HTTP" path="/DeliveryDetails/" method="POST" doc:name="HTTP call" />
    <object-to-string-transformer doc:name="Object to String"/>
    <logger message="Response: #[payload]" level="INFO" doc:name="Log response"/>
</sub-flow>

#[payload] 包含值 { "employee_id":191, "date":"2015-08-11", "time":"14:26:00" } 如果我这样做,身体会简单地包含它(没有像Content-Type这样的额外信息,我认为这就是问题所在)。

我已尝试添加query-param

<http:request-builder >
    <http:query-param paramName="json" value="#[payload]" />
</http:request-builder>

或使用message-properties-transformer

<message-properties-transformer doc:name="Message Properties">
    <add-message-property key="json" value="#[payload]"/>
</message-properties-transformer>

但结果还是一样。

编辑

HTTP 配置如下所示

<http:request-config name="request-HTTP" 
                     host="192.168.0.100" 
                     port="80"
                     doc:name="HTTP Request Configuration" />

还尝试用

设置Content-Type
<set-property propertyName="Content-Type" value="application/x-www-form-urlencoded" doc:name="Property"/>

<http:request-builder>
    <http:query-param paramName="json" value="#[payload]"/>
    <http:header headerName="Content-Type" value="application/x-www-form-urlencoded"/>
</http:request-builder>

但是我收到的正文仍然只是payload,没有其他属性,例如json=Content-Disposition: form-data; name="json"

【问题讨论】:

  • 澄清一下,请求构建器中的query-param 选项会生成类似path?paramName=value 的请求,它不会将其作为表单发送到正文中。
  • 我认为问题在于帖子正文必须采用 application/x-www-form-encoded 格式。尝试首先通过 json-to-object-transformer 将您的 JSON 有效负载转换为 HashMap。参考this

标签: post mule httprequest


【解决方案1】:

由于有效负载只是 JSON 数据,因此在大多数情况下都会发送这些数据。您的 curl 示例将“json =”部分设置为正文。所以这里有几个选项:

  1. 修改有效负载以添加所需的正文,就像使用 curl 一样,并将 Content-Type 设置为 application/x-www-form-urlencoded
  2. 通过将数据添加为附件来发送多部分内容。在您的情况下尝试:

<sub-flow name="my-flow"> <logger message="Request: #[payload]" level="INFO" doc:name="Log request"/> <set-attachment attachmentName="json" value="#[payload]" contentType="application/json"/> <http:request config-ref="request-HTTP" path="/DeliveryDetails" method="POST" doc:name="HTTP call" /> <object-to-string-transformer doc:name="Object to String"/> <logger message="Response: #[payload]" level="INFO" doc:name="Log response"/> </sub-flow>

  1. 将有效负载设置为包含键“json”的映射,并将有效负载作为值。这应该会让 Mule 发送表单请求,而无需您将 Content-Type 显式设置为 application/x-www-form-urlencoded

HTH。

【讨论】:

    【解决方案2】:

    你需要把path="/DeliveryDetails"

    您可以按照以下配置:-

    <http:request-config name="HTTP_Request_Configuration" host="192.168.0.100" port="80"  doc:name="HTTP Request Configuration"/> 
    

    并在Mule流或子流中设置Content-Type如下:-

    <set-property propertyName="Content-Type" value="application/json" doc:name="Property"/>
    <http:request config-ref="HTTP_Request_Configuration" path="/DeliveryDetails" method="POST" doc:name="HTTP call" />
    <logger message="Input JSON message ****** #['\n'+ message.payloadAs(java.lang.String)]" level="INFO" doc:name="Logger"/> 
    

    您可以根据需要在此处配置Content-Type

    你也可以参考这里:-How do I force the HTTP Request Connector to use a certain Content-Type?

    【讨论】:

    • 感谢您的回答!我试过了,但没有帮助。路径和 HTTP 配置正确,我在另一端收到消息,但是服务器无法解析请求并返回错误。
    • 如果您收到响应,那么您得到什么异常???请在此处输入完整的异常详细信息以及您得到的响应
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多