23

一个 Url,Credentials 在 RestClient UI 以及 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);

请让我知道您的建议或意见以解决问题。

4

8 回答 8

18

我建议创建您的HttpComponentsClientHttpRequestFactory并将其传递给您RestTemplate,如下所述:

ClientHttpRequestFactory requestFactory = new     
      HttpComponentsClientHttpRequestFactory(HttpClients.createDefault());

RestTemplate restTemplate = new RestTemplate(requestFactory);

通过这种方式,您可以在测试应用程序时避免服务器端问题(例如遇到错误代码 500)。

我遇到了在我的本地环境中而不是在服务器上工作的相同问题。

在构建它时传递HttpClients.createDefault()给你是一个很好的做法HttpComponentsClientHttpRequestFactory,因为默认情况下,这个工厂使用系统属性HttpClient为你的工厂创建,这可能会在真实的服务器环境中造成很多痛苦。您也可以通过您的自定义HttpClient.

于 2015-04-06T08:30:15.900 回答
8
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

于 2014-01-07T06:40:04.850 回答
5

我也遇到过服务器响应为“500 Internal server error”的情况

虽然我收到了Postman对相同参数值的成功响应。所以问题不在服务器端。

问题是参数名称拼写错误,应用程序参数和服务器参数之间的拼写不匹配

Server parameter        -> requestLabel
Application parameter   -> requestLable

希望像我这样的新人能从中得到帮助。

于 2018-07-10T12:26:25.337 回答
2

如果您的数据合约类缺少默认构造函数,则可能会发生这种情况 - 因此 Jackson 无法构造它。您可以尝试通过向您的类添加私有默认构造函数来解决此问题(尽管它是私有的,但 Jackson 将能够构造您的类实例)。

于 2019-03-05T12:34:31.880 回答
1

下面工作正常

对于帖子:

restTemplate.postForObject(url, parametersMap, Employee.class);

url 是:String - REST API URL parametersMap - MultiValueMap Employee - 需要从 JSON 响应转换的对象

于 2018-02-07T02:34:19.560 回答
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

docs.spring.io

如果您有一些网址,例如: http://yourhost:8080/dosomethingwithemployee/name/password并且您从 url 本身提取了名称和密码,那么它可能会起作用。

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;
    }
于 2018-03-26T10:23:45.503 回答
0

虽然回答为时已晚,但如果上述解决方案不起作用,以下解决方案将对某人有所帮助。对我来说,错误在于 Request 对象及其标头。您的请求对象应根据 api 的要求生成 JSON。它不应该有任何额外的字段或额外的 getter 方法。就我而言,我有额外的 getter 方法,它添加了不必要的字段来请求

postForEntity = restTemplate.postForEntity(uri,entity,String.class);
于 2020-05-22T21:16:08.217 回答
-1

我遇到过同样的问题。重新启动我的本地服务器重置连接并为我解决了问题。

于 2021-01-07T07:51:56.040 回答