জটিল রিস্টালফুল অনুসন্ধান পদ্ধতিটি করার উপযুক্ত উপায় কী?


44

REST নীতি অনুসরণ করে, আমি আমার API এর জন্য একটি জিইটি পদ্ধতি তৈরি করতে চাই যা কিছু মানদণ্ড ব্যবহার করে অনুসন্ধান করে এবং ক্লায়েন্টকে ফলাফল ফিরিয়ে দেয়। সমস্যাটি হচ্ছে মানদণ্ডে 14 টি প্যারামিটার থাকতে পারে, এর মধ্যে একটি জটিল বস্তুর একটি তালিকা, তাই ...

  • এমনকি ইউআরএল প্যারামিটারে / থেকে এই জটিল বিষয়গুলি এনকোড / ডিকোড করা সম্ভব কিনা তা আমি জানি না।

  • ইউআরএল কত দিন পেতে পারে তা আমি গণনা করি নি তবে আমি নিশ্চিত এটি যথেষ্ট পরিমাণে বড় হবে এবং সম্ভবত ইউআরএল দৈর্ঘ্যের সীমাতে পৌঁছে যাবে?

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

আপনি কি আমাকে এই বিষয়গুলি পরিষ্কার করতে পারেন এবং প্রচুর পরামিতি সহ একটি বিশ্রাম অনুসন্ধান পদ্ধতি তৈরি করার জন্য আপনার কী পরামর্শ হবে?


3
একদিকে যেমন (আমি লক্ষ করি যে লেখার সময় দুটি উত্তর দুটিই আসল সময়ের অংশের উল্লেখ করে না), রিয়েল টাইম অনুসন্ধানগুলি সাধারণত আপডেট অনুরোধটি বার বার প্রেরণ করা উচিত। যেমন, যখন তুমি টাইপিং, আপনি অনুরোধ কাপড় মত পাঠাতে চাই search?q=t, search?q=te, search?q=test, ইত্যাদি। আপনার সার্ভারকে আঘাত না এড়াতে প্রায়শই কীভাবে ক্যোয়ারী প্রেরণ করা হবে তা সীমাবদ্ধ করার বিষয়টি বিবেচনা করুন। আপনি বিকল্পভাবে প্রচুর পরিমাণে তথ্য এবং ক্লায়েন্টের পক্ষ থেকে ফিল্টারিং করতে পারেন। যদি ব্যবহারকারী বিস্তৃত বিভাগগুলিতে প্রবেশ করে যা জিনিসগুলিকে ব্যাপকভাবে সঙ্কুচিত করতে পারে তবে এটি ভাল কাজ করে।
কেট

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

আপনার প্রয়োজনের উপর নির্ভর করে, এই গ্রন্থাগারটি কাজটি করতে পারে: github.com/jirutka/rsql-parser । আপনি যদি জেপিএ ব্যবহার করেন তবে এটিতে একটি জেপিএ এক্সটেনশন রয়েছে, বা আপনি নিজের অনুসন্ধান ইঞ্জিনের এপিআইতে মানচিত্র করতে নিজের নিজস্ব দর্শক লিখতে পারেন। এবং আপনি নিজের অপারেটর যুক্ত করতে পারেন।
ওয়ালফ্র্যাট

উত্তর:


54

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

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

বলেছে।

1. জিইটি একটি সুযোগ দিন

GETপ্রথমে বিকল্পটি বিবেচনা করুন । এই প্রশ্নের URL টির সর্বোচ্চ দৈর্ঘ্য পরীক্ষা করে দেখুন । আপনার দীর্ঘতম ক্যোয়ারী স্ট্রিং 2000 টি অক্ষরের চেয়ে দীর্ঘ কিনা তা মূল্যায়ন করুন। যদি এটি না হয় এবং আপনি এটি হওয়ার আশা করেন না তবে সাথে যান GET। এটি কুরুচিপূর্ণ বলে মনে হতে পারে তবে কমপক্ষে আপনি ইউআরএল বুকমার্ক করতে পারেন এবং অবশ্যই পদ্ধতিটির শব্দার্থবিজ্ঞান (আদর্শশক্তি, নিরাপদ এবং ক্যাশিং) থেকে প্রাপ্ত সমস্ত সুবিধা রয়েছে

1.1 ক্যোরির স্ট্রিংটি এনকোড করার চেষ্টা করুন

উদাহরণস্বরূপ, বেস in৪ এ Even এমনকি জাভাস্ক্রিপ্টও বেস enc৪ এনকোডিংগুলিকে সমর্থন করে

এটি কিভাবে এটি কাজ করে:

  1. সমস্ত ফিল্টার সহ জেএসএন তৈরি করুন এবং এটি স্বাভাবিক করুন।
  2. স্ট্রিং এ এটি পার্স করুন
  3. এটি এনকোড করুন
  4. অনুরোধ প্যারাম ( /search?q=SGVsbG8gV29ybGQh....) হিসাবে এনকোডেড JSON প্রেরণ করুন ।
  5. সার্ভার সাইড তারিখে, PARAM ডিকোড কুই
  6. জেএসএন স্ট্রিংটি ডিসরিয়ালাইজ করুন

