如何在Spring Integration中使用int-http:outbound-gateway发送JSONP请求?

时间:2015-01-29 00:15:52

标签: service jsonp spring-integration

我正在尝试将请求转换为以下调用,请执行Spring Integration异步调用

function sendToSomething(){
    var formattedDate = $.datepicker.formatDate('yy-mm-dd', new Date());
    var emailAddress = $("#prefferedemail").val();

    // Call to Send email address to something
        $.ajax(
            {
                global: false,
                type : "POST",
                url : "http://xyz.something.com/pub/rf?_ri_=X0Gzc2X"
                    + "& EMAIL_PERMISSION_STATUS_=I&email_address_=" + emailAddress + "&SOURCE_CODE=CPK&EMAIL_PREF_CH_DT=" + formattedDate,
                dataType : "jsonp",
            }   
        );
    }
}

关键点是它应该使用 http jsonp

我正在尝试配置类似下面的内容

<int:gateway id="asyncSomeIntService"
        service-interface="com.staples.eoe.integration.AsyncSomeService" default-request-channel="someRequestChannel" />

<int-http:outbound-gateway url="http://xyz.something.com/pub/rf?_ri_=X0Gzc2X "&amp;EMAIL_PERMISSION_STATUS_=I&amp;email_address_={emailAddress}&amp;SOURCE_CODE=CPK&amp;EMAIL_PREF_CH_DT={formattedDate}"
     http-method="POST" expected-response-type="java.lang.String" request-factory="requestFactory" 
     request-channel="someRequestChannel"   reply-channel="someReplyChannel">
    <int-http:uri-variable name="emailAddress" expression="headers.emailAddress" />
    <int-http:uri-variable name="formattedDate" expression="headers.formattedDate" />
</int-http:outbound-gateway>

<bean id="requestFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory">
        <property name="connectTimeout" value="5000" />
        <property name="readTimeout" value="5000" />
</bean>

这个想法是从服务器层调用如下

Message<String> message = MessageBuilder
                    .withPayload("something")
                    .setHeader("formattedDate", "15-01-27")
                    .setHeader("emailAddress", customer.getPreferredEmail())
                    .build();

请求提交的网址很好, 但是我得到的回应部分如下 “很可能你的输入没有通过我们的验证过程。”

是否可以使用Spring Integration发送 JSONP 请求,就像上面的ajax调用一样?

1 个答案:

答案 0 :(得分:1)

虽然好问题!

但是,如果我们转到jQuery文档,我们会看到dataType : "jsonp"的这个描述:

  

如果指定了jsonp,$ .ajax()会自动追加查询字符串参数(默认情况下)callback =?到URL。传递给$ .ajax()的设置的jsonp和jsonpCallback属性可用于分别指定查询字符串参数的名称和JSONP回调函数的名称。服务器应该返回将JSON响应传递给回调函数的有效JavaScript。在将响应中包含的JSON对象传递给$ .ajax()成功处理程序之前,$ .ajax()将执行返回的JavaScript,调用JSONP回调函数。

因此,由于Spring Integration HTTP支持不是基于jQuery的框架,我们应该使用标准的JSONP规则并将callback=?参数添加到url

但是......因为我们在Java中,所以我认为我们不能像JavaScript一样执行返回的响应。虽然,我们是否需要它,因为我们可以使用Java JSON功能解析下游的响应主体?