क्वेरी मापदंडों की लंबी सूची के साथ RESTful क्वेरी API डिज़ाइन करें [बंद]


153

मुझे एक RESTful क्वेरी API डिज़ाइन करने की आवश्यकता है, जो कुछ फ़िल्टर के आधार पर ऑब्जेक्ट का एक सेट लौटाता है। इसके लिए सामान्य HTTP तरीका GET है। एकमात्र समस्या यह है कि इसमें कम से कम एक दर्जन फ़िल्टर हो सकते हैं, और यदि हम उन सभी को क्वेरी मापदंडों के रूप में पास करते हैं, तो URL काफी लंबा (कुछ फ़ायरवॉल द्वारा अवरुद्ध होने के लिए पर्याप्त) हो सकता है।

मापदंडों की संख्या को कम करना एक विकल्प नहीं है।

एक विकल्प जो मैं सोच सकता था, वह यह है कि URI पर POST विधि का उपयोग करना और POST निकाय के हिस्से के रूप में फ़िल्टर भेजना। क्या यह Restfull (डेटा को क्वेरी करने के लिए एक POST कॉल करना) के खिलाफ है।

किसी को भी किसी भी बेहतर डिजाइन सुझाव है?


2
लघु (1-char, आदि) पैरामीटर नामों का उपयोग करें?
मदब्राइक्स 18

2
यह वास्तव में Restful नहीं हो सकता है, लेकिन मुझे लगता है कि GET और POST के आने पर आपको व्यावहारिक होना चाहिए। यदि आपके पास भेजने के लिए कई चर हैं और आप उन्हें कम नहीं कर सकते हैं, तो मैं उन्हें पोस्ट करूँगा। मुझे URL ओवरस्टफ़ करना पसंद नहीं है, लेकिन यह सिर्फ मुझे है।
डग डावसन

धन्यवाद। भले ही यह प्रश्न बंद हो, यह वास्तव में वह प्रश्न है जिसके लिए मुझे एक उत्तर की आवश्यकता थी। मैं खुश हूं कि आपने पूछा।
केसी बदमाश

जवाबों:


142

याद रखें कि REST API के साथ, यह आपके दृष्टिकोण का प्रश्न है।

REST API में दो मुख्य अवधारणाएँ एंडपॉइंट और संसाधन (निकाय) हैं। पूरी तरह से, एक समापन बिंदु या तो GET के माध्यम से संसाधन देता है या POST और PUT और इतने पर (या उपरोक्त के संयोजन) के माध्यम से संसाधनों को स्वीकार करता है।

यह स्वीकार किया जाता है कि POST के साथ, जो डेटा आप भेजते हैं, उसके परिणामस्वरूप कोई नया संसाधन और इससे संबद्ध समापन बिंदु (ओं) का निर्माण नहीं हो सकता है, जो संभवतः POSTed url के तहत "लाइव" नहीं होंगे। दूसरे शब्दों में जब आप POST करते हैं तो आप डेटा को हैंडलिंग के लिए कहीं भेज देते हैं। POST एंडपॉइंट वह जगह नहीं है जहां संसाधन सामान्य रूप से मिल सकता है।

RFC 2616 से उद्धृत (अप्रासंगिक भागों के साथ छोड़ दिया गया, और संबंधित भागों को हाइलाइट किया गया):

9.5 पोस्ट

POST विधि का उपयोग अनुरोध करने के लिए किया जाता है कि मूल सर्वर अनुरोध में संलग्न इकाई को अनुरोध-लाइन में अनुरोध-यूआरआई द्वारा पहचाने गए संसाधन के नए अधीनस्थ के रूप में स्वीकार करता है। POST को निम्नलिखित कार्यों को कवर करने के लिए एक समान विधि की अनुमति देने के लिए डिज़ाइन किया गया है:

  • ...
  • डेटा का एक ब्लॉक प्रदान करना, जैसे कि डेटा जमा करने की प्रक्रिया के लिए फ़ॉर्म सबमिट करना;
  • ...

...

POST विधि द्वारा की गई कार्रवाई के परिणामस्वरूप एक संसाधन नहीं हो सकता है जिसे URI द्वारा पहचाना जा सकता है । इस मामले में, 200 (ओके) या 204 (कोई सामग्री) उपयुक्त प्रतिक्रिया की स्थिति है, इस पर निर्भर करता है कि प्रतिक्रिया में एक इकाई शामिल है जो परिणाम का वर्णन करती है

यदि मूल सर्वर पर एक संसाधन बनाया गया है, तो प्रतिक्रिया को 201 (बनाया गया) होना चाहिए ...

हम 'चीजों' या 'डेटा' का प्रतिनिधित्व करने वाले एंडपॉइंट और संसाधनों के लिए उपयोग हो गए हैं, चाहे वह उपयोगकर्ता हो, संदेश हो, पुस्तक हो - समस्या डोमेन जो भी तय करती है। हालांकि, एक समापन बिंदु एक अलग संसाधन को भी उजागर कर सकता है - उदाहरण के लिए खोज परिणाम।

निम्नलिखित उदाहरण पर विचार करें:

GET    /books?author=AUTHOR
POST   /books
PUT    /books/ID
DELETE /books/ID

यह एक विशिष्ट REST CRUD है। लेकिन क्या होगा अगर हमने जोड़ा:

POST /books/search

    {
        "keywords": "...",
        "yearRange": {"from": 1945, "to": 2003},
        "genre": "..."
    }

इस समापन बिंदु के बारे में अन-रेस्टफुल कुछ भी नहीं है। यह अनुरोध निकाय के रूप में डेटा (निकाय) को स्वीकार करता है। वह डेटा सर्च क्राइटेरिया है - किसी अन्य की तरह एक डीटीओ। यह समापन बिंदु अनुरोध के जवाब में एक संसाधन (इकाई) का उत्पादन करता है: खोज परिणाम । खोज परिणाम संसाधन एक अस्थायी है, जिसे ग्राहक को तुरंत परोसा जाता है, बिना रीडायरेक्ट के और कुछ अन्य विहित यूआरएल से उजागर किए बिना।

यह अभी भी बाकी है, सिवाय संस्थाओं के किताबें नहीं हैं - अनुरोध इकाई पुस्तक खोज मानदंड है, और प्रतिक्रिया इकाई पुस्तक खोज परिणाम है।


क्या आप डीटीओ के लिए कुछ वर्गों के नामकरण सम्मेलनों का सुझाव दे सकते हैं?
क्वाडज़

व्यक्तिगत रूप से मैं BooksSearchCriteriaDTOऔर साथ जाना होगा BooksSearchResultsDTO
आमिर अबीरी

POST / पुस्तकों / खोज के इस मामले के लिए सबसे अच्छा HTTP प्रतिक्रिया कोड क्या होगा? 201 अभी भी लागू होता है?
एल। होलांडा

9
201 विपरीत है - इसका मतलब है कि एक संसाधन बनाया गया है। एक संसाधन जिसके बारे में यह उम्मीद की जाती है कि वह कहीं न कहीं अपना अनूठा यूआरआई होगा। 201 उपयुक्त है जब POSTसीआरयूडी के सी भाग के लिए उपयोग किया जाता है। मैं सादे पुराने 200 के साथ जाऊंगा, वैकल्पिक रूप से खाली खोज परिणामों के लिए 204 के साथ।
अमीर अबरी

@AmirAbiri आपको बहुत-बहुत धन्यवाद।
मुहम्मद-माहिरी

84

बहुत से लोगों ने इस प्रथा को स्वीकार किया है कि बहुत लंबा या बहुत जटिल एक क्वेरी स्ट्रिंग (जैसे क्वेरी स्ट्रिंग आसानी से नेस्टेड डेटा को आसानी से हैंडल नहीं करता है) के बजाय एक POST के रूप में भेजा जा सकता है, जिसमें शरीर में दर्शाए गए जटिल / लंबे डेटा के साथ भेजा जा सकता है। अनुरोध के।

HTTP कल्पना में POST के लिए कल्पना को देखें। यह अविश्वसनीय रूप से व्यापक है। (यदि आप REST में एक खामियों के माध्यम से युद्धपोत पालना चाहते हैं ... POST का उपयोग करें।)

आप जीईटी शब्दार्थ के कुछ लाभों को खो देते हैं ... जैसे कि स्वचालित रिट्रीट क्योंकि जीईटी एक प्रकार का शब्द है, लेकिन यदि आप इसके साथ रह सकते हैं, तो POST के साथ वास्तव में लंबे या जटिल प्रश्नों को संसाधित करना आसान हो सकता है।