পূর্বে, দীর্ঘতম সম্ভব JSON স্ট্রিং তৈরি করুন, এটিকে এনকোড করুন এবং দৈর্ঘ্যটি নিন। এনকোডযুক্ত স্ট্রিংটি ইউআরএল ফিট করে তবে মূল্যায়ন করুন। আপনার পরীক্ষা করার জন্য আমি নীচের স্নিপেটটি Fiddle.js এ প্রয়োগ করেছি । (আমি আশা করি এটি এখনও কার্যকর হয়) 1

বেস enc৪ এনকোডগুলি নির্বিচারক এবং বিপরীতমুখী, সুতরাং সংঘর্ষের কোনও সুযোগ নেই।

এনকোডযুক্ত প্রশ্নের সাহায্যে আমরা ডিবিতে অনুসন্ধানগুলিও সংরক্ষণ করতে পারি, ইউআরএল বুকমার্ক করতে পারি, লিঙ্কগুলি ভাগ করতে পারি And

1.2 এলিয়াস দিয়ে চেষ্টা করুন

কীভাবে আরএসটি এপিআই ডিজাইন করবেন এই ব্লগটি পড়ে আমি আরও একটি বিকল্পের কথা মনে করেছি remembered সাধারণ প্রশ্নের জন্য উপাত্ত

আমি পরের কারণে এগুলি আকর্ষণীয় বলে মনে করি

  • ক্যোরির স্ট্রিংয়ের দৈর্ঘ্য ছোট করুন। এটি এপিআই ক্লিনার এবং ব্যবহারকারী বান্ধব করে তোলে

    জিইটি / টিকিট /? অবস্থা = বন্ধ এবং বন্ধআট = এক্সএক্সএক্স বনাম জিইটি / টিকিট / সম্প্রতি-বন্ধ /

  • আরও অ্যালিয়াস বা আরও অনুরোধের পরামিতিগুলির সাথে সম্মিলনযোগ্য।

    জিইটি / টিকিট /? স্ট্যাটাস = ক্লোজড & ক্লোজডএট = এক্সএক্সএক্সএক্স এবং 30 মিমি বনাম জিইটি / টিকিট / সম্প্রতি-বন্ধ /? = 30 মিনিটের মধ্যে

  • আমরা এনকোডযুক্ত ক্যোয়ারী স্ট্রিং সহ উপকরণগুলি একত্রিত করতে পারি

    জিইটি / টিকিট /? স্ট্যাটাস = ক্লোজড & ক্লোজডএট = এক্সএক্সএক্স এবং = 30 মিনিট বনাম জিইটি / টিকিট / সম্প্রতি-বন্ধ /? কিউ = এসজিভিএসবিজি 8 জি ...


1: আমি জেএসএন ব্যবহার করেছি, তবে সার্ভার-সাইডে আমরা এটির ডিজায়ালাইজ করার সাথে সাথে আমরা অন্যান্য ফর্ম্যাটগুলি ব্যবহার করতে পারি।


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

1
আমি স্প্রিং স্ট্যাকওভারফ্লো.com/ সেকশনগুলি / 16942193/ … পছন্দ করি first আমি বিশ্বাস করতে পারি না এটি প্রথম চেষ্টাতে কাজ করেছে: ডি। ইউআরএল দৈর্ঘ্য সম্পর্কে, 1 কে এর চেয়ে কম, যদিও আমাদের এখনও চশমাটি পুনরাবৃত্তি করতে হবে।
anat0lius

তারপরে, জিইটি সহ যান। সরলতা জন্য. স্প্রিং এমভিসির সাহায্যে আপনি জিইটি এর সাথে একই ম্যাপিংটি অর্জন করতে পারেন। স্প্রিংয়ের ওয়েবআরগমেন্ট রিসোলভার ;-) অনুসন্ধান করুন
লাইভ

বেস 64 প্রায় 4/3 দ্বারা পে-লোড আকারকে স্ফীত করে। যখন ইউরেলকোডিং এটি বিশেষ অক্ষরের জন্য 3/1 করতে পারে, বেশিরভাগ নিরাপদ অক্ষরের সাথে অনুসন্ধানগুলি একই আকার রাখে। বেস 64 ব্যবহারের অন্য কোনও কারণ আছে কি?
ভিলাসভ

আসলে তা না. আমি কেবল ইউআরএল (এয়ার) এড়ানো পছন্দ করি না। পে-লোডের ওভারওয়েথটি এখানে ট্রেড অফ off এটি এখনও অনুরোধের জন্য জিইটির সর্বোচ্চ আকারের মধ্যে ফিট করতে হবে। সে জন্যই আমি স্নিপেট তৈরি করেছি। ব্যবহারকারী চেষ্টা করার জন্য। আমি যখন উত্তরটি লিখেছিলাম তখন আমি ওয়েব শব্দার্থককে প্রয়োগের বিশদটির উপর অগ্রাধিকার দিয়েছিলাম। উত্তরের পুরো বিষয়টি হ'ল "জিইটি দিয়ে চেষ্টা চালিয়ে যান"। আপনার উপায়টি সন্ধান করুন বা আমি আপনার সাথে ভাগ করে নিই সেগুলির কোনওটিই ব্যবহার করুন।
লাইভ

