स्प्रिंग रिस्टेमप्लेट अनुरोध पर "स्वीकार करें:" हेडर कैसे सेट करें?


193

मैं Accept:एक अनुरोध का मूल्य सेट करना चाहता हूं जो मैं स्प्रिंग के उपयोग से बना रहा हूं RestTemplate

यहां मेरा स्प्रिंग अनुरोध हैंडलिंग कोड है

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

और यहाँ मेरा जावा रेस्ट क्लाइंट है:

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 स्ट्रिंग मिलती है।

मेरे सवाल यह है: मैं कैसे निर्दिष्ट कर सकते हैं Accept:शीर्ष लेख (जैसे application/json, application/xml, ...) और अनुरोध विधि (जैसे GET, POST, ...) जब मैं RestTemplate का उपयोग करें?

जवाबों:


353

मैं उन exchangeतरीकों में से एक का उपयोग करने का सुझाव देता हूं जो स्वीकार करता HttpEntityहै जिसके लिए आप भी सेट कर सकते हैं HttpHeaders। (आप उस HTTP विधि को भी निर्दिष्ट कर सकते हैं जिसका आप उपयोग करना चाहते हैं।)

उदाहरण के लिए,

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

मैं इस समाधान को पसंद करता हूं क्योंकि यह दृढ़ता से टाइप किया गया है, अर्थात। exchangeएक उम्मीद है HttpEntity

हालाँकि, आप इसे HttpEntityएक requestतर्क के रूप में भी पारित कर सकते हैं postForObject

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

इसका उल्लेख RestTemplate#postForObjectजावदोक में है

requestपैरामीटर हो सकता है HttpEntityकरने के लिए आदेश अनुरोध करने के लिए अतिरिक्त HTTP हेडर जोड़ने


130

आपके द्वारा अनुरोध भेजने पर हर बार हेडर को सेट करने से बचने के लिए आप अपने RestTemplate में एक "क्लाइंटहेटप्रिसेस्टइंटरटेक्टर" इंटरसेप्टर सेट कर सकते हैं।

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

स्प्रिंग बूट 1.3 में एक HttpHeaderInterceptor है, इसलिए हमें ClientHttpRequestInterceptor का अपना कार्यान्वयन बनाने की आवश्यकता नहीं है।
whistling_marmot

2
किसी कारण से, HttpHeaderInterceptor केवल वसंत-बूट-देवटूल में है। इसलिए हमें अभी भी ClientHttpRequestInterceptor को लागू करना होगा। मुझे लगता है कि इसे स्प्रिंग-वेब में स्थानांतरित किया जाना चाहिए।
सीटी

2
क्या डिफ़ॉल्ट हेडर को क्लाइंटहैटरप्राईसेफेस्टफेक्ट में जोड़ना बेहतर है, इंटरसेप्टर जोड़ने के बजाय बाकी टेम्पलेट पर सेट करें? पी एस आप डिफ़ॉल्ट हेडर के साथ इस सौदे के बाद से एक अलग सवाल में अपना जवाब जोड़ना चाहिए। यहाँ पहुँचने के लिए थोड़ी देर देखना पड़ा!
sbsatter

अगर दो सेवाएं हैं जो दो अलग-अलग आईडी / पास का उपयोग करती हैं जिन्हें हमें कॉल करना है, तो रेस्टेमेटप्लेट स्तर पर यह इंटरसेप्टर बहुत अच्छा स्तर है? आपको अनुरोध के स्तर पर इसकी आवश्यकता है - आम तौर पर RestTemplate वसंत बूट विन्यास में एक @ बीन है
कल्पेश सोनी

21

अगर, मेरी तरह, आप एक उदाहरण खोजने के लिए संघर्ष करते हैं जो मूल प्रमाणीकरण और बाकी टेम्पलेट एक्सचेंज एपीआई के साथ हेडर का उपयोग करता है, तो यह वही है जो मैंने आखिरकार काम किया है ...

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 का उपयोग करके एक RESTful 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 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()

getRequestJsonविधि एक JSON वस्तु बनाता है:

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

यहाँ एक सरल जवाब है। आशा है कि यह किसी की मदद करता है।

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
आपका कोड स्प्रिंग देवटूल का उपयोग उत्पादन निर्भरता के रूप में करेगा (
org.springframework.boot.devtools.remote.client.HttpHeaderInterceptor
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.