Spring MVC 与 Spring Integration HTTP : how to pass the queryString avoiding the "" encoding with "%3F"

虾米姐 阅读:11 2024-02-27 23:08:18 评论:0

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

我有一个“application1”和一个“application2”

应用程序 1 收到此 HTTP GET 请求:

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

应用程序 1 使用此 @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 

我想使用带有 <int-http:outbound-gateway> 的 Spring Integration HTTP 将此请求“传输”application2 .

出站网关使用的 channel 的消息源自 @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> 

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

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

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

我已经尝试将查询字符串直接添加到负载,如下所示:

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

但这不起作用:生成的 url 是:

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

“?”符号被“%3F”替换,所以调用的方法是"/service/persons/search/findByName%3Fname=Name" , 而不是 "/service/persons/search/findByName"

我想这取决于 http-method="POST" ;我想在任何情况下都使用 POST 方法,因为我想将此“服务”用于一般请求。

那么我要怎样做才能以最简单的方式将原始请求的queryString传递给对方呢?

提前致谢。

请您参考如下方法:

我找到了答案。

“?”的编码进入“%3F”是由 <int-http:outbound-gateway> 制作的因为encode-uri="false"缺少属性。

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


标签:Spring
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号