1. ホーム
  2. android

[解決済み] Retrofit 2 はベースURLからホスト名の後の文字を削除します。

2022-05-31 14:07:31

質問

Retrofitを使って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/Example﹕ Response{protocol=http/1.1, code=404, message=Not Found, url= http://api.example.com/album/featured-albums }

どうなってるんだ?

どのように解決するのですか?

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

先頭の / は、Retrofitにそれがホスト上の絶対パスであることを伝えます。これは、私が行ったプレゼンテーションの例です。

不正確なURLに注意してください。

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

あなたの例では、末尾の / を付けていません。おそらく、相対パスがその兄弟としてではなく、その上に解決されるように、追加したいのでしょう。