13

আপনার সমস্ত কিছু যদি হাতুড়ি হয় তবে সবকিছুই পেরেকের মতো দেখাচ্ছে। মনে হচ্ছে এখানে সমস্যাটি হ'ল আপনি কোনও অনুসন্ধান পৃষ্ঠাকে একটি বিশ্রামে পরিণত করার চেষ্টা করছেন এবং এটি রেস্ট্রফুল ডিজাইনের সমাধানের পক্ষে সাধারণ প্যাটার্ন বলে মনে হয় না।

আপনার ব্যাকএন্ড থেকে প্রয়োজনীয় তথ্য পেতে ব্যবহারকারী দ্বারা সরবরাহিত পরামিতিগুলির সাথে কেবল একটি পোষ্ট অনুরোধের সাথে যান। আমি ধরে নিয়েছি যে কোনও অনুসন্ধান সম্পাদন করা ছাড়া আপনার আর কিছু করার দরকার নেই, সুতরাং এই পৃষ্ঠার মাধ্যমে আপনার সন্নিবেশ করার কোনও সুযোগ নেই। শুধু / একটি যোগ আপনার URL এর শেষে অনুসন্ধান যার ফলে আপনি আপনার / ব্যবহারকারীরা পৃষ্ঠার সাথে দ্বন্দ্ব যা চালানোর জন্য ঝুঁকি না হবে RESTful হও।


2
@ লিলাউ_: এই প্রয়োজনের জন্য কেবল দুটি বাস্তব সম্ভাবনা রয়েছে: ১. আপনার ফ্রন্ট- এন্ডে সমস্ত ডেটা পড়ুন এবং সেখানে ফিল্টারিং করুন। এটি প্রয়োজনীয় পরিমাণ মেমরির ক্ষেত্রে নিষিদ্ধ হতে পারে। 2. অনুসন্ধানের মানদণ্ডের প্রতিটি পরিবর্তনের জন্য সার্ভারে একটি নতুন অনুরোধ করুন। এটি কোনও পোষ্ট বা জিইটি অনুরোধ কিনা তা বিবেচনাধীন নয়, তবে জড়িত নেটওয়ার্কের বিলম্বিতা "রিয়েল টাইম" আপডেটগুলির ব্যবহারকারীর বোধের জন্য বাধা সৃষ্টি করতে পারে।
বার্ট ভ্যান ইনজেন শেেনা

2
আমি একমত পোষণ করতে রাজি হব, পোস্টের অর্থ শব্দার্থগতভাবে অন্য কিছু something আমি GET এর সাথে যেতে এবং ক্যোয়ারি প্যারামিটারে এখন সমস্ত ফিল্টার ডেটা পাস করার পরামর্শ দিচ্ছি যদি খুব বেশি পরামিতি থাকে তবে অ্যাপ্লিকেশন স্তরে এটি একটি ত্রুটি।
কোডইগি 14

2
@ কোডযোগি মাঝে মাঝে গ্রাহক আপনাকে আলোচনার জন্য স্থান দেয় না। আমি প্রতিটি তার নিজস্ব ফিল্টার সহ 40-50 টি কলাম সহ এক্সেল-মত ভিউ পৃষ্ঠাগুলি প্রয়োগ করেছি। এবং অবশ্যই বাছাইযোগ্য। যাইহোক, জিইটি দিয়ে এখনও সম্ভব তবে এটি খুব বেশি ফ্যাশন বলে মনে হচ্ছে না
লাইব

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

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

0

এটি সম্পূর্ণরূপে আপনার এপিআই মডেলটি নির্ভর করে: কোনওটি নয় বা ক্রিয়া হিসাবে।

যদি এপিআই না হয় তবে আপনি নীচের হিসাবে অবজেক্টের তালিকা পেতে চাইতে পারেন:

GET: /api/v1/objects

এই ক্ষেত্রে আপনাকে অনুরোধের পরামিতি হিসাবে ডেটা প্রেরণ করতে হবে। সুতরাং আপনাকে কী-মানগুলির ফ্ল্যাট তালিকা হিসাবে আপনার পরামিতিগুলি বর্ণনা করতে হবে:

GET: /api/v1/objects

key1 : val1
key2.key1 : val 21
key2.key2 : val 22
....

কিছু প্ল্যাটফর্ম কাস্টম প্যারামিটার রিসলভারকে সমর্থন করে (যেমন স্প্রিং এমভিসি), এমন একটি যা আপনি প্যারামগুলিকে কোনও বস্তুতে রূপান্তর করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.