কীভাবে একটি REST এপিআই তৈরি করবেন যা সম্পদের জন্য আইডির একটি অ্যারে নেয়


103

আমি আমার প্রকল্পের জন্য একটি REST এপিআই তৈরি করছি। প্রদত্ত ব্যবহারকারীর INFO পাওয়ার জন্য API হ'ল:

api.com/users/[USER-ID]

আমি ক্লায়েন্টকে ব্যবহারকারীর আইডির তালিকায় পাস করার অনুমতিও দিতে চাই। আমি কীভাবে এপিআইটি তৈরি করতে পারি যাতে এটি বিশ্রামযুক্ত এবং ব্যবহারকারী আইডির একটি তালিকাতে নেয়?


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

উত্তর:


97

আপনি যদি URL এ আপনার সমস্ত পরামিতিগুলি অতিক্রম করে থাকেন তবে সম্ভবত কমা দ্বারা পৃথক করা মানগুলি সেরা পছন্দ হবে। তারপরে আপনার নীচের মতো একটি URL টেমপ্লেট থাকবে:

api.com/users?id=id1,id2,id3,id4,id5

7
@ ইউক্যাজ্যাট, আরইএসটি একটি আর্কিটেকচারাল মডেল এবং প্রোটোকল নয় এবং আপনি যদি আজ উপলভ্য বড় বড় আরএসটি এপিআইগুলি অধ্যয়ন করেন তবে আপনি দেখতে পাবেন যে এটি প্রয়োগের একাধিক উপায় রয়েছে। আমি যে পদ্ধতির পরামর্শ দিচ্ছি তা সম্ভবত ধারণার সবচেয়ে নিকটতম কারণ এটি এখানে বর্ণিত সমস্ত প্রতিবন্ধকতাগুলি পূরণ করে: en.wikedia.org/wiki/… । আপনি কেবল অনুরোধে অ্যারে উপস্থাপন করতে সিএসভি ব্যবহার করবেন, যখন পরিষেবা প্রতিক্রিয়াগুলি এক্সএমএল বা জেএসএন ব্যবহার করে ক্রমিক করা উচিত। আপনি আমার পদ্ধতিকে বিশ্রাম বলে বিবেচনা করবেন না এমন কোনও বিশেষ কারণ আছে?
ফ্লোরিন ডুমিট্রেস্কু

10
কেন এই না? api.com/users?id=id1&id=id2&id=id3&id=id4&id=id5
সেনফো

7
@ এসএনফো, আমি আইডি = আইডি 1, আইডি 2, আইডি 3 পছন্দ করি কারণ এটি ইউআরআই সংক্ষিপ্ত এবং পড়তে সহজ করে তোলে (উদাহরণস্বরূপ, কোনও ডিবাগিং অপারেশনের সময়) কোনও মানুষ দ্বারা। আইডির মধ্যে অন্যান্য প্যারামিটার থাকলে প্রতিটি মানের পৃথক প্যারামিটারগুলি ইউআরআইকে অনুসরণ করা আরও শক্ত করে তোলে: api.com/users?id=id1&id=id2&joined- after=2013-01-01&id=id3
ফ্লোরিন

12
তবে বেশিরভাগ ওয়েব সার্ভারগুলি ইউআরএল দৈর্ঘ্যের প্রায় 2,000 বাইট সমর্থন করে। কীভাবে আমার এপিআই সমর্থন 5000 আইডি পর্যন্ত করবেন?
নিকি_জেএস

6
@senfo মত ইউআরএলগুলিতে …?id=1&id=2&id=3, ডুপ্লিকেট ক্যোয়ারী প্যারামিটারগুলি অ্যারেতে একত্রিত হবে এমন কোনও গ্যারান্টি নেই । উপরে কোয়েরি স্ট্রিং সঙ্গে, পিএইচপি আপনি যে বলতে ঘটে idসমান [1, 2, 3], কিন্তু পাগল নেভিগেশন রুবি বলে এটা সমান 3, এবং অন্যান্য অবকাঠামো এছাড়াও ভিন্নভাবে কাজ করতে পারে, যেমন বলছে idসমান 1। ইউআরএলগুলির মতো …?id=1,2,3বিভ্রান্তির সম্ভাবনা এড়ানো।
ররি ও'কেনে

