একটি RESTful পোস্ট পদ্ধতিতে প্যারামিটারগুলি কীভাবে অ্যাক্সেস করবেন


123

আমার পোস্টের পদ্ধতিটি দেখতে এমন দেখাচ্ছে:

@POST
@Consumes({"application/json"})
@Path("create/")
public void create(String param1, String param2){
    System.out.println("param1 = " + param1);
    System.out.println("param2 = " + param2);
}

আমি যখন নেটবিন্সে একটি জার্সি ক্লায়েন্ট তৈরি করি তখন যে পদ্ধতিটি পোস্ট পদ্ধতিটিকে কল করে তাদের মতো দেখাচ্ছে:

public void create(Object requestEntity){
    webResource.path("create").type(MediaType.APPLICATION_JSON).post(requestEntity);
}

এই পরীক্ষা চালানোর সময়:

@Test
public void hello(){
    String json = "{param1=\"hello\",param2=\"hello2\"}";
    this.client.create(json);
}

এটি সার্ভারে নিম্নলিখিত আউটপুট দেয়:

INFO: param1 = {param1="hello",param2="hello2"}
INFO: param2 = 

আমার কী পরিবর্তন করতে হবে যাতে পরামিতিগুলি সঠিক মান দিচ্ছে?


আপনি এটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন ব্যবহার করছেন বা না?
অ্যান্ড্রয়েড -ড্রয়েড

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

উত্তর:


355

আপনার @POSTপদ্ধতিটি স্ট্রিংয়ের পরিবর্তে একটি JSON অবজেক্ট গ্রহণ করা উচিত। জার্সি জেএএসবি ব্যবহার করে মার্শালিং এবং আনমর্ষশালিং জেএসওএন অবজেক্টগুলিকে সমর্থন করার জন্য ( বিশদে জার্সি ডক্স দেখুন )। এর মতো একটি শ্রেণি তৈরি করুন:

@XmlRootElement
public class MyJaxBean {
    @XmlElement public String param1;
    @XmlElement public String param2;
}

তাহলে আপনার @POSTপদ্ধতিটি নীচের মত দেখাবে:

@POST @Consumes("application/json")
@Path("/create")
public void create(final MyJaxBean input) {
    System.out.println("param1 = " + input.param1);
    System.out.println("param2 = " + input.param2);
}

এই পদ্ধতিটি এইচটিটিপি পোস্টের প্রধান হিসাবে JSON অবজেক্ট পাওয়ার প্রত্যাশা করে। জ্যাকস-আরএস এইচটিটিপি বার্তার সামগ্রীর অংশটিকে অযৌক্তিকৃত প্যারামিটার হিসাবে পাস করে - inputএই ক্ষেত্রে। আসল বার্তাটি দেখতে এমন কিছু দেখাচ্ছে:

POST /create HTTP/1.1
Content-Type: application/json
Content-Length: 35
Host: www.example.com

{"param1":"hello","param2":"world"}

এইভাবে JSON ব্যবহার করা সুস্পষ্ট কারণে সাধারণ। তবে আপনি যদি এটি জাভাস্ক্রিপ্ট ব্যতীত অন্য কোনও ক্ষেত্রে উত্পন্ন বা গ্রহণ করছেন, তবে আপনাকে সঠিকভাবে ডেটা এড়িয়ে চলতে সতর্ক হতে হবে। জ্যাকস-আরএসে, আপনি এটি বাস্তবায়নের জন্য একটি বার্তাবডিআডার এবং মেসেজবডিওয়াইটার ব্যবহার করবেন । আমি বিশ্বাস করি যে জার্সির ইতিমধ্যে প্রয়োজনীয় প্রকারের (যেমন, জাভা আদিম এবং জ্যাকএক্সবি মোড়ানো ক্লাস) এবং জেএসওএন এর জন্য বাস্তবায়ন রয়েছে। JAX-RS ডেটা পাস করার জন্য অন্যান্য বেশ কয়েকটি পদ্ধতি সমর্থন করে। সাধারণ আর্গুমেন্ট পাসিং ব্যবহার করে ডেটা পাস হওয়ার কারণে এগুলিকে একটি নতুন শ্রেণি তৈরির প্রয়োজন হয় না।


