Spring RestTemplate给出了;500“;错误,但URL相同,credentails在RestClient和Curl中工作
作为一个Url,凭证在RestClient UI和Curl中工作,当我通过SpringRESTTemplate访问相同的Url时,会出现“500”错误 我正在使用以下代码:Spring RestTemplate给出了;500“;错误,但URL相同,credentails在RestClient和Curl中工作,spring,Spring,作为一个Url,凭证在RestClient UI和Curl中工作,当我通过SpringRESTTemplate访问相同的Url时,会出现“500”错误 我正在使用以下代码: MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>(); map.add("name", user); map.add("password", password); restTemplate.postF
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("name", user);
map.add("password", password);
restTemplate.postForObject(url, request, Employee.class, map);
MultiValueMap=newlinkedMultivaluemap();
地图。添加(“名称”,用户);
地图。添加(“密码”,密码);
postForObject(url、请求、Employee.class、映射);
请让我知道您对解决问题的建议或意见
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);
我建议创建您的
HttpComponents客户端HttpRequestFactory
,并将其传递给您的RestTemplate
,如下所述:
ClientHttpRequestFactory requestFactory = new
HttpComponentsClientHttpRequestFactory(HttpClients.createDefault());
RestTemplate restTemplate = new RestTemplate(requestFactory);
通过这种方式,在测试应用程序时可以避免服务器端问题(如遇到错误代码500)
我遇到了在本地环境中而不是在服务器上工作的相同问题
在构建时将HttpClients.createDefault()
传递给HttpComponentsClientHttpRequestFactory
是一种很好的做法,因为默认情况下,此工厂使用系统属性为工厂创建HttpClient
,这在实际服务器环境中可能会造成很多麻烦。您还可以通过下面的自定义HttpClient
正常工作
职位:
postForObject(url、参数映射、Employee.class)
url为:字符串-RESTAPI url
参数映射-多值映射
Employee-需要从JSON响应转换的对象您正在将名称和密码作为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
但是,我认为您一直试图在请求正文中发送名称和密码:
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;
}
publicsometypegetresponse(字符串登录,字符串密码){
多值映射头=新的LinkedMultiValueMap();
添加(“内容类型”、“应用程序/json”);
员工=新员工();
employee.setName(登录名);
employee.setPassword(密码);
SomeType responseBody=post(“http://locahost:8080/dosomethingwithemployee,雇员,标题,SomeType.class);
返回响应体;
}
公共T post(字符串url、对象请求对象、多值映射头、类响应类型){
RestTemplate RestTemplate=新RestTemplate();
restemplate.getMessageConverters().add(新映射Jackson2HttpMessageConverter());
restemplate.getMessageConverters().add(新的StringHttpMessageConverter());
HttpEntity请求=新的HttpEntity(请求对象、头);
T responseObject=restemplate.postForObject(url、请求、响应类型);
返回响应对象;
}
我还遇到了服务器响应为“500内部服务器错误”的情况。
虽然我收到了来自邮差的相同参数值的成功响应。
所以问题不在服务器端
问题是参数名输入错误,应用程序参数和服务器参数之间拼写不匹配
Server parameter -> requestLabel
Application parameter -> requestLable
希望像我这样的新手能从中得到帮助。如果您的数据契约类缺少默认构造函数,那么可能会发生这种情况,因此Jackson无法构造它。您可以尝试通过向类中添加一个私有的默认构造函数来解决此问题(尽管它是私有的,Jackson将能够构造您的类实例)。虽然回答太晚,但如果上述解决方案不起作用,下面的解决方案将帮助某些人。 对我来说,错误在于请求对象及其头。 您的请求对象应该根据api的要求生成JSON。它不应该有任何额外的字段或额外的getter方法。 在我的例子中,我有额外的getter方法,它向请求中添加了不必要的字段
postForEntity = restTemplate.postForEntity(uri,entity,String.class);
我也有同样的问题。重新启动本地服务器重置连接并为我解决了问题。您的Employee类是否真的以小写字母e开头?抱歉,这是一个打字错误。.它是Employee.class500是一个服务器错误;响应正文中是否有任何详细信息或服务器日志中的任何有用信息?否。下面是用于参考的堆栈跟踪:org.springframework.web.client.HttpServerErrorException:500内部服务器错误位于org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:77)atFor Post:restTemplate.postForObject(url、参数映射、Employee.class);url是:String-restapi url参数map-MultiValueMap Employee-object需要从JSON响应转换过来,请问HttpClients对象是什么?我找不到任何maven依赖项可以让我导入它。我正在尝试使用RestTemplateXhrTransport连接到websocket,我发现上面的错误。谢谢你!现在回答有点晚,但据我记忆所及,它属于以下项目之一(基于优先级)。您可以尝试每种方法,看看是否出现编译器错误;org.springframeworkspringweb。。。。或org.apache.httpcomponents httpclient。。。。或commons httpclient commons httpclient@DuncanJones在Spring框架问题中对此进行了解释:这对我很有帮助。谢谢!
postForEntity = restTemplate.postForEntity(uri,entity,String.class);