0

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

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

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

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

4

1 回答 1

1

您粘贴的代码来自

SimpleClientHttpRequestFactory.prepareConnection(HttpURLConnection connection, String httpMethod)

我知道是因为我已经在几个小时前调试了该代码。我必须使用restTemplate 对body 进行HTTP GET。所以我扩展了 SimpleClientHttpRequestFactory,覆盖了 prepareConnection 并使用新工厂创建了一个新的 RestTemplate。

public class SimpleClientHttpRequestWithGetBodyFactory extends SimpleClientHttpRequestFactory {

@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
    super.prepareConnection(connection, httpMethod);
    if ("GET".equals(httpMethod)) {
        connection.setDoOutput(true);
    }
}

}

基于这个工厂创建一个新的 RestTemplate

new RestTemplate(new SimpleClientHttpRequestWithGetBodyFactory());

证明解决方案正在使用 spring boot 的测试 (@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT))

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();
    }
}

}

于 2016-10-07T20:48:03.417 回答