33
 api.com/users?id=id1,id2,id3,id4,id5
 api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

আইএমও, উপরের কলগুলি বিশ্রামজনক মনে হচ্ছে না, তবে এগুলি দ্রুত এবং কার্যকরী কাজ (y)। তবে ইউআরএলটির দৈর্ঘ্য ওয়েবসারভার দ্বারা সীমাবদ্ধ, যেমন টমক্যাট

বিশ্রামের প্রচেষ্টা:

POST http://example.com/api/batchtask

   [
    {
      method : "GET",
      headers : [..],
      url : "/users/id1"
    },
    {
      method : "GET",
      headers : [..],
      url : "/users/id2"
    }
   ]

সার্ভার নতুন তৈরি ব্যাচটাস্ক রিসোর্সের ইউআরআই জবাব দেবে ।

201 Created
Location: "http://example.com/api/batchtask/1254"

এখন ক্লায়েন্ট ভোট দেওয়ার মাধ্যমে ব্যাচের প্রতিক্রিয়া বা কার্য অগ্রগতি আনতে পারে

GET http://example.com/api/batchtask/1254


অন্যরা কীভাবে এই সমস্যাটি সমাধান করার চেষ্টা করেছিল :


7
একাধিক ফলাফল পাওয়ার জন্য পোস্ট অনুরোধটি বিশ্রামজনক নয়। আপনার উদাহরণটি এমন একটি উত্স তৈরিতে দেখায় যেখানে এটি পোস্ট করার পক্ষে উপযুক্ত তবে এটি মূল প্রশ্নের সম্পূর্ণ ভিন্ন মামলা
অ্যানেন্ট্রপিক

2
অস্থায়ী সংস্থান তৈরি করা বিশ্রামের, তাই না? এবং আমি জিইটি ব্যবহার করে সংস্থান পাচ্ছি, এটি আবার বিশ্রামযুক্ত।
নিলেশ

হ্যাঁ, তবে এর মধ্যে
কোনওটিই

1
নির্দেশ দেওয়ার জন্য @ অ্যান্ট্রোপিককে ধন্যবাদ আমি আবার প্রশ্নটি পড়েছি এটি পুনরায় জিজ্ঞাসা করে যে কীভাবে একটি REST এপিআই তৈরি করবেন যা সংস্থার জন্য আইডির অ্যারে নেয়? এবং আমি একমত, আমার উত্তর ভিন্ন। আপনার বক্তব্য না পাওয়ার জন্য দুঃখিত।
নীলেশ

আমি এই উত্তরটি পছন্দ করি কারণ একাধিক ব্যবহারকারীর প্রাপ্তির এই উপায়টি এই প্রক্রিয়াটির মাধ্যমে।
শেন কোর্ট্রিল

20

আমি একই জিনিস ব্যবহার করে অন্য উপায় খুঁজে পেতে @PathParam। এখানে কোড নমুনা।

@GET
@Path("data/xml/{Ids}")
@Produces("application/xml")
public Object getData(@PathParam("zrssIds") String Ids)
{
  System.out.println("zrssIds = " + Ids);
  //Here you need to use String tokenizer to make the array from the string.
}

নিম্নলিখিত url ব্যবহার করে পরিষেবাটি কল করুন।

http://localhost:8080/MyServices/resources/cm/data/xml/12,13,56,76

কোথায়

http://localhost:8080/[War File Name]/[Servlet Mapping]/[Class Path]/data/xml/12,13,56,76

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

1
আমি দেখতে পেয়েছি যে সর্বাধিক উত্সাহিত উত্তরটি কাজ করে না এবং আপনার উত্তর সম্ভবত সবচেয়ে জেনেরিক। উত্তর হিসাবে গ্রহণ করা উচিত।
warশ্বর

18

আমি যতটা এই পদ্ধতির পছন্দ করি: -

    api.com/users?id=id1,id2,id3,id4,id5

সঠিক উপায়

    api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

অথবা

    api.com/users?ids=id1&ids=id2&ids=id3&ids=id4&ids=id5

এইভাবে তাক এটি করে। এইভাবে পিএইচপি এটি করে। এইভাবে নোড এটিও করে ...


