我正在尝试调用RESTfull Web服务资源,此资源由第三方提供,资源通过OPTIONS http动词公开。
为了与服务集成,我应该发送一个特定主体的请求,由提供者发送身份,但是当我这样做时,我收到了一个错误的请求。之后我跟踪我的代码,然后我认识到基于以下代码的休息模板忽略了请求的主体:
if ("POST".equals(httpMethod) || "PUT".equals(httpMethod) ||
"PATCH".equals(httpMethod) || "DELETE".equals(httpMethod)) {
connection.setDoOutput(true);
}
else {
connection.setDoOutput(false);
}
我的问题是,是否有一种标准的方法可以覆盖此行为,或者我应该使用其他工具?
答案 0 :(得分:1)
您粘贴的代码来自
new RestTemplate(new SimpleClientHttpRequestWithGetBodyFactory());
我知道,因为我几小时前调试过该代码。 我不得不使用restTemplate对body进行HTTP GET。所以我扩展了SimpleClientHttpRequestFactory,覆盖prepareConnection并使用新工厂创建一个新的RestTemplate。
public class TestRestTemplateTests extends AbstractIntegrationTests {
@Test
public void testMethod() {
RestTemplate restTemplate = new RestTemplate(new SimpleClientHttpRequestWithBodyForGetFactory());
HttpEntity<String> requestEntity = new HttpEntity<>("expected body");
ResponseEntity<String> responseEntity = restTemplate.exchange("http://localhost:18181/test", HttpMethod.GET, requestEntity, String.class);
assertThat(responseEntity.getBody()).isEqualTo(requestEntity.getBody());
}
@Controller("/test")
static class TestController {
@RequestMapping
public @ResponseBody String testMethod(HttpServletRequest request) throws IOException {
return request.getReader().readLine();
}
}
}
基于此工厂创建一个新的RestTemplate
STUFF
使用spring boot证明解决方案正在运行的测试(@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT))
SELECT log_table.id,
log_table.appname,
log_table.level,
STUFF((SELECT ', ' + [log_tag].text [text()]
FROM [log_tag_map] log_tag_map_table
JOIN log_tag
ON log_tag_map_table.tag_id = log_tag.id
WHERE log_tag_map_table.log_id = log_table.id
FOR XML PATH('')),1,2,' ') text
FROM log_table
}