পরামিতিগুলির সাথে স্প্রিং রেস্টটেম্পলেট জিইটি


266

আমাকে একটি RESTকল করতে হবে যাতে কাস্টম শিরোনাম এবং ক্যোয়ারি প্যারামিটারগুলি অন্তর্ভুক্ত রয়েছে। আমি HttpEntityকেবলমাত্র শিরোনামগুলি দিয়েছি (কোনও দেহ নেই), এবং আমি RestTemplate.exchange()পদ্ধতিটি নিম্নলিখিতভাবে ব্যবহার করছি:

HttpHeaders headers = new HttpHeaders();
headers.set("Accept", "application/json");

Map<String, String> params = new HashMap<String, String>();
params.put("msisdn", msisdn);
params.put("email", email);
params.put("clientVersion", clientVersion);
params.put("clientType", clientType);
params.put("issuerName", issuerName);
params.put("applicationName", applicationName);

HttpEntity entity = new HttpEntity(headers);

HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class, params);

dispatcher servletহ্যান্ডলারের কাছে অনুরোধটি সমাধান করতে অক্ষম হওয়ার সাথে সাথে ক্লায়েন্টের শেষে এটি ব্যর্থ হয় । এটি ডিবাগ করার পরে, দেখে মনে হচ্ছে অনুরোধের পরামিতিগুলি প্রেরণ করা হচ্ছে না।

যখন আমি POSTএকটি অনুরোধের বডি ব্যবহার করে এবং কোনও কোয়েরি পরামিতি ব্যবহার করে কোনও বিনিময় করি তখন এটি ঠিক কাজ করে।

কারো কি কোন ধারনা আছে?

উত্তর:


479

ইউআরএল / পাথ / প্যারাম / ইত্যাদি সহজেই ম্যানিপুলেট করতে, আপনি স্প্রিংয়ের ইউরিকম্পোন্টস বিল্ডার শ্রেণিটি ব্যবহার করতে পারেন । এটি ক্লিনার যা ম্যানুয়ালি স্ট্রিংগুলি সংহত করে এবং এটি আপনার জন্য URL টি এনকোডিংয়ের যত্ন নেয়:

HttpHeaders headers = new HttpHeaders();
headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
        .queryParam("msisdn", msisdn)
        .queryParam("email", email)
        .queryParam("clientVersion", clientVersion)
        .queryParam("clientType", clientType)
        .queryParam("issuerName", issuerName)
        .queryParam("applicationName", applicationName);

HttpEntity<?> entity = new HttpEntity<>(headers);

HttpEntity<String> response = restTemplate.exchange(
        builder.toUriString(), 
        HttpMethod.GET, 
        entity, 
        String.class);

10
দুর্দান্ত টিপ। সবেমাত্র পরিবর্তিত exchangeহয়েছে getForEntity: restTemplate.getForEntity(builder.build().encode().toUri(), String.class);সরলতার জন্য।
ফার্নান্দো এম

12
@ ফার্নান্দোএম.পিনেহিরো: আপনি সঠিক, তবে আপনি যদি জেনারিক ধরণের প্রতিক্রিয়াটি প্রত্যাশা করেন তবে আপনাকে exchangeএকটি ব্যবহার এবং সরবরাহ করতে হবে ParameterizedTypeReference। উদাহরণস্বরূপ আরও যদিও সরলীকৃত করা যেতে পারে, প্রতিস্থাপন builder.build().encode().toUri()সঙ্গে builder.toUriString()
মিরজমাস্টার

@ ক্রিস্টোফ এল আপনি কি সার্ভার সাইডে এই স্ট্রিং প্যারামিটারগুলি গ্রহণ করতে পারবেন তা দেখাতে পারেন ??
কেজেএজভা 48

3
ইউআরআই পেতে একটি শর্টকাট রয়েছে: স্রেফ কল করুনbuilder.toUriString()
মাইকেল পিফেল


179

UriVariables এছাড়াও ক্যোয়ারী স্ট্রিংয়ে প্রসারিত হয়। উদাহরণস্বরূপ, নিম্নলিখিত কলটি, অ্যাকাউন্ট এবং নাম উভয়ের জন্য মানগুলি প্রসারিত করবে:

