如何用Spring的RestTemplate模仿curl REST调用?

时间:2016-02-04 03:00:11

标签: spring rest curl junit resttemplate

有一个外部的Restful Web服务,如果它有多个输入,它会接收JSON有效负载,但如果只有一个输入,它只需要该值。

例如,对于多个输入,这有效:

curl -H "Content-Type: application/json" -X POST -d '{ "amount": 10000, "interestRate": ".28", "term": "12", "state": "Georgia"}' http://localhost:8080/webservices/REST/sample/loan

返回:

Approved

对于单个输入:

curl -H "Content-Type: application/json" -X POST -d "18" http://localhost:8080/webservices/REST/sample/age

返回:

Approved

使用Spring Boot,尝试按顺序创建一个JUnit测试,看看我是否可以使用Spring的RestTemplate API发布到这个外部服务。

public void RestWebServiceTest {

    private RestTemplate restTemplate;
    private HttpHeaders headers;

    @Before
    public void setup() {
        restTemplate = new RestTemplate();
        headers = new HttpHeaders();
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    }

    @Test
    public void validLoan() {
        final String uri = "http://localhost:8080/webservices/REST/sample/Loan";
        Map<String, String> input = new HashMap<>();
        input.put("amount", "10000");
        input.put("interestRate", ".28");
        input.put("term", "12");
        input.put("state", "Georgia");
        String result = restTemplate.postForObject(uri, input, String.class);
        assertEquals("Approved", result);
    }

    @Test
    public void validAge() {
        final String uri = "http://localhost:8080/webservices/REST/sample/age";
        Integer input = 18;
        String result = restTemplate.postForObject(uri, input, String.class);
        assertEquals("Approved", result);
    }

    @Test
    public void validCountry() {
        final String uri = "http://localhost:8080/webservices/REST/sample/country
        String input = "US";
        String result = restTemplate.postForObject(uri, input, String.class);
        assertEquals("Approved", result);
    }
}

除了v​​alidCountry()测试方法之外,所有这些都有效:

org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597)

这很奇怪,因为这个curl命令适用于同一个调用:

curl -H "Content-Type: application/json" -X POST -d 'US' http://localhost:8080/webservices/REST/sample/country

返回:

Approved

问题(S):

  1. 如何在validCountry()测试方法中模仿国家的其余调用(参见上面的curl命令)?

  2. 我是否需要为HTTP标头添加或更改其他值(在setup()方法内)?

  3. 不要理解validAge是通过使用Integer包装器类来工作的,但字符串不是吗?

  4. 使用Spring的RestTemplate API有更好的方法吗?

  5. 感谢您抽出宝贵时间阅读此内容......

1 个答案:

答案 0 :(得分:1)

您需要将Content-Type设置为application / json。必须在请求中设置Content-Type。以下是用于设置Content-Type

的修改代码
@Test
public void validCountry() {
    final String uri = "http://localhost:8080/webservices/REST/sample/country";
    String input = "US";
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<String> request = new HttpEntity<String>(input, headers);
    String result = restTemplate.postForObject(uri, request, String.class);
    assertEquals("Approved", result);
}

在这里,HttpEntity是根据您的输入构建的,即&#34; US&#34;并带有标题。

我认为这可以回答你问题1,2和4.但不是3。