এইচটিএমএল <FORM>

পরামিতিগুলি @ ফর্মপ্রাম ব্যবহার করে টীকায়িত হবে :

@POST
@Path("/create")
public void create(@FormParam("param1") String param1,
                   @FormParam("param2") String param2) {
    ...
}

ব্রাউজারটি "অ্যাপ্লিকেশন / x-www-form-urlencoded" ব্যবহার করে ফর্মটি এনকোড করবে । জ্যাক্স-আরএস রানটাইমটি শরীরের ডিকোডিং এবং এটিকে পদ্ধতিতে পাস করার বিষয়ে যত্ন নেবে। তারে আপনার কী দেখা উচিত তা এখানে:

POST /create HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 25

param1=hello&param2=world

এই বিষয়বস্তুটি এই ক্ষেত্রে URL টি এনকোডড

আপনি যদি ফর্মপার্মের নামগুলি না জানেন তবে আপনি নিম্নলিখিতটি করতে পারেন:

@POST @Consumes("application/x-www-form-urlencoded")
@Path("/create")
public void create(final MultivaluedMap<String, String> formParams) {
    ...
}

এইচটিটিপি শিরোনাম

আপনি যদি এইচটিটিপি শিরোনামের মাধ্যমে প্যারামিটারগুলি পাস করতে চান তবে আপনি @ হাইডারপ্যারাম টিকাটি ব্যবহার করতে পারেন:

@POST
@Path("/create")
public void create(@HeaderParam("param1") String param1,
                   @HeaderParam("param2") String param2) {
    ...
}

এইচটিটিপি বার্তাটি দেখতে কেমন হবে তা এখানে। দ্রষ্টব্য যে এই পোস্টের কোনও শরীর নেই।

POST /create HTTP/1.1
Content-Length: 0
Host: www.example.com
param1: hello
param2: world

আমি সাধারণ পরামিতি পাস করার জন্য এই পদ্ধতিটি ব্যবহার করব না। আপনার যদি কোনও নির্দিষ্ট এইচটিটিপি শিরোনামের মান অ্যাক্সেস করতে হয় তবে তা সত্যিই সহজ।


এইচটিটিপি ক্যোয়ারী প্যারামিটার

এই পদ্ধতিটি প্রাথমিকভাবে এইচটিটিপি জিইটিএস সহ ব্যবহৃত হয় তবে এটি পোষ্টগুলিতে সমানভাবে প্রযোজ্য। এটি @ ক্যুরিপ্যারাম টিকা ব্যবহার করে ।

@POST
@Path("/create")
public void create(@QueryParam("param1") String param1,
                   @QueryParam("param2") String param2) {
    ...
}

পূর্ববর্তী কৌশলটির মতো, ক্যোয়ারী স্ট্রিংয়ের মাধ্যমে পরামিতিগুলি পাস করার জন্য কোনও বার্তার বডি প্রয়োজন হয় না। এইচটিটিপি বার্তাটি এখানে:

POST /create?param1=hello&param2=world HTTP/1.1
Content-Length: 0
Host: www.example.com

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


এইচটিটিপি পথের পরামিতি

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

@POST
@Path("/create/{param1}/{param2}")
public void create(@PathParam("param1") String param1,
                   @PathParam("param2") String param2) {
    ...
}

মেসেজটি ক্যোয়ারী প্যারামিটার সংস্করণের অনুরূপ ব্যতীত প্যারামিটারগুলির নাম বার্তায় কোথাও অন্তর্ভুক্ত করা হয়নি।

POST /create/hello/world HTTP/1.1
Content-Length: 0
Host: www.example.com

এই পদ্ধতিটি একই এনকোডিংয়ের ঝামেলা ভাগ করে যা ক্যোয়ারী প্যারামিটার সংস্করণ। পাথ বিভাগগুলি আলাদাভাবে এনকোড করা হয়েছে যাতে আপনারও সেখানে যত্নবান হতে হবে।