restTemplate.exchange("http://my-rest-url.org/rest/account/{account}?name={name}",
    HttpMethod.GET,
    httpEntity,
    clazz,
    "my-account",
    "my-name"
);

সুতরাং আসল অনুরোধ url হবে

http://my-rest-url.org/rest/account/my-account?name=my-name

আরও তথ্যের জন্য HierarchicalUriCompferences.expandIntern (UriTemplateVariables) দেখুন। স্প্রিংয়ের সংস্করণটি 3.1.3।


ধন্যবাদ - খুব সহজ সমাধান
আংশুমান আগরওয়াল

2
এবং রেস্টটেম্পলেট ইনস্ট্যান্স তৈরি করার সময়, আপনি কীভাবে এই ক্যোয়ারী প্যারামিটারের মানগুলি ডিফল্ট ইউরিটাইপলেট হ্যান্ডলার (স্প্রিং 5 এর পূর্বে) বা ডিফল্ট ইউরিবিল্ডার ফ্যাক্টরি (স্প্রিং 5+) নির্দিষ্ট করে প্রসারিত করবেন তা নির্দিষ্ট করতে পারেন। আপনি যখন অতিরিক্ত অক্ষর যেমন!, (,) ইত্যাদি এনকোড করতে চান তখন এটি কার্যকর হয়
স্টিফেন রুডল্ফ

আমার ইউআরএলে 10+ প্যারামিটার রয়েছে, প্রতিটি ভেরিয়েবলের তালিকা তৈরির পরিবর্তে কোনও অবজেক্ট / ম্যাপের সাহায্যে এটি অর্জনের কোনও উপায়? আমি UriComponentsBuilderএটি ব্যবহার করতে পারছি না কারণ এটি প্রতিটি অনুরোধের সাথে আলাদা মেট্রিক তৈরি করছেMicrometer
ডগ

@ ডউগ - RestTemplateএর মানগুলির স্থিতিক অ্যারে ( Object... uriVariables) বা নামযুক্ত মানগুলির মানচিত্র ( ) নির্দিষ্ট করার জন্য সমান্তরাল পদ্ধতি রয়েছে Map<String, ?> uriVariables। মানচিত্র সংস্করণ মত শোনাচ্ছে কি আপনি চান হল: restTemplate.exchange(url, HttpMethod.GET, httpEntity, clazz, urlVariablesMap)
এম জাস্টিন

42

অন্তত স্প্রিং 3 সাল থেকে, পরিবর্তে ব্যবহার করার UriComponentsBuilderURL টি নির্মাণ করা (যা একটি বিট বাগাড়ম্বরপূর্ণ হয়), অনেক এর RestTemplateপদ্ধতি পরামিতি (শুধুমাত্র জন্য পাথ প্লেসহোল্ডার গ্রহণ exchange)।

ডকুমেন্টেশন থেকে:

অনেকগুলি RestTemplateপদ্ধতিই ইউআরআই টেম্পলেট এবং ইউআরআই টেম্পলেট ভেরিয়েবল গ্রহণ করে, হয় Stringভারাগ হিসাবে, বা হিসাবে Map<String,String>

উদাহরণস্বরূপ একটি Stringভারার্গ সহ:

restTemplate.getForObject(
   "http://example.com/hotels/{hotel}/rooms/{room}", String.class, "42", "21");

বা একটি সহ Map<String, String>:

Map<String, String> vars = new HashMap<>();
vars.put("hotel", "42");
vars.put("room", "21");

restTemplate.getForObject("http://example.com/hotels/{hotel}/rooms/{room}", 
    String.class, vars);

তথ্যসূত্র: https://docs.spring.io/spring/docs/current/spring-framework-references/integration.html#rest-resttemplate-uri

আপনি তাকান তাহলে JavaDoc জন্য RestTemplateএবং "কোনো URI টেমপ্লেট" এর জন্য অনুসন্ধান, আপনি কোন পদ্ধতি আপনার সাথে প্লেসহোল্ডার ব্যবহার করতে পারেন দেখতে পারেন।


35

