Spring RestTemplate isteğinde “Accept:” başlığı nasıl ayarlanır?


194

Ben Accept:Spring's kullanarak yaptığım bir istek değerini ayarlamak istiyorum RestTemplate.

İşte benim Bahar istek işleme kodu

@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 istemcim:

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

Bu benim için çalışıyor; Sunucu tarafından JSON dizesi alıyorum.

Sorum şu: Ben belirtebilirsiniz nasıl Accept:başlığını (örneğin application/json, application/xml(örneğin, ...) ve istek yöntemini GET, POST, ...) Ben RestTemplate kullanılır?

Yanıtlar:


355

Ben birini kullanmanızı öneririz exchangebir kabul yöntemlere HttpEntitykendisi için de ayarlayabilirsiniz HttpHeaders. (Ayrıca kullanmak istediğiniz HTTP yöntemini de belirleyebilirsiniz.)

Örneğin,

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

HttpEntity<String> entity = new HttpEntity<>("body", headers);

restTemplate.exchange(url, HttpMethod.POST, entity, String.class);

Bu çözümü tercih ederim çünkü güçlü yazılmıştır, yani. exchangebekliyor HttpEntity.

Ancak, bunu HttpEntitybir requestargüman olarak da iletebilirsiniz postForObject.

HttpEntity<String> entity = new HttpEntity<>("body", headers);
restTemplate.postForObject(url, entity, String.class); 

Bu RestTemplate#postForObjectJavadoc'ta belirtilmiştir .

requestParametresi bir olabilir HttpEntityiçin sipariş isteğine ek HTTP başlıklarını ekleyin .


132

Her istek gönderdiğinizde üstbilgiyi ayarlamaktan kaçınmak için RestTemplate'inizde bir interceptor "ClientHttpRequestInterceptor" ayarlayabilirsiniz.

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

Sonra

List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
interceptors.add(new HeaderRequestInterceptor("Accept", MediaType.APPLICATION_JSON_VALUE));

RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(interceptors);

Spring Boot 1.3 bir HttpHeaderInterceptor'a sahiptir, bu nedenle kendi ClientHttpRequestInterceptor uygulamasını oluşturmamız gerekmez.
whistling_marmot

2
Bazı nedenlerden dolayı, HttpHeaderInterceptor yalnızca bahar önyükleme aygıtlarındadır. Bu yüzden hala ClientHttpRequestInterceptor'u kendimiz uygulamalıyız. Bence bahar ağına taşınmalı.
whistling_marmot

2
Durdurucu şablon eklemek yerine, geri kalan şablona ClientHttpRequestFactory kümesine varsayılan üstbilgiler eklemek daha mı iyi? Not: Bu, varsayılan başlıkları ele aldığından yanıtınızı ayrı bir soruya eklemelisiniz. Burada ulaşmak için bir süre bakmak zorunda kaldı!
sbsatter

çağırmamız gereken iki fark id / pass kullanan iki hizmet varsa, sınırlama düzeyinde bu önleme çok yüksek seviyede değil mi? istek düzeyinde buna ihtiyacınız var - genellikle RestTemplate bir @Bean in spring boot config
Soni

21

Benim gibi, temel kimlik doğrulaması ve geri kalan şablon değişim API'sı içeren üstbilgileri kullanan bir örnek bulmakta zorlanıyorsanız, nihayet çalıştım ...

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

11

RestTemplate kullanarak RESTful API'sini çağırma

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

Örnek 2:

RestTemplate restTemplate = new RestTemplate();
String requestJson = getRequetJson(code, emil, name, lastName);
HttpHeaders headers = new HttpHeaders();
String userPass = USERID + ":" + PWORD;
String authHeader =
    "Basic " + Base64.getEncoder().encodeToString(userPass.getBytes());
headers.set(HttpHeaders.AUTHORIZATION, authHeader);
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
HttpEntity<String> request = new HttpEntity<String>(requestJson, headers);
ResponseEntity<MyObject> responseEntity;
responseEntity =
    this.restTemplate.exchange(URI, HttpMethod.POST, request, Object.class);
responseEntity.getBody()

getRequestJsonYöntem bir JSON Nesne oluşturur:

private String getRequetJson(String Code, String emailAddr, String name) {
    ObjectMapper mapper = new ObjectMapper();
    JsonNode rootNode = mapper.createObjectNode();
    ((ObjectNode) rootNode).put("code", Code);
    ((ObjectNode) rootNode).put("email", emailAdd);
    ((ObjectNode) rootNode).put("firstName", name);
    String jsonString = null;
    try {
        jsonString = mapper.writerWithDefaultPrettyPrinter()
                               .writeValueAsString(rootNode);
    }
    catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    return jsonString;
}

4

İşte basit bir cevap. Umarım birine yardımcı olur.

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

10
Kodunuz, Spring Devtools'u üretim bağımlılığı olarak kullanacak (org.springframework.boot.devtools.remote.client.HttpHeaderInterceptor) içe
aktaracak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.