簡體   English   中英

如何從AJAX HTML客戶端調用Mule ESB REST服務

[英]How to call Mule ESB REST service from AJAX HTML client

我有一個帶有Servlet入站終結點的簡單Mule流設置,它調用了REST服務:

<flow name="sandboxFlow" doc:name="sandboxFlow">
    <servlet:inbound-endpoint path="rest" responseTimeout="10000" doc:name="Servlet"/>
    <set-payload value="#[message.inboundProperties['http.query.params']]" doc:name="Set Payload"/>
    <logger message="Payload is #[message.payload]" level="INFO" doc:name="Logger"/>
    <jersey:resources doc:name="REST">
        <component class="com.csc.rest.service.PersonService">
    </jersey:resources>
</flow>

順便說一句,我使用servlet端點的原因是因為它在JBoss Webapp中運行。

這是我制作的用於調用REST服務的簡單html / jquery / ajax客戶端:

$(document).ready(function(){
    $("#buttonEnroll").click(function(){
        var name = $("#textName").val();
        var ssn = $("#textSsn").val();
        var params = "name="+name+"&ssn="+ssn;

        $.ajax({
            type: "POST"
            url: "esb/rest/PersonService",
            data: params,
            cache: false,
            success: function(data){
                alert("POST success: " + data);
            }
        });
    });
});

問題在於參數未傳遞到REST服務。 該服務正在被調用,但是我有一個NullPayload。

如果我將端點更改為HTTP,並在Mule容器而不是JBoss中運行相同的應用程序,那么它將起作用。 參數確實通過。 但是在JBoss中使用servlet端點時,參數會丟失。 這是記錄器組件的輸出:

INFO [org.mule.api.processor.LoggerMessageProcessor] (default task-2) Payload is null

任何想法如何解決這個問題? 我需要能夠將數據發布到REST服務

這只是一個起點,我希望在將更多組件添加到項目之前開始工作。

編輯:添加web.xml以顯示Mule配置和PersonService的結構

web.xml中:

<context-param>
    <param-name>org.mule.config</param-name>
    <param-value>mule-config.xml</param-value>
</context-param>

<listener>
    <listener-class>org.mule.config.builders.MuleXmlBuilderContextListener</listener-class>
</listener>

<servlet>
    <servlet-name>muleServlet</servlet-name>
    <servlet-class>org.mule.transport.servlet.MuleReceiverServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>muleServlet</servlet-name>
    <url-pattern>/esb/*</url-pattern>
</servlet-mapping>

PersonService

@Path("/PersonService")
@RequestScoped
public class PersonService {

    PersonManager manager = PersonManager.newPersonManager();

    @POST
    public String addPerson(String input) {
        System.out.println("addPerson: input=" + input.toString());
        HashMap<String,String> params = Toolbox.parseParameters(input)
        String name = params.get("name");
        String ssn = params.get("ssn");
        if(name != null && ssn != null) {
            Person person = new Person(name, ssn);
            manager.persist(person);
        }
        return "person added: " + name + ";" + ssn;
    }
}

我認為您需要刪除:

<set-payload value="#[message.inboundProperties['http.query.params']]" doc:name="Set Payload"/>

並讓負載按原樣撞擊Jersey組件。

然后,您需要替換您的自定義參數解析,而是依靠JAX-RS提供的標准功能:

@POST
public String addPerson(@FormParam("name") String name,
                        @FormParam("ssn") String ssn) {

    if(name != null && ssn != null) {
        Person person = new Person(name, ssn);
        manager.persist(person);
    }
    return "person added: " + name + ";" + ssn;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM