मेरे पास यूआरआई के बारे में एक प्रश्न है जो मेरे रीस्टफुल एप्लिकेशन का प्रतिनिधित्व करना चाहिए। मैंने विभिन्न संसाधनों पर कई विषयों को पढ़ा है लेकिन मुझे अभी भी यकीन नहीं है कि मुझे निम्नलिखित स्थिति को कैसे लागू करना चाहिए:

मेरे नियंत्रक में मेरे पास 3 विधियां हैं:

List<Books> getAllBooks()
List<Books> getBooksByTitle(String title)
List<Books> getBooksByAuthor(String author)

यह स्पष्ट है कि मुझे पहली विधि के लिए "/books" यूआरआई चुनना चाहिए, लेकिन अगर मैं अगले तरीकों के लिए "/books/title?" या "/books/author?" को मैप करता हूं तो एक अपवाद "अस्पष्ट मैपिंग" फेंक दिया जाता है। "/books/title/" और "/books/author/" एक अच्छा विकल्प प्रतीत नहीं होता।

मैं मुझे क्या समाधान सुझा सकता हूं?

1
Pasha 27 अप्रैल 2018, 15:26

4 जवाब

रेस्टफुल होने के लिए, आपको एक खोज पैटर्न का उपयोग करना चाहिए:

List<Books> getAllBooks()                    --> /books
List<Books> getBooksByTitle(String title)    --> /books?title=...
List<Books> getBooksByAuthor(String author)  --> /books?author=...

क्योंकि लेखक और शीर्षक आपकी पुस्तकों के उप-संसाधन नहीं हैं।

यदि आप किसी पुस्तक को उसके अद्वितीय कोड द्वारा खोज रहे थे, तो आपको /books/{id} का उपयोग करना चाहिए क्योंकि आप एक विशिष्ट संसाधन की पहचान कर रहे हैं।
इस प्रकार का पैटर्न आपको आवश्यकता पड़ने पर उप-संसाधनों की पहचान करने की अनुमति देता है, उदाहरण के लिए, यदि आप किसी विशिष्ट पुस्तक की शैली चाहते हैं:

List<BookGenres> getGenresFromBook(int idBook) --> /books/{id}/genres
1
Nathan 27 अप्रैल 2018, 15:34

यदि आप रिचर्डसन परिपक्वता मॉडल की बात कर रहे हैं, तो आपको अपने अंतिम बिंदुओं को संसाधनों के रूप में मानना ​​चाहिए। जिसका अर्थ है कि आप अपना परिणाम फ़िल्टर करने के लिए क्वेरी पैरामीटर वाले एक संसाधन पर विचार कर सकते हैं:

  • प्राप्त करें /किताबें
  • GET /books?title={title}
  • GET /books?author={author}

एक अन्य दृष्टिकोण एक 'शीर्षक' संसाधन और एक 'लेखक' संसाधन पर विचार करना हो सकता है जो एक पुस्तक इकाई के लिए एक लिंक प्रदान करेगा।

  • प्राप्त करें /किताबें
  • GET /titles/{title} // लिंक /book/{id} के साथ मिलते-जुलते शीर्षकों की सूची लौटाता है
  • GET /authors/{author} // लिंक /book/{id} के साथ मेल खाने वाले लेखकों की सूची लौटाता है
0
TomVW 27 अप्रैल 2018, 15:39

यदि आप स्प्रिंग का उपयोग कर रहे हैं तो आपके पास इन पंक्तियों के साथ कुछ हो सकता है

@RestController
@RequestMapping("/api/books")
public class BookController{
    private BookService bookService;

    public BookController(BookService bookService){
        this.bookService=bookService;
    }

    @GetMapping()
    public List<Book> getBooks(@RequestParam Map<String,String> allRequestParams){
        return bookService.getBooks(allRequestParams);
    }
}

फिर आप एपीआई को कॉल कर सकते हैं जैसे:

लोकलहोस्ट: 8080/एपीआई/किताबें? लेखक = लेखक का नाम

लोकलहोस्ट:8080/एपीआई/किताबें?शीर्षक=बुकटाइटल

और आप मानचित्र से फ़िल्टर तक पहुंच सकते हैं जैसे allRequestParams.get("title");

साथ ही आप यह सुनिश्चित करने के लिए अपनी फ़िल्टर इकाई लागू कर सकते हैं कि फ़िल्टर सही तरीके से सेट अप किए गए हैं जैसे:

public class BookFilter{
    private String title;
    private String authorFilter;

    // Getters and setters omitted
}
    // And then in the Controller you can use the following
        @GetMapping()
        public List<Book> getBooks(BookFilter bookFilter){
           return bookService.getBooks(bookFilter);
        }
0
Vadim 27 अप्रैल 2018, 15:39

आप फ़ील्ड द्वारा परिणाम खोजने के लिए PathVariable का उपयोग कर सकते हैं।

@RequestMapping(value = "/book")
@RestController
public class BookController {
    @GetMapping
    List<Book> getAllBooks()

    @GetMapping("/title={title}")
    List<Book> getBooksByTitle(@PathVariable String title)

    @GetMapping("/author={author}")
    List<Book> getBooksByAuthor(@PathVariable String author)
}

रेस्टफुल एपीआई को कॉल करें जैसे:

'/book'
'/book/title=xxx'
'/book/author=xxx'
0
buddha 27 अप्रैल 2018, 15:56