JSON এ রেস্টটেম্প্লেটের মাধ্যমে অনুরোধ পোস্ট করুন


126

কীভাবে আমার সমস্যাটি সমাধান করবেন আমি এর কোনও উদাহরণ পাইনি, তাই আমি আপনাকে সাহায্য চাইতে চাই। JSON এ রেস্টস্টেম্পলেট অবজেক্টটি ব্যবহার করে আমি কেবল পোস্টের অনুরোধটি পাঠাতে পারি না

যতবার পেলাম:

org.springframework.web.client.HttpClientErrorException: 415 অসমর্থিত মিডিয়া প্রকার

আমি এইভাবে রেস্ট টেম্পলেট ব্যবহার করি:

...
restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
list.add(new MappingJacksonHttpMessageConverter());
restTemplate.setMessageConverters(list);
...
Payment payment= new Payment("Aa4bhs");
Payment res = restTemplate.postForObject("http://localhost:8080/aurest/rest/payment", payment, Payment.class);

কি আমার দোষ?


1
@troyfolger URL আর বৈধতা নেই
Noremac

ধন্যবাদ - এই লিঙ্কটি এই লেখার মতো কাজ করছে: বসন্ত.io
guides

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

এই সমস্যাগুলি বেশিরভাগ সার্ভার এপিআই কনফিগারেশনের সাথে সম্পর্কিত। আপনি স্ট্যান্ডেলোন ক্লায়েন্ট (পোস্টম্যানের মতো) ব্যবহার করে সার্ভার এপিআই পরীক্ষা করেন এবং অনুরোধে একই শিরোনামগুলি প্রতিলিপি করুন। কমপক্ষে আমার ক্ষেত্রে যা ট্রিক করেছে।
লিনাস

1
@Johnny বি, যদি এই উত্তর দেওয়া হয়েছে দয়া করে উত্তর দিন উপলক্ষে
বিশাল

উত্তর:


161

এই কৌশলটি আমার পক্ষে কাজ করেছে:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.put(url, entity);

আশা করি এটা কাজে লাগবে


3
দয়া করে ব্যাখ্যা করুন কোন সারিতে HTTP অনুরোধের ফলাফলটি ফিরিয়ে
আনতে হবে

আমার জন্য কোনও শিরোনাম নির্দিষ্ট করার প্রয়োজন ছিল না। আমি এইচটিটিপিটিটিটি ব্যবহার করেছি যা একক প্যারামিটার নেয়।
কনস্টান্টিনো ক্রোনম্বার্গার

24
পদ্ধতি .put()হল void!
সদস্যরা

4
postForEntity(url, entity, String.class)জায়গায় কাজ করে ব্যবহার করা হচ্ছেput(url, entity)
জানাক মীনা 16'19

1
কানু, অনুরোধজসন বৈধ জেএসএন স্ট্রিং নাকি অন্য কিছু?
দেবা

95

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

RestTemplate restTemplate = new RestTemplate();

String url = "endpoint url";
String requestJson = "{\"queriedQuestion\":\"Is there pain in your hand?\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
String answer = restTemplate.postForObject(url, entity, String.class);
System.out.println(answer);

বিশেষভাবে জেএসএন পার্সার আমার বিশ্রামের শেষ পয়েন্টটি ক্ষেত্রের নামগুলির আশেপাশে প্রয়োজনীয় ডাবল উদ্ধৃতি ব্যবহার করছিল তাই আমি আমার অনুরোধ জেএসন স্ট্রিংয়ে ডাবল উদ্ধৃতিগুলি এড়িয়ে গেছি।


তোমার দর্শন লগ করা দয়া করে করতে পারেন সাহায্যের এই আমাকে stackoverflow.com/questions/42240927/...
FaisalAhmed

স্প্রিং জাভা অবজেক্টটিকে স্বয়ংক্রিয়ভাবে জাস্টসনে রূপান্তর করতে বার্তা রূপান্তরকারীকে কীভাবে রিসটেম্প্লেট সহ রেস্টুল এপিআইতে রূপান্তর করতে পারে?
পড়া

1
সমস্যাটি সমাধানের জন্য অ্যাপলিকেশন_জেএসএস-এ মিডিয়া প্রকার সেট করা কী।
পিট টি

আমি এইচটিপিএনটিটি <স্ট্রিং> সত্তা = নতুন এইচটিপিএন্টিটি <স্ট্রিং> (অনুরোধজসন, শিরোনাম) ব্যবহার করে আমার সমস্যার সমাধান করেছি; এই লাইন
বেদ প্রকাশ

76

আমি নীচের হিসাবে JSONObjects সঙ্গে বিশ্রাম টেম্পলেট ব্যবহার করেছি:

// create request body
JSONObject request = new JSONObject();
request.put("username", name);
request.put("password", password);

// set headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(request.toString(), headers);

// send request and parse result
ResponseEntity<String> loginResponse = restTemplate
  .exchange(urlString, HttpMethod.POST, entity, String.class);
if (loginResponse.getStatusCode() == HttpStatus.OK) {
  JSONObject userJson = new JSONObject(loginResponse.getBody());
} else if (loginResponse.getStatusCode() == HttpStatus.UNAUTHORIZED) {
  // nono... bad credentials
}

ধন্যবাদ - জেএসএনওবজেক্ট টু স্ট্রিং পদ্ধতিটি আমার পক্ষে কার্যকর ছিল, এটি আমার জেএসএনস্ট্রিংকে সঠিকভাবে পেতে সহায়তা করেছিল।
সাইমন

1
এর জন্য উপরের কোডটি কীভাবে বিকাশ করা যায়: curl -vvv -X POST " লোকালহোস্ট: 8080 / সিলি সার্ভিসেসআরসি / ওউথ /… "?
প্র_এ

@ মিকায়েল লেপিস্টö আমি সার্ভার শেষে জেসন থেকে এই পরামিতিগুলি কীভাবে পুনরুদ্ধার করতে পারি ??
কেজেএজভা 48

@ KJEjava48 আপনার অর্থ কী তা আমি বুঝতে পারছি না ... এটি প্রতিক্রিয়াতে সার্ভার সাইড কোড। যদি আপনি কীভাবে জসন প্রতিক্রিয়াটি পার্স করবেন তা ভাবছেন, তবে এটি আপনি ব্যবহার করছেন এমন ফ্রেমওয়ার্কের উপর নির্ভর করে।
মিকেল লেপিস্টö

@ মিকায়েললিপিস্টö আমি বোঝাচ্ছি যে জাভাতে প্রতিক্রিয়া কীভাবে পাবেন তা সহ অন্য প্রান্তে জসন প্রতিক্রিয়াটিকে কীভাবে পার্স করবেন ?? আপনি কেবল একটি প্রান্তের জন্য কোড (যেমন, সার্ভার সাইড) পোস্ট করেছেন।
কেজেজেভা 48


9

আপনি যদি স্প্রিং 3.0 ব্যবহার করেন, org.springframework.web.client.HttpClientErrorException: 415 অসমর্থিত মিডিয়া টাইপ ব্যতিক্রমটি এড়ানোর একটি সহজ উপায়, আপনার শ্রেণিপথে জ্যাকসন জার ফাইলগুলি অন্তর্ভুক্ত করা এবং mvc:annotation-drivenকনফিগার উপাদান ব্যবহার করা । এখানে নির্দিষ্ট হিসাবে

আমি mvc-ajax অ্যাপ্লিকেশনটির জন্য কোনও বিশেষ কনফিগারেশন ছাড়াই কেন কাজ করেছে তা জানার চেষ্টা করে আমার চুলগুলি টানছিলামMappingJacksonHttpMessageConverter । উপরে লিঙ্কিত নিবন্ধটি যদি আপনি নিবিড়ভাবে পড়েন:

কভারগুলির নীচে, স্প্রিং এমভিসি সিরিয়ালাইজেশন সম্পাদনের জন্য একটি এইচটিপিএমসেসেজ কনভার্টারের প্রতিনিধি করে। এই ক্ষেত্রে, স্প্রিং এমভিসি জ্যাকসন জেএসএন প্রসেসরের উপর নির্মিত ম্যাপিংজ্যাকসন এইচটিপিএমেসেজ কনভার্টারের আহ্বান জানায়। আপনি যখন আপনার ক্লাসপথে উপস্থিত জ্যাকসনের সাথে এমভিসি: টিকাটি চালিত কনফিগারেশন উপাদানটি ব্যবহার করেন তখন এই বাস্তবায়ন স্বয়ংক্রিয়ভাবে সক্ষম হয় ।


7

"415 অসমর্থিত মিডিয়া প্রকার" ত্রুটি আপনাকে বলছে যে সার্ভারটি আপনার পোস্টের অনুরোধটি গ্রহণ করবে না। আপনার অনুরোধটি একেবারে ঠিক আছে, এটি সার্ভারটি ভুল কনফিগার করা হয়েছে।

MappingJacksonHttpMessageConverterঅনুরোধ সামগ্রীর ধরণের শিরোনামটি স্বয়ংক্রিয়ভাবে এতে সেট হয়ে যাবে application/jsonএবং আমার অনুমান যে আপনার সার্ভারটি এটি প্রত্যাখ্যান করছে। আপনার সার্ভার সেটআপ সম্পর্কে আপনি আমাদের কিছু বলেননি, তবে আমি আপনাকে সত্যিই এটি সম্পর্কে পরামর্শ দিতে পারি না।


7

আমি এইভাবে করছি এবং এটি কাজ করে।

HttpHeaders headers = createHttpHeaders(map);
public HttpHeaders createHttpHeaders(Map<String, String> map)
{   
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    for (Entry<String, String> entry : map.entrySet()) {
        headers.add(entry.getKey(),entry.getValue());
    }
    return headers;
}

// এখানে শিরোনাম পাস করুন

 String requestJson = "{ // Construct your JSON here }";