ঠিক আছে, তাই আমি বোকা হয়ে যাচ্ছি এবং আমি ইউআরএল পরামিতিগুলির সাথে কোয়েরি পরামিতিগুলিকে বিভ্রান্ত করছি। আমি আশাবাদী ছিলাম যে আমার কুয়েরি প্যারামিটারগুলি কুৎসিত কনটেটেটেড স্ট্রিংয়ের পরিবর্তে সুন্দর করার উপায় থাকবে তবে আমরা সেখানে আছি। এটি কেবলমাত্র সঠিক পরামিতিগুলির সাথে ইউআরএল তৈরির ক্ষেত্রে। আপনি যদি স্ট্রিং স্প্রিং হিসাবে এটি পাস করেন তবে আপনার জন্য এনকোডিংয়েরও যত্ন নেবে।


এটা আপনার জন্য কাজ কি ? আমি ইউরিকম্পোন্টস বিল্ডার ব্যবহার করার একই পদ্ধতির অনুসরণ করেছি তবে, লক্ষ্য ইউআরএল-এ যখন আমি একটি অনুরোধ করি। বিটঅ্যাট্রিবিউট (), আমি বাতিল হয়ে যাই।
ইয়াতিরিগান

47
আমি কেন গুরুত্ব সহকারে বুঝতে পারছি না যে এই উত্তরটির গ্রীন টিক আছে।
প্রদীপ

7
কারণ তিনি ওপি
কল্পনা সনি

তাহলে আপনার সমাধান কী? ধন্যবাদ!
রেমন্ড চেন

18

আমি অনুরূপ কিছু চেষ্টা করছিলাম, এবং রোবস্পাইসের উদাহরণ আমাকে এটির কাজ করতে সহায়তা করেছে :

HttpHeaders headers = new HttpHeaders();
headers.set("Accept", "application/json");

HttpEntity<String> request = new HttpEntity<>(input, createHeader());

String url = "http://awesomesite.org";
Uri.Builder uriBuilder = Uri.parse(url).buildUpon();
uriBuilder.appendQueryParameter(key, value);
uriBuilder.appendQueryParameter(key, value);
...

String url = uriBuilder.build().toString();

HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request , String.class);

15
    String uri = http://my-rest-url.org/rest/account/{account};

    Map<String, String> uriParam = new HashMap<>();
    uriParam.put("account", "my_account");

    UriComponents builder = UriComponentsBuilder.fromHttpUrl(uri)
                .queryParam("pageSize","2")
                        .queryParam("page","0")
                        .queryParam("name","my_name").build();

    HttpEntity<String> requestEntity = new HttpEntity<>(null, getHeaders());

    ResponseEntity<String> strResponse = restTemplate.exchange(builder.toUriString(),HttpMethod.GET, requestEntity,
                        String.class,uriParam);

    //final URL: http://my-rest-url.org/rest/account/my_account?pageSize=2&page=0&name=my_name

রেস্ট টেম্পলেট: ইউরি কম্পোনেন্টস (ইউআরআই ভেরিয়েবল এবং অনুরোধ প্যারামিটার) ব্যবহার করে গতিশীল ইউআরআই তৈরি করুন


6

একটি হ্যাশ মানচিত্রকে ক্যোয়ারী প্যারামিটারের স্ট্রিংয়ে রূপান্তর করা:

Map<String, String> params = new HashMap<>();
params.put("msisdn", msisdn);
params.put("email", email);
params.put("clientVersion", clientVersion);
params.put("clientType", clientType);
params.put("issuerName", issuerName);
params.put("applicationName", applicationName);

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
for (Map.Entry<String, String> entry : params.entrySet()) {
    builder.queryParam(entry.getKey(), entry.getValue());
}

HttpHeaders headers = new HttpHeaders();
headers.set("Accept", "application/json");

HttpEntity<String> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, new HttpEntity(headers), String.class);

3

আমি ভিন্ন পদ্ধতির গ্রহণ করি, আপনি সম্মত হন বা নাও পারেন তবে আমি জাভা কোড সংকলনের পরিবর্তে .properties ফাইল থেকে নিয়ন্ত্রণ করতে চাই

ভিতরে অ্যাপ্লিকেশন.প্রপার্টি ফাইল

endpoint.url = HTTPS: // yourHost / রিসোর্স requestParam1 = {0} এবং requestParam2 = {1}

