2017-02-12 32 views
0

Моя задача написания кода для извлечения данных из остальных API через URL, как этотКак получить данные с помощью RestTemplate весной

curl -k -v -XPOST -H "username: password" -H "Content-type: application/json" http://localhost:8181/api/rest/person/query -d ' 
    { 
     "name": "person's name", 
     "role": "role code", 
     "programme": "programme code" 
    }' 

И вот мой код

public JsonUser fetchJsonUserByName(String name) throws IOException{ 
     String jsonName = "'{'name': "+"'"+name+"'}'"; 
     String url = "/person/query -d "+jsonName; 
     ResponseEntity<JsonUser> response = restTemplate.getForEntity(url, JsonUser.class); 
      try { 
      if(response.hasBody()) return response.getBody(); 
       else return null; 
     } catch (HttpStatusCodeException e) { 
      if(e.getStatusCode() == HttpStatus.NOT_FOUND) return null; 
      throw new IOException("error fetching user", e); 
     } catch (Exception e) { 
      throw new IOException("error fetching user", e); 
     } 
    } 

И я получил ошибку код 500, когда я запускаю свой код, где я был не прав?

ответ

2

Прежде всего, в этом вопросе ничего не говорится о Spring Integration. Пожалуйста, будьте осторожны с выбором тегов в будущем.

Ваша ошибка здесь в том, что вам не хватает части, которую вы используете POST HTTP-метод с завитком. Но с RestRemplate вы выбираете GET:

/** 
* Retrieve an entity by doing a GET on the specified URL. 
* The response is converted and stored in an {@link ResponseEntity}. 
* <p>URI Template variables are expanded using the given URI variables, if any. 
* @param url the URL 
* @param responseType the type of the return value 
* @param uriVariables the variables to expand the template 
* @return the entity 
* @since 3.0.2 
*/ 
<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException; 

Как-то я предполагаю, что вы имели в виду это:

/** 
* Create a new resource by POSTing the given object to the URI template, 
* and returns the response as {@link ResponseEntity}. 
* <p>URI Template variables are expanded using the given URI variables, if any. 
* <p>The {@code request} parameter can be a {@link HttpEntity} in order to 
* add additional HTTP headers to the request. 
* @param url the URL 
* @param request the Object to be POSTed (may be {@code null}) 
* @param uriVariables the variables to expand the template 
* @return the converted object 
* @since 3.0.2 
* @see HttpEntity 
*/ 
<T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType, Object... uriVariables) 
     throws RestClientException; 
+0

Спасибо за ваш ответ. В следующих вопросах я буду осторожен. –

+1

Btw, '-d' является завитой вариант. В случае сообщения через 'RestTemplate' вам нужно переместить ваше' jsonName' в аргумент 'request'. Прямо сейчас ваш URL-адрес неверен –

+0

Еще раз спасибо за полезную информацию. Я также угадываю причину моего URL. –

1

Пожалуйста, посоветуйтесь с HTTP response codes, explained, где вы увидите, что 500 означает «Я пиздец», и это точка зрения сервера. Это ошибка сервера, а не ваша.

Конечно, ошибка сервера может быть вызвана неправильным вводом, например, вы отправляете абсолютно неправильный URL-адрес /person/query -d '{'name': 'name'}'.

+0

Я проверил вручную, используя команду в терминале, и сервер все еще работал правильно с этим типом ввода '{' name ':' name '}'. Так сложно понять, почему код не работает. –

+1

Проблема заключается не в том, что это неправильный параметр, а в том, что вы помещаете его в URL вместо тела. Другой ответ сделал это достаточно ясным. –