改造2删除主机名中主机名后面的字符


121

我正在使用Retrofit访问RESTful API。基本网址是:

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:响应{协议= http / 1.1,代码= 404,消息=未找到,URL = http://api.example.com/album/featured-albums }

这里发生了什么?


你能解决这个问题吗?因为我也面临着同样的问题。甚至在我尝试正确答案后,我也总是会失败
Parth Anjaria

Answers:


283

改造2使用与will相同的规则<a href="">

该领导/在你的相对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 2015年


11
看完演示文稿后,这对我来说很有意义,但是在网站上添加一个小注释会很棒。我花了几分钟时间才找出问题所在。
艾伯特·维拉·卡尔沃

8
@JakeWharton我@POST该如何处理baseUrl(不添加任何pathSegments?例如:baseUrlis http://api.example.com/album/featured-albums并且我希望我的@POST呼叫转到http://api.example.com/album/featured-albums(与基本URL相同的URL)。 @POST("") 抛出java.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
ZakTaccardi

17
使用@Post(".")
杰克·沃顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.