Url,Credentials在RestClient用户界面和Curl中工作,当我通过Spring RestTemplate访问相同内容时出现“500”错误。
我使用以下代码:
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("name", user);
map.add("password", password);
restTemplate.postForObject(url, request, Employee.class, map);
请告诉我您的建议或意见以解决问题。
答案 0 :(得分:12)
我建议您创建HttpComponentsClientHttpRequestFactory
并将其传递给RestTemplate
,如下所述:
ClientHttpRequestFactory requestFactory = new
HttpComponentsClientHttpRequestFactory(HttpClients.createDefault());
RestTemplate restTemplate = new RestTemplate(requestFactory);
通过这种方式,您可以在测试应用程序时避免服务器端问题(如面临错误代码500)。
我遇到的问题与本地环境相同,而不是在服务器上。
最好在构建它时将HttpClients.createDefault()
传递给HttpComponentsClientHttpRequestFactory
,因为默认情况下,此工厂使用系统属性为您的工厂创建HttpClient
,这可能会导致很多真实服务器环境中的痛苦。您也可以传递自定义HttpClient
。
答案 1 :(得分:7)
RestTemplate header Accept problem
--> accept - text/plain, application/json, */*
HttpClient 4.x header Accept
--> accept - application/json
所以我修复了
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);
http://www.manning-sandbox.com/message.jspa?messageID=119733
答案 2 :(得分:3)
我还面临服务器响应为“ 500内部服务器错误”
的情况尽管我收到了来自邮递员的相同参数值的成功回复。 因此问题不在服务器端。
问题出在参数名称输入错误,应用程序参数与服务器参数之间拼写不正确
Server parameter -> requestLabel
Application parameter -> requestLable
希望像我这样的新人可以从中获得帮助。
答案 3 :(得分:1)
您将名称和密码作为uri变量传递:
public <T> T postForObject(java.lang.String url,
@Nullable
java.lang.Object request,
java.lang.Class<T> responseType,
java.util.Map<java.lang.String,?> uriVariables)
throws RestClientException
如果你有一些网址: http://yourhost:8080/dosomethingwithemployee/name/password ,您从网址中提取了名称和密码,然后它可能会有效。
String url = "http://yourhost:8080/dosomethingwithemployee/{name}/{password}"
restTemplate.postForObject(url, request, Employee.class, map);
但是,我认为您一直在尝试在请求正文中发送名称和密码:
public SomeType getResponse(String login, String password) {
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add("Content-Type", "application/json");
Employee employee = new Employee();
employee.setName(login);
employee.setPassword(password);
SomeType responseBody = post("http://locahost:8080/dosomethingwithemployee", employee, headers, SomeType.class);
return responseBody;
}
public <T> T post(String url, Object requestObject, MultiValueMap<String, String> headers, Class<T> responseType) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
HttpEntity request = new HttpEntity(requestObject, headers);
T responseObject = restTemplate.postForObject(url, request, responseType);
return responseObject;
}
答案 4 :(得分:0)
以下工作正常
对于帖子:
restTemplate.postForObject(url,parametersMap,Employee.class);
url is:String - rest api URL parametersMap - MultiValueMap Employee - 需要从JSON响应转换的对象
答案 5 :(得分:0)
如果您的数据协定类缺少默认构造函数,则可能会发生这种情况-因此Jackson未能构造它。您可以尝试通过在类中添加 private 默认构造函数来解决此问题(尽管它是私有的,Jackson仍可以构造您的类实例)。
答案 6 :(得分:0)
尽管上述回答还为时已晚,但是如果上述解决方案不起作用,那么以下解决方案将对某人有所帮助。 对我来说,错误在于Request对象及其标头。 您的请求对象应按照api的要求生成JSON。它不应具有任何其他字段或其他getter方法。 在我的情况下,我还有其他的getter方法,该方法为请求添加了不必要的字段
postForEntity = restTemplate.postForEntity(uri,entity,String.class);
答案 7 :(得分:0)
我遇到了同样的问题。重新启动我的本地服务器重置连接并为我解决了问题。