Retrofit 2는 기본 URL에서 호스트 이름 뒤의 문자를 제거합니다.


121

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 / 예제 ﹕ 응답 {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은 이제 정확합니다.

여기에 이미지 설명 입력

귀하의 예에서는 /기본 URL에 후행이 없습니다 . 상대 경로가 형제가 아닌 그 위에 확인되도록 하나를 추가 할 수 있습니다.


12
이 새로운 유형의 URL 확인이 더 유익한 이유를 이해하지 못합니다. 여기에서 얻을 수있는 것은 숨겨진 오류 (이 질문에 표시된 것과 같은)와 반 직관적 인 결과 ( http://api.example.com/service+ /album/featured-albums는 아님 http://api.example.com/album/featured-albums) 뿐입니다 . 그리고이 조용한 오류 /는 기본 URL의 끝에 또는 API URL의 앞에 배치하는지 여부에 관계없이 발생합니다 . 이 잘림이 유용한 사용 사례가 있습니까?
EpicPandaForce


11
프레젠테이션을보고 나에게 의미가 있지만 웹 사이트에 작은 메모를 추가하면 좋을 것입니다. 무엇이 잘못되었는지 알아내는 데 몇 분이 걸렸습니다.
Albert Vila Calvo 2015 년

8
@JakeWharton가 어떻게을 @POST받는 baseUrl어떤 추가하지 않고 ( pathSegment?들 예 : baseUrl이다 http://api.example.com/album/featured-albums내가 내 원하는 @POST통화로 이동합니다 http://api.example.com/album/featured-albums. 기본으로 (같은 URL)를 @POST("") 발생java.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
ZakTaccardi

17
사용@Post(".")
제이크 와튼
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.