Retrofit 2, ana URL'den ana makine adından sonraki karakterleri kaldırır


122

RESTful API'ye erişmek için Retrofit kullanıyorum. Temel url:

http://api.example.com/service

Bu arayüzün kodudur:

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

ve şu şekilde istek gönderiyorum ve yanıtı alıyorum:

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();

aldığım günlük garip bir şey:

V / Örnek ﹕ Yanıt {protokol = http / 1.1, kod = 404, ileti = Bulunamadı, url = http://api.example.com/album/featured-albums }

Burada neler oluyor?


sorunu çözebilir misin? Ben de aynı sorunla karşı karşıya olduğum için. ve doğru cevabı denedikten sonra bile her zaman başarısız olurum
Parth Anjaria

Yanıtlar:


283

Güçlendirme 2, bir yapacağıyla aynı kuralları kullanır <a href="">.

Lider /senin göreli URL üzerinde o ana bilgisayardaki mutlak bir yol olduğunu Sonradan montaj söyler. İşte bunu gösteren bir sunumdan bir örnek:

görüntü açıklamasını buraya girin

Altta çözülen yanlış URL'ye dikkat edin.

Baştaki karakter kaldırıldığında, /URL göreceli hale gelir ve temel URL'nin parçası olan yol segmentleriyle birleşir. Sunumda düzeltilen nihai URL artık doğrudur:

görüntü açıklamasını buraya girin

Örneğinizde /, temel URL'de bir sonda yok . Muhtemelen bir tane eklemek istersiniz, böylece göreceli yollar onun bir kardeşi olarak değil de üstüne çözülür.


12
Bu yeni tip URL çözümlemesinin neden daha faydalı olduğunu gerçekten anlamıyorum. Ondan alabileceğiniz tek şey gizli hatalar (bu soruda belirtildiği gibi) ve karşı sezgisel sonuçlar ( http://api.example.com/service+ /album/featured-albumsdeğil http://api.example.com/album/featured-albums). Ve bu sessiz hata /, temel url'nin sonuna veya API URL'sinin önüne yerleştirmeniz dışında hiçbir şeyden kaynaklanmaz . Bu kısaltmanın yararlı olduğu herhangi bir kullanım durumu var mı?
EpicPandaForce


11
Sunumu izledikten sonra bana mantıklı geliyor, ancak web sitesine küçük bir not eklemek harika olur. Neyin yanlış gittiğini anlamam birkaç dakikamı aldı.
Albert Vila Calvo

8
@JakeWharton nasıl Yaparım @POSTiçin baseUrlherhangi eklemeden ( pathSegment? S Örnek: baseUrlolan http://api.example.com/album/featured-albumsve benim istiyorum @POSTçağrı gitmek için http://api.example.com/album/featured-albums. Üs olarak (aynı URL) @POST("") bir atarjava.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
ZakTaccardi

17
Kullanın@Post(".")
Jake Wharton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.