(lol लंबे विषयांतर ... मैं हाल ही में पता चला कि HTTP कल्पना, प्राप्त द्वारा कर सकते हैं । एक दस्तावेज शरीर में होते हैं वहाँ एक अनुभाग है कि कहते हैं,, टीका है "किसी भी अनुरोध इस खंड में सूचीबद्ध लोगों को छोड़कर किसी दस्तावेज़ शरीर हो सकता है" ... और वह खंड जो किसी भी सूची को संदर्भित नहीं करता है। मैंने खोजा और एक धागा पाया जहां HTTP लेखक उस बारे में बात कर रहे थे, और यह जानबूझकर था, ताकि राउटर और इस तरह से अलग-अलग संदेशों के बीच अंतर न करना पड़े। हालांकि, अभ्यास के बहुत से बुनियादी ढांचे के टुकड़े एक GET के शरीर को गिराते हैं। इसलिए आप POST की तरह शरीर में प्रतिनिधित्व वाले फिल्टर के साथ प्राप्त कर सकते हैं, लेकिन आप पासा पलटेंगे।)


11
शरीर के साथ HTTP GET के बारे में अधिक चर्चा के लिए यह प्रश्न भी देखें ।
रिकी

6

संक्षेप में: एक पोस्ट करें, लेकिन एक्सटी -एचटीटीपीएल-एचटीटीपी: // HTTP- विधि-ओवरराइड हेडर का उपयोग करके HTTP विधि को ओवरराइड करें

वास्तविक अनुरोध

पोस्ट / किताबें

इकाई शरीर

{"शीर्षक": "इप्सम", "वर्ष": 2017}

हेडर

X-HTTP-Method-Override: GET

सर्वर की तरफ, जांचें कि क्या हेडर X-HTTP-Method-Override मौजूद है तो बैकएंड में अंतिम एंडपॉइंट के लिए रूट बनाने की विधि के रूप में इसका मान लें। इसके अलावा, निकाय को क्वेरी स्ट्रिंग के रूप में लें। बैकएंड के दृष्टिकोण से, अनुरोध केवल एक सरल GET बन गया।

इस तरह आप डिज़ाइन को REST सिद्धांतों के साथ सामंजस्य रखते हैं।

संपादित करें: मुझे पता है कि यह समाधान मूल रूप से कुछ ब्राउज़रों और सर्वरों में PATCH क्रिया समस्या को हल करने के लिए था, लेकिन यह मेरे लिए बहुत लंबे URL के मामले में GET क्रिया के साथ काम करता है जो कि प्रश्न में वर्णित समस्या है।


2
IETF ने एक्स
प्रीफ़ेक्स्ड


@jannis आपके द्वारा लिंक किया गया RFC 1.4 रहता है। यह मौजूदा X-हटाने और 1.5 पर कोई सिफारिश नहीं करता है । यह मौजूदा विनिर्देशों को ओवरराइड नहीं करता है। ... X-क्या IMO यहां रहेगा
जन मोलनार

-3

यदि आप जावा और JAX-RS में विकसित कर रहे हैं, तो मैं आपको @GET @GET के साथ उपयोग करने की सलाह देता हूं

जब मैं एक सूची से गुजरना चाहता था तो मेरे पास एक ही सवाल था।

उदाहरण देखें:

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;

@Path("/poc")
public class UserService {

    @GET
    @Path("/test/")
    @Produces(MediaType.APPLICATION_JSON)
    public Response test(@QueryParam("code") final List<Integer> code) {
                Integer int0 = codigo.get(0);
                Integer int1 = codigo.get(1);

        return Response.ok(new JSONObject().put("int01", int0)).build();
    }
}

URI पैटर्न: "poc / test? Code = 1 और code = 2 और code = 3

@QueryParam क्वेरी पैरामीटर "orderBy = age & orderBy = name" को java.util में बदल देगा। स्वचालित रूप से लिस्ट करें।


बेहतर होगा कि आप अपना उदाहरण बताएं। यह किस प्रोग्रामिंग भाषा में लिखा गया है?
एलेक्स एंड्रीव

हाय @AleksAndreev आपकी राय के लिए आपका धन्यवाद। यह बेहतर हो गया? tks
acacio.martins

यह प्रश्न RESTful सेवा के डिज़ाइन के बारे में है, कार्यान्वयन के बारे में नहीं। यह उत्तर प्रश्न का उत्तर नहीं देता है।
हेरिटिक मंकी

@ user1331413 IMHO हाँ, अब यह बेहतर है। आपके प्रयास के लिए धन्यवाद .. हालाँकि, जैसा कि माइक मैकक्घन ने कहा, सवाल REST अवधारणा के बारे में है, कार्यान्वयन के बजाय
एंड्रीव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.