একটি REST ওয়েব পরিষেবাদিতে HTTP স্থিতি কোড সেট করার জন্য বেশ কয়েকটি ব্যবহারের কেস রয়েছে এবং বিদ্যমান উত্তরগুলিতে কমপক্ষে একটি পর্যাপ্তভাবে ডকুমেন্টেড ছিল না (যেমন আপনি যখন জ্যাকএক্সবি ব্যবহার করে অটো-ম্যাজিকাল জেএসএন / এক্সএমএল সিরিয়ালাইজেশন ব্যবহার করছেন, এবং আপনি কোনও ফিরিয়ে দিতে চান সিরিয়ালাইজড করতে বস্তু, তবে একটি ডিফল্ট 200 এর চেয়ে পৃথক একটি স্ট্যাটাস কোড)।
সুতরাং আমাকে চেষ্টা করুন এবং প্রতিটি ব্যবহারের জন্য বিভিন্ন ক্ষেত্রে এবং সমাধানগুলি গণনা করুন:
1. ত্রুটি কোড (500, 404, ...)
আপনি 200 OK
যখন কোনও ত্রুটি দেখা দেয় তার চেয়ে আলাদা যখন আপনি কোনও স্ট্যাটাস কোড ফিরিয়ে দিতে চান তখন সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে ।
উদাহরণ স্বরূপ:
- একটি সত্তার অনুরোধ করা হয়েছে তবে এটি বিদ্যমান নেই (404)
- অনুরোধ শব্দার্থগতভাবে ভুল (400)
- ব্যবহারকারী অনুমোদিত নয় (401)
- ডাটাবেস সংযোগে সমস্যা আছে (500)
- ইত্যাদি ..
ক) একটি ব্যতিক্রম নিক্ষেপ
সেক্ষেত্রে, আমি মনে করি যে সমস্যাটি হ্যান্ডেল করার সর্বোত্তম উপায়টি একটি ব্যতিক্রম ছোঁড়া। এই ব্যতিক্রমটি একটি দ্বারা পরিচালিত হবে ExceptionMapper
, যা উপযুক্ত ত্রুটি কোডের সাথে ব্যতিক্রমটিকে প্রতিক্রিয়াতে অনুবাদ করবে।
আপনি ExceptionMapper
জার্সির সাথে পূর্ব-কনফিগার হওয়া ডিফল্টটি ব্যবহার করতে পারেন (এবং আমার ধারণা অন্যান্য বাস্তবায়নের সাথে এটি একই রকম) এবং বিদ্যমান সাব-ক্লাসগুলির যে কোনও একটি নিক্ষেপ করতে পারেন javax.ws.rs.WebApplicationException
। এগুলি প্রাক-সংজ্ঞায়িত ব্যতিক্রম ধরন যা বিভিন্ন ত্রুটি কোডগুলিতে প্রাক ম্যাপ করা হয়, উদাহরণস্বরূপ:
- BadRequestException (400)
- অভ্যন্তরীণ সার্ভারআররএক্সপেশন (500)
- নটফাউন্ডএক্সেপশন (404)
ইত্যাদি আপনি এখানে তালিকাটি খুঁজে পেতে পারেন: এপিআই
বিকল্পভাবে, আপনি নিজের কাস্টম ব্যতিক্রম এবং ExceptionMapper
ক্লাসগুলি সংজ্ঞায়িত করতে পারেন এবং টীকাটির মাধ্যমে এই ম্যাপারগুলি জার্সিতে যুক্ত করতে পারেন @Provider
( এই উদাহরণের উত্স ):
public class MyApplicationException extends Exception implements Serializable
{
private static final long serialVersionUID = 1L;
public MyApplicationException() {
super();
}
public MyApplicationException(String msg) {
super(msg);
}
public MyApplicationException(String msg, Exception e) {
super(msg, e);
}
}
প্রদানকারী :
@Provider
public class MyApplicationExceptionHandler implements ExceptionMapper<MyApplicationException>
{
@Override
public Response toResponse(MyApplicationException exception)
{
return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
}
}
দ্রষ্টব্য: আপনি যে ব্যতিক্রমগুলি ব্যবহার করেন সেগুলির জন্য আপনি এক্সপশনম্যাপারগুলিও লিখতে পারেন।
খ) রেসপন্স বিল্ডার ব্যবহার করুন
স্থিতি কোড সেট করার আর একটি উপায় হ'ল Response
নির্ধারিত কোডের সাথে প্রতিক্রিয়া তৈরি করতে কোনও বিল্ডারকে ব্যবহার করা ।
সেক্ষেত্রে আপনার পদ্ধতির রিটার্নের ধরণ অবশ্যই হবে javax.ws.rs.core.Response
। এটি অন্যান্য বিভিন্ন প্রতিক্রিয়া যেমন বর্ণনা করা হয়েছে যেমন 'হাইড্রুয়েসনেস' গৃহীত উত্তর এবং এর মতো দেখায়:
@GET
@Path("myresource({id}")
public Response retrieveSomething(@PathParam("id") String id) {
...
Entity entity = service.getById(uuid);
if(entity == null) {
return Response.status(Response.Status.NOT_FOUND).entity("Resource not found for ID: " + uuid).build();
}
...
}
2. সাফল্য, তবে 200 নয়
আপনি যখন রিটার্নের স্থিতি সেট করতে চান তখন অন্য একটি ঘটনাটি যখন অপারেশন সফল হয়েছিল তবে আপনি শরীরে ফিরে আসা সামগ্রীর পাশাপাশি 200 এর চেয়ে আলাদা সাফল্য কোডটি ফিরে আসতে চান।
ঘন ঘন ব্যবহারের ক্ষেত্রে হ'ল আপনি যখন একটি নতুন সত্তা তৈরি করেন ( POST
অনুরোধ) এবং কোনও নতুন 201 Created
স্থিতি কোড সহ এই নতুন সত্তা বা সম্ভবত সত্তাটি সম্পর্কে তথ্য ফিরে আসতে চান ।
একটি পদ্ধতি হ'ল উপরে বর্ণিত ঠিক মত প্রতিক্রিয়া অবজেক্টটি ব্যবহার করা এবং অনুরোধের বডিটি নিজেই সেট করা। যাইহোক, এটি করে আপনি জ্যাকএক্সবি দ্বারা সরবরাহিত এক্সএমএল বা জেএসএন-এ স্বয়ংক্রিয় সিরিয়ালাইজেশন ব্যবহার করার ক্ষমতাটি looseিলা করে ফেলেন।
এটি সত্তা অবজেক্টটি ফেরত দেওয়ার আসল পদ্ধতি যা JAXB দ্বারা JSON এ সিরিয়ালাইজ করা হবে:
@Path("/")
@POST
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public User addUser(User user){
User newuser = ... do something like DB insert ...
return newuser;
}
এটি নতুন তৈরি করা ব্যবহারকারীর একটি JSON উপস্থাপনা ফিরিয়ে দেবে, তবে ফেরতের স্থিতি 201 হবে না 200 হবে।
এখন সমস্যাটি হ'ল আমি যদি Response
বিল্ডারটি রিটার্ন কোড সেট করতে ব্যবহার করতে চাই তবে আমাকে Response
আমার পদ্ধতিতে কোনও অবজেক্ট ফিরিয়ে দিতে হবে । কীভাবে এখনও User
অবজেক্টটি সিরিয়ালায়িত করা যায়?
ক) সার্লেটের প্রতিক্রিয়াতে কোডটি সেট করুন
এটি সমাধানের জন্য একটি পদ্ধতি হ'ল সার্লেট রিকুয়েস্টের অনুরোধটি পাওয়া এবং প্রতিক্রিয়া কোডটি ম্যানুয়ালি নিজেই সেট করা, যেমন গ্যারেট উইলসনের উত্তরে প্রদর্শিত হয়েছিল:
@Path("/")
@POST
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public User addUser(User user, @Context final HttpServletResponse response){
User newUser = ...
//set HTTP code to "201 Created"
response.setStatus(HttpServletResponse.SC_CREATED);
try {
response.flushBuffer();
}catch(Exception e){}
return newUser;
}
পদ্ধতিটি এখনও একটি সত্তা অবজেক্ট ফেরত দেয় এবং স্থিতি কোডটি 201 হয়।
দ্রষ্টব্য যে এটি কাজ করতে, আমাকে প্রতিক্রিয়াটি ফ্লাশ করতে হয়েছিল। এটি আমাদের সুন্দর JAX_RS রিসোর্সে নিম্ন-স্তরের সার্লেট এপিআই কোডের একটি অপ্রীতিকর পুনরুত্থান এবং আরও খারাপ এটি হ্যাডারগুলি এর পরেও সংশোধনযোগ্য হতে পারে কারণ তারা ইতিমধ্যে তারে প্রেরণ করা হয়েছিল।
খ) সত্তার সাথে প্রতিক্রিয়া অবজেক্টটি ব্যবহার করুন
সেক্ষেত্রে সর্বোত্তম সমাধানটি হ'ল রেসপন্স অবজেক্টটি ব্যবহার করা এবং সত্তাকে এই রেসপন্স অবজেক্টটিতে সিরিয়ালাইজ করাতে সেট করা। সেই ক্ষেত্রে পে-লোড সত্তার ধরণটি চিহ্নিত করতে রেসপন্স অবজেক্টটি জেনেরিক করে দেওয়া ভাল তবে এটি বর্তমানে তা নয়।
@Path("/")
@POST
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public Response addUser(User user){
User newUser = ...
return Response.created(hateoas.buildLinkUri(newUser, "entity")).entity(restResponse).build();
}
সেক্ষেত্রে, আমরা স্ট্যাটাস কোডটি 201 এ সেট করতে রেসপন্স বিল্ডার শ্রেণীর তৈরি পদ্ধতিটি ব্যবহার করি We সত্তা () পদ্ধতির মাধ্যমে আমরা সত্তা অবজেক্ট (ব্যবহারকারী )কে প্রতিক্রিয়াতে পাস করি।
ফলাফলটি হ'ল এইচটিটিপি কোডটি 401 যেমনটি আমরা চেয়েছিলাম, এবং প্রতিক্রিয়ার বডিটি হ'ল ঠিক আগের মতো JSON যা আমরা যখন ব্যবহারকারীর অবজেক্টটি ফিরিয়ে দিয়েছিলাম তার আগে had এটি একটি অবস্থান শিরোনাম যোগ করে।
রেসপন্স ক্লাসে বিভিন্ন স্ট্যাটাসের (স্ট্যাটি?) জন্য অনেকগুলি বিল্ডার পদ্ধতি রয়েছে যেমন:
রেসপন্স.এসেপ্টেড () রেসপন্স.ওক () রেসপন্স.নো কনটেন্ট () রেসপন্স.নোট অ্যাকসেপ্টেবল ()
এনবি: হিটটোয়াস অবজেক্টটি হেল্পার ক্লাস যা আমি বিকাশের জন্য ইউআরআই তৈরি করতে সহায়তা করে। আপনাকে এখানে আপনার নিজস্ব প্রক্রিয়াটি নিয়ে আসতে হবে;)
এটা সম্বন্ধে.
আমি আশা করি এই দীর্ঘ প্রতিক্রিয়া কারওর পক্ষে সহায়তা করবে :)