যেমন আপনি দেখতে পাচ্ছেন, প্রতিটি পদ্ধতির পক্ষে বিভিন্ন মতামত রয়েছে। পছন্দটি সাধারণত আপনার ক্লায়েন্টদের দ্বারা সিদ্ধান্ত নেওয়া হয়। আপনি যদি FORMভিত্তিক এইচটিএমএল পৃষ্ঠাগুলি পরিবেশন করে থাকেন তবে ব্যবহার করুন @FormParam। যদি আপনার ক্লায়েন্টগুলি জাভাস্ক্রিপ্ট + এইচটিএমএল 5 ভিত্তিক হয় তবে আপনি সম্ভবত জ্যাকএক্সবি ভিত্তিক সিরিয়ালাইজেশন এবং জেএসএন অবজেক্ট ব্যবহার করতে চাইবেন। MessageBodyReader/Writerবাস্তবায়নের যাতে এক কম জিনিস ভুল হয়ে যেতে পারে যে প্রয়োজনীয় আপনার জন্য পলায়নের যত্ন নিতে হবে। যদি আপনার ক্লায়েন্ট জাভা ভিত্তিক তবে কোনও ভাল এক্সএমএল প্রসেসর না থাকে (যেমন, অ্যান্ড্রয়েড), তবে আমি সম্ভবত FORMএনকোডিংটি ব্যবহার করবো কারণ যেহেতু কোনও সামগ্রী বডিটি ইউআরএলগুলির চেয়ে সঠিকভাবে উত্পন্ন করা এবং এনকোড করা সহজ। আশা করা যায় যে এই মিনি-উইকির এন্ট্রি জ্যাকস-আরএস সমর্থন করে এমন বিভিন্ন পদ্ধতি সম্পর্কে কিছুটা আলোকপাত করবে।

দ্রষ্টব্য: সম্পূর্ণ প্রকাশের স্বার্থে, আমি আসলে জার্সির এই বৈশিষ্ট্যটি ব্যবহার করি নি। আমরা বেশিরভাগ জ্যাকএক্সবি + জ্যাকস-আরএস অ্যাপ্লিকেশন স্থাপন করে এবং মোবাইল ক্লায়েন্টের স্পেসে চলে যাচ্ছি বলে আমরা এটির সাথে কথা বলছিলাম। এইচএমএল 5 বা জিক্যুরি-ভিত্তিক সমাধানগুলিতে এক্সএমএল জেএসএন আরও অনেক বেশি ফিট।


4
আমি গতকাল এই বৈশিষ্ট্যটি পরীক্ষা করেছি, @ এক্সএমএল এলিমেন্ট টীকাগুলি প্রয়োজন হয় নি
এমমাটলোকা

এর জন্য ধন্যবাদ. আমি যদি এখনও 2 টি স্ট্রিং প্রেরণ করতে চাই তবে বাকি কী কী সেবন করতে সক্ষম হবে? বা একাধিক প্যারামগুলি কেবলমাত্র @PathParm নিয়ে কাজ করে?
ক্লাস্বাক

1
@ ক্লাস্বাক - আপনাকে প্রতিটি প্যারাম কোথা থেকে উত্তোলনের প্রত্যাশা করা উচিত তা উল্লেখ করতে হবে। আপনার এখন জিনিসগুলি যেমন আছে জার্সি / নেটবিয়ানরা একটি ফর্ম পোস্ট ধরে নিচ্ছে এবং ফর্মপার্ম হিসাবে প্রেরিত ডেটা বের করছে। আপনি যেখানে (ডেথপ্যারাম, ফর্মপারাম, কুকি পারম ইত্যাদি) থেকে ডেটা চান তার প্রতিটি পদ্ধতির বর্ধন রেকর্ড করুন
অনুমান

1
@ ক্লাস্বাক - আমি বিভিন্ন টীকাগুলি ব্যবহার করে একগুচ্ছ উদাহরণ সংযোজন করেছি
ডি.শ্যাওলি

2
এই জন্য আপনাকে অনেক ধন্যবাদ! এটিই আমি যা খুঁজছিলাম তা ছিল। আপনি আমার দিনটি তৈরি করেছেন;) আমি এখন ফর্মপ্যারাম ব্যবহার করছি এবং এটি কার্যকর!
ক্লাস্বাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.