Retrofit 2 xóa các ký tự sau tên máy chủ khỏi url cơ sở


121

Tôi đang sử dụng Retrofit để truy cập api RESTful. Url cơ sở là:

http://api.example.com/service

Đây là mã cho giao diện:

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

và đây là cách tôi gửi yêu cầu và nhận được phản hồi:

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

nhật ký mà tôi nhận được là một điều kỳ lạ:

V / Ví dụ ﹕ Phản hồi {protocol = http / 1.1, code = 404, message = Not Found, url = http://api.example.com/album/featured-albums }

Những gì đang xảy ra ở đây?


bạn có thể giải quyết vấn đề? vì tôi cũng đang phải đối mặt với vấn đề tương tự. và ngay cả sau khi tôi cố gắng đáp án đúng tôi luôn luôn nhận được trong onFailure
Parth Anjaria

Câu trả lời:


283

Retrofit 2 sử dụng các quy tắc tương tự như một <a href="">.

Phần dẫn đầu /trên URL tương đối của bạn cho Retrofit biết rằng đó là một đường dẫn tuyệt đối trên máy chủ. Đây là một ví dụ từ một bài thuyết trình mà tôi đã trình bày cho thấy điều này:

nhập mô tả hình ảnh ở đây

Lưu ý URL không chính xác đã được giải quyết ở dưới cùng.

Bằng cách loại bỏ phần dẫn đầu /, URL sau đó trở nên tương đối và sẽ kết hợp với các phân đoạn đường dẫn là một phần của URL cơ sở. Đã sửa trong bản trình bày, URL cuối cùng bây giờ là chính xác:

nhập mô tả hình ảnh ở đây

Trong ví dụ của bạn, bạn không có dấu cuối /trên URL cơ sở. Bạn có thể muốn thêm một cái để các đường dẫn tương đối được giải quyết ở trên nó chứ không phải là anh chị em của nó.


12
Tôi thực sự không hiểu tại sao kiểu phân giải URL mới này lại có lợi hơn. Tất cả những gì bạn có thể nhận được từ nó là lỗi ẩn (như được chỉ ra bởi câu hỏi này) và kết quả phản trực quan ( http://api.example.com/service+ /album/featured-albumsthì không http://api.example.com/album/featured-albums). Và lỗi im lặng này không bắt nguồn từ việc bạn đặt /ở cuối url cơ sở hay ở phía trước của URL API. Có bất kỳ trường hợp sử dụng nào mà việc cắt ngắn này hữu ích không?
EpicPandaForce


11
Nó có ý nghĩa với tôi sau khi xem bài thuyết trình, nhưng sẽ rất tuyệt nếu thêm một ghi chú nhỏ vào trang web. Tôi đã mất vài phút để tìm ra điều gì đang xảy ra.
Albert Vila Calvo

8
@JakeWharton làm thế nào để tôi @POSTđến baseUrl(mà không cần thêm bất kỳ pathSegment? S Ví dụ: baseUrlhttp://api.example.com/album/featured-albumsvà tôi muốn tôi @POSTgọi đến http://api.example.com/album/featured-albums. (URL tương tự như cơ sở) @POST("") ném mộtjava.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
ZakTaccardi

17
Sử dụng@Post(".")
Jake Wharton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.