জাভা কোডটি এখানে চলে যায়, আপনি লিখতে পারেন বা .properties ফাইলের শেষ পয়েন্ট URL টি যদি @PathVariable ({} থাকে) বা @RequestParam (আপনার URL? Key = মান) ইত্যাদি আছে কিনা তা সন্ধান করতে শর্তটি পরিবর্তন করতে পারেন ... তারপরে সেই পদ্ধতিটি অনুরোধ করুন .. ... এটির গতিশীল এবং ভবিষ্যতে ওয়ান স্টপ শপটিতে কোড পরিবর্তন করার দরকার নেই ...

আমি এখানে প্রকৃত কোডের চেয়ে বেশি ধারণা দেওয়ার চেষ্টা করছি ... প্রত্যেকটি @RequestParam, এবং @PathVariable ইত্যাদির জন্য জেনেরিক পদ্ধতি লেখার চেষ্টা করব ... তারপরে প্রয়োজন অনুসারে কল করুন

  @Value("${endpoint.url}")
  private String endpointURL;
  // you can use variable args feature in Java
  public String requestParamMethodNameHere(String value1, String value2) {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate
           .getMessageConverters()
           .add(new MappingJackson2HttpMessageConverter());

    HttpHeaders headers = new HttpHeaders();
    headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
    HttpEntity<String> entity = new HttpEntity<>(headers);

    try {
      String formatted_URL = MessageFormat.format(endpointURL, value1, value2);
      ResponseEntity<String> response = restTemplate.exchange(
                    formatted_URL ,
                    HttpMethod.GET,
                    entity,
                    String.class);
     return response.getBody();
    } catch (Exception e) { e.printStackTrace(); }

3

স্প্রিং ওয়েবে ৪.৩..6 এও দেখছি

public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables)

এর অর্থ আপনাকে কুৎসিত মানচিত্র তৈরি করতে হবে না

সুতরাং আপনি যদি এই url থাকে

http://my-url/action?param1={param1}&param2={param2}

আপনি হয় করতে পারেন

restTemplate.getForObject(url, Response.class, param1, param2)

অথবা

restTemplate.getForObject(url, Response.class, param [])

2
public static void main(String[] args) {
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.set("Accept", MediaType.APPLICATION_JSON_VALUE);
         final String url = "https://host:port/contract/{code}";
         Map<String, String> params = new HashMap<String, String>();
         params.put("code", "123456");
         HttpEntity<?> httpEntity  = new HttpEntity<>(httpHeaders); 
         RestTemplate restTemplate  = new RestTemplate();
         restTemplate.exchange(url, HttpMethod.GET, httpEntity,String.class, params);
    }

2

যদি আপনি রেস্ট টেম্পলেটটির জন্য অ-প্যারামিট্রাইজড প্যারামগুলি পাস করেন তবে প্যারামিটারগুলি বিবেচনা করে আপনার পাস করা আলাদা আলাদা ইউআরএল সবার জন্য একটি মেট্রিক থাকবে। আপনি প্যারামিট্রাইজড ইউআরএলগুলি ব্যবহার করতে চান:

http://my-url/action?param1={param1}&param2={param2}

পরিবর্তে

http://my-url/action?param1=XXXX&param2=YYYY

দ্বিতীয় কেসটি হ'ল ইউরিকম্পোন্টস বিল্ডার ক্লাসটি ব্যবহার করে আপনি কী পান।

প্রথম আচরণটি বাস্তবায়নের একটি উপায় নিম্নলিখিত:

Map<String, Object> params = new HashMap<>();
params.put("param1", "XXXX");
params.put("param2", "YYYY");

String url = "http://my-url/action?%s";

String parametrizedArgs = params.keySet().stream().map(k ->
    String.format("%s={%s}", k, k)
).collect(Collectors.joining("&"));

HttpHeaders headers = new HttpHeaders();
headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
HttpEntity<String> entity = new HttpEntity<>(headers);

restTemplate.exchange(String.format(url, parametrizedArgs), HttpMethod.GET, entity, String.class, params);

0

যদি আপনার ইউআরএল হয় http://localhost:8080/context path?msisdn={msisdn}&email={email}

তারপর

Map<String,Object> queryParams=new HashMap<>();
queryParams.put("msisdn",your value)
queryParams.put("email",your value)

আপনার দ্বারা বর্ণিত হিসাবে রিস্টেমপ্লেট এক্সচেঞ্জ পদ্ধতির জন্য কাজ করে

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