如何使用Spring rest模板向body发送HTTP OPTIONS请求?

时间:2016-06-23 09:06:41

标签: spring rest-client spring-rest httpverbs http-options-method

我正在尝试调用RESTfull Web服务资源,此资源由第三方提供,资源通过OPTIONS http动词公开。

为了与服务集成,我应该发送一个特定主体的请求,由提供者发送身份,但是当我这样做时,我收到了一个错误的请求。之后我跟踪我的代码,然后我认识到基于以下代码的休息模板忽略了请求的主体:

if ("POST".equals(httpMethod) || "PUT".equals(httpMethod) ||
            "PATCH".equals(httpMethod) || "DELETE".equals(httpMethod)) {
        connection.setDoOutput(true);
    }
    else {
        connection.setDoOutput(false);
    }

我的问题是,是否有一种标准的方法可以覆盖此行为,或者我应该使用其他工具?

1 个答案:

答案 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 

}