[SPRING] Spring RestTemplate 요청에 "Accept :"헤더를 설정하는 방법?
SPRINGSpring RestTemplate 요청에 "Accept :"헤더를 설정하는 방법?
Spring의 RestTemplate을 사용하여 요청할 때 Accept : 값을 설정하려고합니다.
Spring 요청 처리 코드입니다.
@RequestMapping(
value= "/uom_matrix_save_or_edit",
method = RequestMethod.POST,
produces="application/json"
)
public @ResponseBody ModelMap uomMatrixSaveOrEdit(
ModelMap model,
@RequestParam("parentId") String parentId
){
model.addAttribute("attributeValues",parentId);
return model;
}
다음은 Java REST 클라이언트입니다.
public void post(){
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
params.add("parentId", "parentId");
String result = rest.postForObject( url, params, String.class) ;
System.out.println(result);
}
이것은 나를 위해 일합니다. JSON 문자열을 서버 측에서 가져옵니다.
제 질문은 : RestTemplate을 사용할 때 Accept : 헤더 (예 : application / json, application / xml, ...) 및 요청 메소드 (예 : GET, POST 등)를 어떻게 지정할 수 있습니까?
해결법
-
==============================
1.HttpHeaders를 설정할 수있는 HttpEntity를 받아들이는 교환 메소드 중 하나를 사용하는 것이 좋습니다. (사용할 HTTP 메소드를 지정할 수도 있습니다.)
HttpHeaders를 설정할 수있는 HttpEntity를 받아들이는 교환 메소드 중 하나를 사용하는 것이 좋습니다. (사용할 HTTP 메소드를 지정할 수도 있습니다.)
예를 들어,
RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); HttpEntity<String> entity = new HttpEntity<>("parameters", headers); restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
강하게 입력 된이 솔루션을 선호합니다. exchange는 HttpEntity를 기대합니다.
그러나 HttpEntity를 요청 인수로 postForObject에 전달할 수도 있습니다.
HttpEntity<String> entity = new HttpEntity<>("parameters", headers); restTemplate.postForObject(url, entity, String.class);
이것은 RestTemplate # postForObject Javadoc에 언급되어있다.
-
==============================
2.요청을 보낼 때마다 헤더를 설정하지 않으려면 RestTemplate에 인터셉터 "ClientHttpRequestInterceptor"를 설정할 수 있습니다.
요청을 보낼 때마다 헤더를 설정하지 않으려면 RestTemplate에 인터셉터 "ClientHttpRequestInterceptor"를 설정할 수 있습니다.
public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor { private final String headerName; private final String headerValue; public HeaderRequestInterceptor(String headerName, String headerValue) { this.headerName = headerName; this.headerValue = headerValue; } @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { request.getHeaders().set(headerName, headerValue); return execution.execute(request, body); } }
그때
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); interceptors.add(new HeaderRequestInterceptor("Accept", MediaType.APPLICATION_JSON_VALUE)); RestTemplate restTemplate = new RestTemplate(); restTemplate.setInterceptors(interceptors);
-
==============================
3.나처럼, 기본 인증과 나머지 템플릿 교환 API로 헤더를 사용하는 예제를 찾으려 고 노력했다면, 이것이 내가 마침내 해결 한 것입니다 ...
나처럼, 기본 인증과 나머지 템플릿 교환 API로 헤더를 사용하는 예제를 찾으려 고 노력했다면, 이것이 내가 마침내 해결 한 것입니다 ...
private HttpHeaders createHttpHeaders(String user, String password) { String notEncoded = user + ":" + password; String encodedAuth = Base64.getEncoder().encodeToString(notEncoded.getBytes()); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.add("Authorization", "Basic " + encodedAuth); return headers; } private void doYourThing() { String theUrl = "http://blah.blah.com:8080/rest/api/blah"; RestTemplate restTemplate = new RestTemplate(); try { HttpHeaders headers = createHttpHeaders("fred","1234"); HttpEntity<String> entity = new HttpEntity<String>("parameters", headers); ResponseEntity<String> response = restTemplate.exchange(theUrl, HttpMethod.GET, entity, String.class); System.out.println("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody()); } catch (Exception eek) { System.out.println("** Exception: "+ eek.getMessage()); } }
-
==============================
4.코드 : 템플릿을 사용하여 나머지 API 호출하기
코드 : 템플릿을 사용하여 나머지 API 호출하기
1)
RestTemplate restTemplate = new RestTemplate(); // Add the Jackson message converter restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization", "Basic XXXXXXXXXXXXXXXX="); HttpEntity<String> entity = new HttpEntity<String>("parameters", headers); restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor(USERID, PWORD)); String requestJson = getRequetJson(Code, emailAddr, firstName, lastName); // response = restTemplate.postForObject(URL, requestJson, MYObject.class);
또는
2)
RestTemplate restTemplate = new RestTemplate(); String requestJson = getRequetJson(code, emil, name, lastName); // HttpHeaders headers = new HttpHeaders(); String userPass = USERID + ":" + PWORD; String authHeaderValue = "Basic " + Base64.getEncoder().encodeToString(userPass.getBytes()); headers.set(HttpHeaders.AUTHORIZATION, authHeaderValue); headers.setContentType(MediaType.APPLICATION_JSON); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); HttpEntity<String> request = new HttpEntity<String>(requestJson, headers); // ResponseEntity<MyObject> responseEntity =this.restTemplate.exchange(URI, HttpMethod.POST, request, MyObject.class); responseEntity.getBody()
json 객체를 만드는 메소드
private String getRequetJson(String Code, String emailAddr, String firstName, String lastName) { ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.createObjectNode(); ((ObjectNode) rootNode).put("code", Code); ((ObjectNode) rootNode).put("email", emailAdd); ((ObjectNode) rootNode).put("firstName", firstname); ((ObjectNode) rootNode).put("lastName", lastname); String jsonString = null; try { jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode); } catch (JsonProcessingException e) { e.printStackTrace(); } return jsonString; }
-
==============================
5.다음은 간단한 대답입니다. 누군가가 도움이되기를 바랍니다.
다음은 간단한 대답입니다. 누군가가 도움이되기를 바랍니다.
import org.springframework.boot.devtools.remote.client.HttpHeaderInterceptor; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.web.client.RestTemplate; public String post(SomeRequest someRequest) { // create a list the headers List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(); interceptors.add(new HttpHeaderInterceptor("Accept", MediaType.APPLICATION_JSON_VALUE)); interceptors.add(new HttpHeaderInterceptor("ContentType", MediaType.APPLICATION_JSON_VALUE)); interceptors.add(new HttpHeaderInterceptor("username", "user123")); interceptors.add(new HttpHeaderInterceptor("customHeader1", "c1")); interceptors.add(new HttpHeaderInterceptor("customHeader2", "c2")); // initialize RestTemplate RestTemplate restTemplate = new RestTemplate(); // set header interceptors here restTemplate.setInterceptors(interceptors); // post the request. The response should be JSON string String response = restTemplate.postForObject(Url, someRequest, String.class); return response; }
from https://stackoverflow.com/questions/19238715/how-to-set-an-accept-header-on-spring-resttemplate-request by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 부모 컨텍스트에서 자식 컨텍스트와 스프링 컨텍스트 선언 (0) | 2018.12.06 |
---|---|
[SPRING] http가 상태가 없다고 할 때의 의미는 무엇입니까? (0) | 2018.12.06 |
[SPRING] Spring Security는 로그인 성공 후 이전 페이지로 리다이렉트한다. (0) | 2018.12.06 |
[SPRING] 독립 실행 형 Java 응용 프로그램에서 Spring 3 자동 배선 사용 (0) | 2018.12.06 |
[SPRING] util 스키마를 사용하여리스트를 자동 배선하는 것은 NoSuchBeanDefinitionException을 준다. (0) | 2018.12.06 |