带有Spring Integration HTTP的Spring MVC:如何通过q​​ueryString来避免"?"使用"%3F"进行编码?

时间:2016-07-29 08:31:00

标签: spring spring-mvc spring-integration

我有两个 Spring MVC 应用程序通过 Spring Integration HTTP 互相连接。

我有一个" application1" 和一个" application2"

application1 收到此HTTP GET请求:

http://localhost:8080/application1/api/persons/search/findByName?name=Name

application1 使用此@Controller

管理请求
@Controller
public class ApplicationController {

    @RequestMapping(value = "/api/{repository}/search/{methodName}", method = RequestMethod.GET)
    public void search(@PathVariable(value="repository") String repository, 
                       @PathVariable(value="methodName") String methodName, 
                       ModelMap model, 
                       HttpServletRequest request, 
                       HttpServletResponse response) {                     
        // handling the request ...
    }
}

以下是我在请求属性中可以看到的内容:

getRequestURI=/application1/api/persons/search/findByName
getRequestedSessionId=null
getContextPath=/application1
getPathTranslated=null
getAuthType=null
getMethod=GET
getQueryString=name=Name
getServletPath=/api/persons/search/findByName
getPathInfo=null
getRemoteUser=null

我希望&#34;使用带有<int-http:outbound-gateway>的Spring Integration HTTP将此请求转移到 application2

出站网关使用的信道的消息以这种方式来源于@Controller

MessagingChannel messagingChannel = (MessagingChannel)appContext.getBean("requestChannelBean");
String payload = repository+"/search/"+methodName;
Message<String> message = MessageBuilder.withPayload(payload).build();
MessageChannel requestChannel = messagingChannel.getRequestChannel();
MessagingTemplate messagingTemplate = new MessagingTemplate();
Message<?> response = messagingTemplate.sendAndReceive(requestChannel, message);

这是<int-http:outbound-gateway>配置:

<int-http:outbound-gateway id="gateway" rest-template="restTemplate"
    url="http://localhost:8080/application2/api/service/{pathToCall}"
    http-method="POST" header-mapper="headerMapper" extract-request-payload="true"
    expected-response-type="java.lang.String">
    <int-http:uri-variable name="pathToCall" expression="payload"/>
</int-http:outbound-gateway>

此网关向网址生成HTTP POST请求:

http://localhost:8080/application2/api/service/persons/search/findByName

但是在此请求中我丢失了 application1 收到的原始QueryString

我尝试将queryString直接添加到有效负载,如下所示:

String queryString = "";
if (request.getQueryString()!=null)
    queryString = request.getQueryString();
String payload = repository+"/search/"+methodName+"?"+queryString;

但这不起作用:产生的网址是:

http://localhost:8080/application2/api/service/persons/search/findByName%3Fname=Name

&#34;?&#34;符号被&#34;%3F&#34; 取代,因此被调用的方法为"/service/persons/search/findByName%3Fname=Name",而不是"/service/persons/search/findByName"

我认为这取决于http-method="POST";我想在任何情况下都使用POST方法,因为我想使用这个&#34; service&#34;一般要求。

那么为了尽可能以最简单的方式将原始请求的queryString传递给另一方,我必须做些什么呢?

提前致谢。

1 个答案:

答案 0 :(得分:4)

我找到了答案。

“?”的编码进入“%3F”是<int-http:outbound-gateway>encode-uri="false"属性遗漏而造成的。

默认情况下,出站网关会对URI进行编码,因为默认情况下encode-uri属性设置为true。