TestRestTemplate.postForEntity возвращает 400 без описательного сообщения - PullRequest
0 голосов
/ 13 июня 2018

У меня возникли проблемы с использованием TestRestTemplate.postForEntity ().Мой код:

@Test
public void testAdd() {
    Map<String,String> mParams=new HashMap<>();
    mParams.put("joke","This is my joke");
    mParams.put("description","Totally Tasteless Joke");
    mParams.put("date",Long.toString(System.currentTimeMillis()));
    ResponseEntity<Joke> reJoke = restTemplate.postForEntity(getURLBase()+"/add",
                                                             null,
                                                             Joke.class,
                                                             mParams
                                                             );

    Joke j = reJoke.getBody();

    System.out.println("Status="+reJoke.getStatusCode()+" j.getJoke()="+j.getJoke()+" id="+j.getId());
}

Возвращаемое значение состояния - 400. На консоли ничего не печатается.

У меня есть testGet (), который работает:

@Test
public void testGet() {
    System.out.println("testGet()");
     initData();

     ResponseEntity<Joke> reJoke=restTemplate.getForEntity(getURLBase()+"/1",Joke.class,new HashMap<String,String>());
     Joke j=reJoke.getBody();
     System.out.println("Status=" + reJoke.getStatusCode()+" j =" + j + (j == null ? "" : j.getJoke()));
}

Я заметил, что в Javadoc for TestRestTemplate написано:

Если доступен Apache Http Client 4.3.2 или выше (рекомендуется), он будет использоваться в качестве клиента и по умолчанию настроен на игнорирование файлов cookie.и перенаправляет.

Я добавил

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.5</version>
        <scope>test</scope>
    </dependency>

в pom.xml, но, похоже, это не имеет никакого значения.

Может кто-нибудь сказатьКак мне решить проблему, или получить больше информации, чем «400»?Это действительно ценится.

1 Ответ

0 голосов
/ 13 июня 2018

После небольшого поиска я обнаружил, что mParams на самом деле является параметрами URL.Мне нужно было отправить закодированные параметры формы в качестве объекта запроса.Рабочий код:

@Test
public void testAdd() {
    MultiValueMap<String, String> mParams= new LinkedMultiValueMap<String, String>();
    mParams.add("joke", "This is my joke");
    mParams.add("description", "Totally Tasteless Joke");
    mParams.add("date", Long.toString(System.currentTimeMillis()));
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(mParams, headers);

    ResponseEntity<Joke> reJoke = restTemplate.postForEntity(getURLBase()+"/add",
                                                             request,
                                                             Joke.class
                                                             );

    Joke j = reJoke.getBody(); 
    System.out.println("Status="+reJoke.getStatusCode()+" j.getJoke()="+j.getJoke()+" id="+j.getId()); 
}
...