简体   繁体   English

在ESB Mule中为API发送POST请求

[英]Sending POST request in ESB mule for API

I try to send the post request to API using ESB mule. 我尝试使用ESB ule子将发布请求发送到API。 Hence i have created flow like below. 因此,我创建了如下所示的流程。

     <?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd">
    <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8110" doc:name="HTTP Listener Configuration"/>
    <http:request-config name="HTTP_Request_Configuration"  host="api.bonanza.com" port="443" doc:name="HTTP Request Configuration" protocol="HTTPS"/>
    <flow name="bonanza_fetchtoken_ceFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/fetchtoken" allowedMethods="GET" doc:name="HTTP"/>
        <message-properties-transformer doc:name="Message Properties">
            <add-message-property key="X-BONANZLE-API-DEV-NAME" value="t**********I"/>
            <add-message-property key="X-BONANZLE-API-CERT-NAME" value="l**********F"/>
        </message-properties-transformer>
        <set-payload value="fetchTokenRequest" doc:name="Set Payload"/>
        <set-property propertyName="Content-Type" value="text/plain" doc:name="Property"/>
        <set-property propertyName="Accept" value="application/json" doc:name="Property"/>
        <http:request config-ref="HTTP_Request_Configuration" path="/api_requests/secure_request" method="POST" doc:name="HTTP" followRedirects="true" parseResponse="false">
            <http:success-status-code-validator values="0..599"/>
        </http:request>
    </flow>
</mule>

In the API documentation, they have provided the sample code for java to send and receive response and it is working in my local too. 在API文档中,他们为Java提供了发送和接收响应的示例代码,它也在我的本地环境中工作。 The java code snippet is below. Java代码段如下。

import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.HttpURLConnection;

public class FetchToken {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            String devId = "t******I";
            String certId = "l*******F";

            URL url = new URL("https://api.bonanza.com/api_requests/secure_request");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setRequestProperty("Accept", "application/json");
            connection.setRequestProperty("X-BONANZLE-API-DEV-NAME", devId);
            connection.setRequestProperty("X-BONANZLE-API-CERT-NAME", certId);

            OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());

            String requestName = "fetchTokenRequest";

            writer.write(requestName);
            writer.flush();
            writer.close();

            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String response = in.readLine();

            JSONObject jsonResponse = new JSONObject(response);

            if (jsonResponse.optString("ack").equals("Success") 
                    && jsonResponse.optJSONObject("fetchTokenResponse") != null) {
                // Success! Now read more keys from the json object
                JSONObject fetchTokenJson = jsonResponse.optJSONObject("fetchTokenResponse");

                System.out.println("Your token: " + fetchTokenJson.optString("authToken"));
                System.out.println("Token expiration time: " + fetchTokenJson.optString("hardExpirationTime"));
                System.out.println("Authentication URL: " + fetchTokenJson.optString("authenticationURL"));
            }


        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

The above java program retuning token without issue. 上面的Java程序重新调整令牌没有问题。 When i use my esb mule i am getting below API error. 当我使用esb ule子时,出现以下API错误。 What are the mistakes i doing while building request. 建立请求时我在犯什么错误。 How can i get successful response from API ? 如何获得API的成功响应?

{
  "ack": "Failure",
  "version": "1.0beta",
  "timestamp": "2016-03-09T10:35:16.000Z",
  "errorMessage": {
    "message": "Cannot determine what type of request you are making. Often this can be the result of data that has not been escaped before being passed to the API. If you are passing data with quotation marks or other special characters, you should translate it to JSON, then escape it, before sending it over the API."
  }
}

Solving your problem implies performing debugging steps. 解决您的问题意味着执行调试步骤。 I'm going to walk you through them. 我将带您了解他们。

Hypothesis: Maybe the receiving service is confused by some extra headers sent by Mule? 假设:接收服务可能被Mule发送的一些额外报头弄糊涂了吗?

Try the following: 请尝试以下操作:

  • Send the Mule request to http://requestb.in/ and look exactly how it is structured. 将Mule请求发送到http://requestb.in/,并仔细查看其结构。
  • Then send the same request to api.bonanza.com from Java, it should fail too. 然后从Java向api.bonanza.com发送相同的请求,它也会失败。
  • Remove extra stuff bit by bit until it works. 一点一点地删除多余的东西,直到它起作用。
  • Then come back to Mule and ensure that it creates the same request by tuning the headers it sends, fixing any other differences... 然后回到Mule并通过调整发送的标头并修复所有其他差异来确保它创建了相同的请求...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM