উত্তর:
ডক্সে একটি সম্পূর্ণ বিভাগ রয়েছে যার নাম 16.3.3.4 @ রিকোয়েস্টবিডি টীকা দিয়ে অনুরোধের বডিটি ম্যাপিং করা হচ্ছে । এবং যাকে একটি বলা হয়েছে 16.3.3.5 @ রেসপনসবডি টীকা দিয়ে প্রতিক্রিয়া বডি ম্যাপিং । আমি আপনাকে এই বিভাগগুলি পরামর্শ পরামর্শ দিচ্ছি। প্রাসঙ্গিক: @RequestBody
জাভাডোকস, @ResponseBody
জাভাদোকস
ব্যবহারের উদাহরণগুলি এরকম কিছু হবে:
JQuery এর মতো একটি জাভাস্ক্রিপ্ট-লাইব্রেরি ব্যবহার করে আপনি এই জাতীয় একটি JSON- অবজেক্ট পোস্ট করবেন:
{ "firstName" : "Elmer", "lastName" : "Fudd" }
আপনার নিয়ামক পদ্ধতিটি দেখতে এমন হবে:
// controller
@ResponseBody @RequestMapping("/description")
public Description getDescription(@RequestBody UserStats stats){
return new Description(stats.getFirstName() + " " + stats.getLastname() + " hates wacky wabbits");
}
// domain / value objects
public class UserStats{
private String firstName;
private String lastName;
// + getters, setters
}
public class Description{
private String description;
// + getters, setters, constructor
}
এখন যদি আপনার ক্লাসপথে জ্যাকসন থাকে (এবং একটি <mvc:annotation-driven>
সেটআপ থাকে), স্প্রিং আগত জেএসওএনকে পোস্ট বডি থেকে ইউজারস্ট্যাটস অবজেক্টে রূপান্তরিত করবে (কারণ আপনি @RequestBody
টীকা যুক্ত করেছেন ) এবং এটি জেএসএনে প্রত্যাবর্তিত বস্তুকে সিরিয়ালাইজ করবে (কারণ আপনি যোগ করেছেন @ResponseBody
টীকা)। সুতরাং ব্রাউজার / ক্লায়েন্ট এই JSON ফলাফলটি দেখতে পাবে:
{ "description" : "Elmer Fudd hates wacky wabbits" }
সম্পূর্ণ কাজের উদাহরণের জন্য আমার এই পূর্ববর্তী উত্তরটি দেখুন: https://stackoverflow.com/a/5908632/342852
দ্রষ্টব্য: রিকোস্টবিডি / রেসপন্সবিডি অবশ্যই জেএসএনের মধ্যে সীমাবদ্ধ নয়, উভয়ই সরল পাঠ্য এবং এক্সএমএল সহ একাধিক ফর্ম্যাট পরিচালনা করতে পারে তবে জেএসএন সম্ভবত সর্বাধিক ব্যবহৃত ফর্ম্যাট।
বসন্ত x.০ এর পর থেকে আপনি সাধারণত @ResponseBody
পদ্ধতি স্তরে ব্যবহার করবেন না , বরং @RestController
একই প্রভাব সহ ক্লাস স্তরে ব্যবহার করবেন না ।
এখানে স্প্রিং এমভিসি অফিশিয়াল ডকুমেন্টেশনের একটি উদ্ধৃতি দেওয়া হয়েছে :
@RestController
একটি হল ক্ষান্ত টীকা যে নিজেই মেটা-সটীক সঙ্গে@Controller
এবং@ResponseBody
একটি নিয়ামক যার প্রত্যেক পদ্ধতি টাইপ পর্যায়ের উত্তরাধিকারী ইঙ্গিত@ResponseBody
টীকা এবং, অতএব, দৃশ্য রেজল্যুশন বনাম প্রতিক্রিয়া শরীর থেকে সরাসরি লিখেছেন এবং একটি HTML টেমপ্লেট দিয়ে রেন্ডারিং।
@RequestBody
প্যারামিটারে রয়েছে, @ResponseBody
পদ্ধতিটিতে রয়েছে। গুরুত্বপূর্ণ পার্থক্য!
@ResponseBody
করার অর্থ চাইনি । আপনি যেমন বলেছিলেন, ঠিক আছে, @RequestBody
প্যারামিটারে যায়? তবে উপরের উত্তরে, আপনার পদ্ধতিতে এটি রয়েছে।
@RequestBody
আসলে এখনও প্রয়োজনীয়, @ResponseBody
ব্যবহারের সময় নিখুঁত @RestController
। দয়া করে আপনার উত্তরটি সংশোধন করুন, এটির মিথ্যা হতে অনেকগুলি আপভোস্ট রয়েছে!
@RestController
ছিল এবং এটি চালু হওয়ার সাথে সাথে পরিবর্তন করা হয়েছিল
@ রিকোয়েস্টবাডি : কোনও পদ্ধতি প্যারামিটারকে নির্দেশিত টিকাটি এইচটিটিপি অনুরোধের শৃঙ্খলে আবদ্ধ হওয়া উচিত।
উদাহরণ স্বরূপ:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}
@ রেসপন্সবিডি টীকাটি কোনও পদ্ধতিতে লাগানো যেতে পারে এবং নির্দেশ দেয় যে রিটার্নের ধরণটি সরাসরি HTTP প্রতিক্রিয়া সংস্থায় লিখতে হবে (এবং কোনও মডেলতে রাখা হয় না, বা ভিউ নাম হিসাবে ব্যাখ্যা করা হয়)।
উদাহরণ স্বরূপ:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public @ResponseBody String helloWorld() {
return "Hello World";
}
বিকল্পভাবে, আমরা টীকাগুলির জায়গায় @ রিস্টকন্ট্রোলার টীকাটি ব্যবহার করতে পারি @Controller
। এটি ব্যবহারের প্রয়োজনীয়তা সরিয়ে ফেলবে @ResponseBody
।
নীচে একটি জাভা নিয়ামকের একটি পদ্ধতির উদাহরণ রয়েছে।
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel)
{
return HttpStatus.OK;
}
@RequestBody টীকাটি ব্যবহার করে আপনি কোনও নির্দিষ্ট কল পরিচালনা করার জন্য আপনার সিস্টেমে যে মডেলটি তৈরি করেছেন তার সাথে মানগুলি ম্যাপ করতে পারবেন। @ রেসপন্সবডি ব্যবহার করার সময় আপনি যে কোনও জায়গা থেকে অনুরোধটি উত্পন্ন হয়েছিল সেখানে ফিরে কিছু পাঠাতে পারবেন। উভয় জিনিস কোনও কাস্টম পার্সার ইত্যাদি না লিখে সহজেই ম্যাপ করা হবে
package com.programmingfree.springshop.controller;
import java.util.List;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.programmingfree.springshop.dao.UserShop;
import com.programmingfree.springshop.domain.User;
@RestController
@RequestMapping("/shop/user")
public class SpringShopController {
UserShop userShop=new UserShop();
@RequestMapping(value = "/{id}", method = RequestMethod.GET,headers="Accept=application/json")
public User getUser(@PathVariable int id) {
User user=userShop.getUserById(id);
return user;
}
@RequestMapping(method = RequestMethod.GET,headers="Accept=application/json")
public List<User> getAllUsers() {
List<User> users=userShop.getAllUsers();
return users;
}
}
উপরের উদাহরণে তারা সমস্ত ব্যবহারকারী এবং নির্দিষ্ট আইডি বিবরণ প্রদর্শন করতে চলেছে এখন আমি আইডি এবং নাম উভয়ই ব্যবহার করতে চাই,
1) লোকালহোস্ট: 8093 / প্লিজসন / শপ / ইউজার <--- এই লিঙ্কটি ব্যবহারকারীর সমস্ত বিবরণ প্রদর্শন করবে
2) লোকালহোস্ট: 8093 / পিলেজসন / শপ / ইউজার / ১১ <---- আমি যদি লিঙ্কের মাধ্যমে 11 ব্যবহার করি তবে এটি হবে নির্দিষ্ট 11 ব্যবহারকারীর বিবরণ প্রদর্শন করুন
এখন আমি আইডি এবং নাম উভয়ই ব্যবহার করতে চাই
লোকালহোস্ট: 8093 / প্লিজসন / শপ / ইউজার / 11 / রাজু <----------------- এর অর্থ এর অর্থ আমরা এর মধ্যে যে কোনও একটিকে ব্যবহার করতে পারি দয়া করে আমাকে সহায়তা করুন .... ।
@ResponseBody
প্যারামিটারটিতে টীকাটি ব্যবহার করেছেন , পদ্ধতিটি নয়। এটি পদ্ধতিতে রাখার চেষ্টা করে আমি ত্রুটি পেয়েছি, সুতরাং আমি আপনার অন্য উত্তরটি সঠিক বলে ধরে নিচ্ছি। আমি মনে করি আপনারgetDescription(@RequestBody UserStats stats)
উপরে থাকা উচিত ।