Retrofit 2 बेस यूआरएल से होस्टनाम के बाद वर्ण हटाता है


121

मैं रेट्रोफिट का उपयोग एक RESTful एपीआई पर पहुंचने के लिए कर रहा हूं। आधार यूआरएल है:

http://api.example.com/service

यह इंटरफ़ेस के लिए कोड है:

public interface ExampleService {
    @Headers("Accept: Application/JSON")
    @POST("/album/featured-albums")
    Call<List<Album>> listFeaturedAlbums();
}

और यह है कि मैं अनुरोध भेजने और प्रतिसाद प्राप्त करता है:

new AsyncTask<Void, Void, Response<List<Album>>>() {

        @Override
        protected Response<List<Album>> doInBackground(Void... params) {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://api.example.com/service")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

            ExampleService service = retrofit.create(ExampleService.class);

            try {
                return service.listFeaturedAlbums().execute();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Response<List<Album>> listCall) {
            Log.v("Example", listCall.raw().toString());
        }
    }.execute();

लॉग जो मुझे मिलता है वह अजीब बात है:

V / उदाहरण / प्रतिक्रिया {प्रोटोकॉल = http / 1.1, कोड = 404, संदेश = नहीं मिला, url = http://api.example.com/album/featured-albums }

यहाँ क्या चल रहा है?


क्या आप इस मुद्दे को हल कर सकते हैं? जैसा कि मैं भी उसी मुद्दे का सामना कर रहा हूँ। और सही जवाब देने की कोशिश करने के बाद भी मैं हमेशा ऑनफेयर में रहता हूं
पार्थ अंजारिया

जवाबों:


283

रेट्रोफिट 2 उन्हीं नियमों का उपयोग करता है जो कर <a href="">सकते हैं।

/आपके रिश्तेदार URL पर अग्रणी, रेट्रोफ़िट को बताता है कि यह मेजबान पर एक निरपेक्ष पथ है। यहां एक प्रस्तुति से एक उदाहरण दिया गया है, जो मैंने यह दिखाया है:

यहां छवि विवरण दर्ज करें

गलत URL नोट करें जो सबसे नीचे हल किया गया था।

अग्रणी को हटाकर /, URL तब सापेक्ष हो जाता है और पथ सेगमेंट के साथ संयोजित हो जाएगा जो बेस URL का हिस्सा है। प्रस्तुति में ठीक किया गया अंतिम URL अब सही है:

यहां छवि विवरण दर्ज करें

आपके उदाहरण में आपके पास /आधार URL पर अनुगामी नहीं है । आप शायद एक जोड़ना चाहते हैं ताकि रिश्तेदार रास्ते इसके शीर्ष पर हल हो जाएं बजाय इसके कि इसे एक भाई के रूप में।


12
मुझे वास्तव में समझ नहीं आया कि इस नए प्रकार का URL रिज़ॉल्यूशन अधिक लाभदायक क्यों है। आप इससे प्राप्त कर सकते हैं यह छिपा हुआ त्रुटियाँ हैं (जैसे कि इस प्रश्न से संकेत मिलता है), और काउंटर-सहज परिणाम ( http://api.example.com/service+ /album/featured-albumsनहीं है http://api.example.com/album/featured-albums)। और यह मूक त्रुटि कुछ भी नहीं है लेकिन चाहे आप /बेस यूआरएल के अंत में या एपीआई यूआरएल के सामने रखें। क्या ऐसे उपयोग-मामले हैं जहां यह ट्रंकेशन उपयोगी है?
एपिकपांडाफार्स


11
प्रेजेंटेशन देखने के बाद यह मेरे लिए समझ में आता है, लेकिन वेबसाइट पर एक छोटा नोट जोड़ना बहुत अच्छा होगा। मुझे यह पता लगाने में कुछ मिनट लगे कि क्या गलत हो रहा था।
अल्बर्ट विला कैल्वो

8
@JakeWharton कैसे मैं ऐसा @POSTकरने के लिए baseUrl(किसी भी जोड़े बिना pathSegment? रों उदाहरण: baseUrlहै http://api.example.com/album/featured-albumsऔर मैं अपने चाहते @POSTकॉल करने के लिए जाने के लिए http://api.example.com/album/featured-albums। (आधार के रूप में उसी यूआरएल) @POST("") फेंकता एकjava.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
ZakTaccardi

17
उपयोग@Post(".")
जेक व्हार्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.