logger.info("Request JSON ="+requestJson);
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
logger.info("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody());
logger.info("Response ="+response.getBody());

আশাকরি এটা সাহায্য করবে


4

আমি এই সমস্যাটি পেয়েছিলাম এবং আমি ক্লায়েন্টে স্প্রিংয়ের রেস্টটেম্পলেট এবং সার্ভারে স্প্রিং ওয়েব ব্যবহার করছি। উভয় এপিআই-তে অত্যন্ত ত্রুটিযুক্ত ত্রুটিযুক্ত প্রতিবেদন রয়েছে, যার সাথে এগুলি বিকাশ করা অত্যন্ত কঠিন।

বহু ধরণের পরীক্ষার চেষ্টা করার পরেও আমি বুঝতে পারলাম যে প্রত্যাশিত তালিকার পরিবর্তে পোষ্ট বডির নাল রেফারেন্স দিয়ে যাওয়ার কারণে সমস্যাটি হচ্ছে। আমি অনুমান করি যে রেস্টস্টেম্পলেট কোনও নাল বস্তু থেকে সামগ্রী-প্রকার নির্ধারণ করতে পারে না, তবে এ সম্পর্কে কোনও অভিযোগ করে না। সঠিক শিরোনাম যুক্ত করার পরে, আমার পরিষেবা পদ্ধতিতে প্রবেশের আগে আমি বসন্তে একটি আলাদা সার্ভার-সাইড ব্যতিক্রম পেতে শুরু করি।

ফিক্সটি শূন্যের পরিবর্তে ক্লায়েন্টের কাছ থেকে একটি খালি তালিকায় পাস করতে হবে। কোনও শিরোনামের প্রয়োজন নেই যেহেতু ডিফল্ট সামগ্রী-প্রকার নন-নাল অবজেক্টগুলির জন্য ব্যবহৃত হয়।


3

এই কোডটি আমার পক্ষে কাজ করছে;

RestTemplate restTemplate = new RestTemplate();
Payment payment = new Payment("Aa4bhs");
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("payment", payment);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(map, headerObject);

Payment res = restTemplate.postForObject(url, httpEntity, Payment.class);

আমি খুব অনুরূপ পন্থা ব্যবহার করছি এবং এটি আমার পক্ষে কার্যকর হয়নি। কোনও কারণে আমার আপনার 'মানচিত্রের' সমতুল্য জসসনে রূপান্তরিত হচ্ছে না বা আউটবাউন্ড বডি হিসাবে অন্তর্ভুক্ত হচ্ছে না, লক্ষ্য পরিষেবাটি কোনও পে-লোড দেখতে পাচ্ছে না।
আবদেল

2

আপনি যদি প্রতিক্রিয়া প্রক্রিয়া করতে চান না

private RestTemplate restTemplate = new RestTemplate();
restTemplate.postForObject(serviceURL, request, Void.class);

আপনার যদি প্রক্রিয়াটির প্রতিক্রিয়া প্রয়োজন

String result = restTemplate.postForObject(url, entity, String.class);

0

আমার জন্য এই সেটআপটিতে ত্রুটি ঘটেছে:

AndroidAnnotations Spring Android RestTemplate Module এবং ...

GsonHttpMessageConverter

POSTপ্যারামিটার ছাড়াই অনুরোধ উত্পন্ন করতে রূপান্তরিত এ অ্যান্ড্রয়েড টীকাতে কিছু সমস্যা আছে । কেবলমাত্র পরামিতি new Object()এটি আমার জন্য সমাধান করেছে।


0

আপনার চেয়ে কঠোর পরিশ্রম কেন? postForEntityকোনও সরল Mapঅবজেক্টটিকে ইনপুট হিসাবে গ্রহণ করে । স্প্রিংয়ে প্রদত্ত REST শেষ পয়েন্টের জন্য পরীক্ষা লেখার সময় নীচেরগুলি আমার পক্ষে ভাল কাজ করে। আমি বিশ্বাস করি বসন্তে JSON পোস্ট অনুরোধ করার সহজতম উপায়:

@Test
public void shouldLoginSuccessfully() {
  // 'restTemplate' below has been @Autowired prior to this
  Map map = new HashMap<String, String>();
  map.put("username", "bob123");
  map.put("password", "myP@ssw0rd");
  ResponseEntity<Void> resp = restTemplate.postForEntity(
      "http://localhost:8000/login",
      map,
      Void.class);
  assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
}

0

আপনি নিজের দ্বারা JSON মানচিত্র করতে না চাইলে আপনি নীচে এটি করতে পারেন:

RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity<String> result = restTemplate.postForEntity(uri, yourObject, String.class);

0

আমি বসন্ত বুটে নিম্নলিখিত হিসাবে চেষ্টা করেছি:

ParameterizedTypeReference<Map<String, Object>> typeRef = new ParameterizedTypeReference<Map<String, Object>>() {};
public Map<String, Object> processResponse(String urlendpoint)
{
    try{
    
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        //reqobj
        JSONObject request = new JSONObject();
        request.put("username", name);
        //Or Hashmap 
        Map<String, Object> reqbody =  new HashMap<>();
        reqbody.put("username",username);
        Gson gson = new Gson();//mvn plugin to convert map to String
        HttpEntity<String> entity = new HttpEntity<>( gson.toJson(reqbody), headers);
        ResponseEntity<Map<String, Object>> response = resttemplate.exchange(urlendpoint, HttpMethod.POST, entity, typeRef);//example of post req with json as request payload
        if(Integer.parseInt(response.getStatusCode().toString()) == HttpURLConnection.HTTP_OK)
        {
            Map<String, Object>  responsedetails = response.getBody();
            System.out.println(responsedetails);//whole json response as map object
            return responsedetails;
        }
    } catch (Exception e) {
        // TODO: handle exception
        System.err.println(e);
    }
    return null;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.