19
আমি নিশ্চিত নই যে অনুসরণের জন্য গাইডলাইন হিসাবে পিএইচপি মানকে উল্লেখ করা সর্বোত্তম পরামর্শ best eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design
trebor

এটি ফ্লাস্ক এটি করে না।
jscul

0

আপনি এএসপি.নেট এমভিসি ব্যবহার করে একটি রেস্ট এপিআই বা একটি বিশ্রামপ্রাপ্ত প্রকল্প তৈরি করতে পারেন এবং জেএসওএন হিসাবে ডেটা ফেরত দিতে পারেন। একটি উদাহরণস্বরূপ নিয়ন্ত্রক ফাংশন হবে:

        public JsonpResult GetUsers(string userIds)
        {
           var values = JsonConvert.DeserializeObject<List<int>>(userIds);

            var users = _userRepository.GetAllUsersByIds(userIds);

            var collection = users.Select(user => new { id = user.Id, fullname = user.FirstName +" "+ user.LastName });
            var result = new { users = collection };

            return this.Jsonp(result);
        }
        public IQueryable<User> GetAllUsersByIds(List<int> ids)
        {
            return _db.Users.Where(c=> ids.Contains(c.Id));
        }

তারপরে আপনি কেবল আইডির অ্যারে সরবরাহ করে নিয়মিত এজেএক্স ফাংশনটির মাধ্যমে গেটউজার্স ফাংশনটি কল করুন (এই ক্ষেত্রে আমি স্ট্রিং হিসাবে অ্যারে প্রেরণ করতে jQuery স্ট্রিংফাই ব্যবহার করছি এবং এটি নিয়ামকটিতে আবার ডিজিটালাইজড করতে পারছি তবে আপনি কেবল ইনটসের অ্যারে প্রেরণ করতে এবং গ্রহণ করতে পারেন এটি নিয়ামকের মধ্যে int এর অ্যারে হিসাবে)। আমি ASP.NET MVC ব্যবহার করে একটি সম্পূর্ণ রেস্টফল এপিআই তৈরি করেছি যা ক্রস ডোমেন জসন হিসাবে ডেটা ফেরত দেয় এবং এটি কোনও অ্যাপ থেকে ব্যবহার করা যায়। অবশ্যই আপনি যদি এএসপি.নেট এমভিসি ব্যবহার করতে পারেন।

function GetUsers()
    {
           var link = '<%= ResolveUrl("~")%>users?callback=?';
           var userIds = [];
            $('#multiselect :selected').each(function (i, selected) {
                userIds[i] = $(selected).val();
            });

            $.ajax({
                url: link,
                traditional: true,
                data: { 'userIds': JSON.stringify(userIds) },
                dataType: "jsonp",
                jsonpCallback: "refreshUsers"
            });
    }

3
দুঃখিত, আমি কীভাবে এপিআই বাস্তবায়ন করতে চাইছি তা জিজ্ঞাসা করছিলাম না। আমি কেবল এপিআই ইউআরআই কীভাবে তৈরি করব তা জিজ্ঞাসা করছিলাম যাতে ক্লায়েন্ট ব্যবহারকারীদের একটি অ্যারের সম্পর্কে তথ্য অ্যাক্সেস করতে পারে। আমি ক্যোয়ারী প্যারামিটারগুলির মাধ্যমে আইডি পাস করতে পারি, তবে আমি বিশ্বাস করি যে খুব শান্ত হবে না।
uclajatt

@uclajatt আপনি কেন মনে করেন যে এটি বিশ্রাম নয়?
ড্যারেল মিলার

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

1
@uclajatt Thats দুই বার এখন এই পোস্টে আপনাকে জিজ্ঞাসা করা হয়েছে যে আপনি কেন মনে করেন যে কোনও প্রশ্নের পরামিতিতে কমা বিচ্ছিন্ন তালিকাটি পাস করা শান্ত নয় এবং আপনি এর উত্তর দেওয়ার জন্যও মাথা ঘামান না, একাকী এই অত্যন্ত যুক্তিযুক্ত সমাধানকেই গ্রহণ করুন !? ! ভালো না.
সমিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.