복붙노트

[SPRING] Spring RestTemplate은 "500"오류를 발생 시키지만 같은 URL, credentails는 RestClient와 Curl에서 작동합니다.

SPRING

Spring RestTemplate은 "500"오류를 발생 시키지만 같은 URL, credentails는 RestClient와 Curl에서 작동합니다.

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);

문제를 해결하기 위해 제안이나 의견을 알려주십시오.

해결법

  1. ==============================

    1.HttpComponentsClientHttpRequestFactory를 만들고 아래에 설명 된대로 RestTemplate에 전달할 것을 제안합니다.

    HttpComponentsClientHttpRequestFactory를 만들고 아래에 설명 된대로 RestTemplate에 전달할 것을 제안합니다.

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

    이렇게하면 응용 프로그램을 테스트 할 때 서버 측 문제 (예 : 오류 코드 500)를 피할 수 있습니다.

    나는 서버가 아닌 내 로컬 환경에서 똑같은 문제를 겪었다.

    HttpClients.createDefault ()를 HttpComponentsClientHttpRequestFactory에 전달하는 것은 좋은 습관입니다. 기본적으로이 팩토리는 시스템 속성을 사용하여 팩토리에 대한 HttpClient를 만들고 실제 서버 환경에서 많은 고통을 유발할 수 있습니다. 또한 사용자 정의 HttpClient를 전달할 수도 있습니다.

  2. ==============================

    2.

    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

  3. ==============================

    3.또한 서버 응답이 "500 내부 서버 오류"인 상황에 직면했습니다.

    또한 서버 응답이 "500 내부 서버 오류"인 상황에 직면했습니다.

    Postman에서 동일한 매개 변수 값에 대한 응답을 받았습니다. 그래서 문제는 서버 측에 있지 않았습니다.

    문제는 매개 변수 이름에 오타가 있었으며 응용 프로그램 매개 변수와 서버 매개 변수 사이의 불일치 맞춤법이었습니다.

    Server parameter        -> requestLabel
    Application parameter   -> requestLable
    

    새로운 사람이 나 같은 사람에게서 도움을 받기를 바랍니다.

  4. ==============================

    4.uri 변수로 이름과 비밀번호를 전달합니다.

    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

    같은 URL이 있다면 : http : // yourhost : 8080 / dosomethingwitheme / 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;
        }
    
  5. ==============================

    5.아래 작품은 잘

    아래 작품은 잘

    게시물 :

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

    url은 다음과 같습니다. String - 나머지 api URL parametersMap - MultiValueMap Employee - JSON 응답에서 변환해야하는 객체

  6. ==============================

    6.데이터 컨트랙트 클래스에 기본 생성자가 없으므로 Jackson이 생성자 클래스를 생성하지 못하는 경우이 문제가 발생할 수 있습니다. 클래스에 private 기본 생성자를 추가하여이 문제를 해결할 수 있습니다 (private 클래스 임에도 불구하고 Jackson은 클래스 인스턴스를 구성 할 수 있습니다).

    데이터 컨트랙트 클래스에 기본 생성자가 없으므로 Jackson이 생성자 클래스를 생성하지 못하는 경우이 문제가 발생할 수 있습니다. 클래스에 private 기본 생성자를 추가하여이 문제를 해결할 수 있습니다 (private 클래스 임에도 불구하고 Jackson은 클래스 인스턴스를 구성 할 수 있습니다).

  7. from https://stackoverflow.com/questions/11178937/spring-resttemplate-gives-500-error-but-same-url-credentails-works-in-restcli by cc-by-sa and MIT license