স্প্রিং রেস্টটেম্পলেট অনুরোধে একটি "গ্রহণ করুন:" শিরোনাম কীভাবে সেট করবেন?


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

আমি এই সমাধানটি পছন্দ করি কারণ এটি দৃ strongly়ভাবে টাইপ করা হয়, যেমন। exchangeপ্রত্যাশা একটি HttpEntity

তবে, আপনি এটি HttpEntityএকটি requestযুক্তি হিসাবে পাস করতে পারেন postForObject

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

RestTemplate#postForObjectজাভাডোকে এটি উল্লেখ করা হয়েছে ।

requestপ্যারামিটারটি হতে পারে HttpEntityকরার জন্য অর্ডার অনুরোধ অতিরিক্ত HTTP- র হেডার যোগ


130

আপনি প্রতিবার অনুরোধ পাঠানোর সময় শিরোনামটি সেট করা থেকে বাঁচতে আপনি আপনার রেস্টটেম্পলেটে একটি ইন্টারসেপ্টর "ক্লায়েন্টহট্টপ্রেকুয়েস্টইন্টারসেপ্টার" সেট করতে পারেন।

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 রয়েছে, তাই আমাদের ক্লায়েন্টহট্টপ্রেমিকুয়েস্টইন্টারসেপ্টরের নিজস্ব বাস্তবায়ন তৈরি করার দরকার নেই।
হুইসেলিং_মারমোট

2
কোনও কারণে, HTTPHeaderInterceptor কেবল বসন্ত-বুট-ডেভলগুলিতে। সুতরাং আমাদের এখনও ক্লায়েন্টহট্টপ্রেইকুয়েস্টইন্টারসেপ্টরকে নিজেরাই প্রয়োগ করতে হবে। আমি মনে করি এটি বসন্ত-ওয়েবে স্থানান্তরিত করা উচিত।
হুইসলিং_মারমোট

2
ক্লায়েন্টএইচটিপিআরকুয়েস্টফ্যাক্টির ডিফল্ট শিরোনামগুলিকে ইন্টারসেপ্টর যুক্ত না করে বাকী টেম্পলেটে সেট করা ভাল? পিএস আপনার পৃথক প্রশ্নে আপনার উত্তর যুক্ত করা উচিত যেহেতু এটি ডিফল্ট শিরোনামগুলির সাথে সম্পর্কিত। এখানে পৌঁছতে কিছুক্ষণ তাকিয়ে থাকতে হয়েছিল!
sbsatter

যদি আমাদের কাছে কল করতে হবে এমন দুটি ডিফ আইডি / পাস ব্যবহার করে এমন দুটি পরিষেবা রয়েছে, তবে রিস্টেম্প্লেট স্তরে এই ইন্টারসেপ্টরটি কি খুব উচ্চ স্তরের অধিকার? আপনার অনুরোধ স্তরে এটি দরকার - সাধারণত রেস্টটেম্পলেটটি বসন্ত বুট কনফিগারেশনের
@ বিয়ান

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

রেস্টটেম্পলেট ব্যবহার করে একটি 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 আমদানি করে) ...
স্নোরবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.