Retrofit 2はベースURLからホスト名の後の文字を削除します


121

レトロフィットを使用してRESTful APIにアクセスしています。ベースURLは次のとおりです。

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 /例:レスポンス{protocol = http / 1.1、code = 404、message = Not Found、url = http://api.example.com/album/featured-albums }

何が起きてる?


問題を解決できますか?私も同じ問題に直面しているので。そして、私が正しい答えを試した後でも、私はいつもonfailureに入ります
Parth Anjaria

回答:


283

Retrofit 2は、意志と同じルールを使用します<a href="">

/相対URL の先頭は、それがホスト上の絶対パスであることをRetrofitに通知します。これは私がこれを示したプレゼンテーションの例です:

ここに画像の説明を入力してください

下部で解決された不正なURLに注意してください。

先頭のを削除する/と、URLが相対になり、ベースURLの一部であるパスセグメントと結合されます。プレゼンテーションで修正され、最終URLが正しくなりました。

ここに画像の説明を入力してください

あなたの例/では、ベースURLの末尾はありません。相対パスがその兄弟としてではなく、その上で解決されるように、おそらく1つ追加する必要があります。


12
この新しいタイプのURL解決がより有益である理由が本当にわかりません。あなたがそれから得ることができるすべては(この質問によって示されるような)隠されたエラーと反直観的な結果です(http://api.example.com/service+ /album/featured-albumsはではありませんhttp://api.example.com/album/featured-albums)。また、このサイレントエラー/は、ベースURLの末尾に配置するか、API URLの先頭に配置するかに関係なく発生します。この切り捨てが役立つユースケースはありますか?
EpicPandaForce 2015


11
プレゼンテーションを見た後に私には理にかなっていますが、ウェブサイトに小さなメモを追加することは素晴らしいことです。何が悪いのかを見つけるのに数分かかりました。
Albert Vila Calvo

8
@JakeWhartonどのように@POSTしてbaseUrlpathSegments を追加せずに?例:baseUrlis http://api.example.com/album/featured-albumsと私は(ベースと同じURL)@POSTに移動したいhttp://api.example.com/album/featured-albums@POST("") スローjava.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
ZakTaccardi

17
使用@Post(".")
ジェイクウォートン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.