Retrofit编码特殊字符

10

我使用retrofit和gson而不是android,因为它更快且更安全。

问题在于retrofit会对特殊字符进行编码,例如=?,而我正在使用的URL无法解码这些字符。

这是我的代码:

API类:

public interface placeApi {

@GET("/{id}")
public void getFeed(@Path("id") TypedString id, Callback<PlaceModel> response);
}

主类:

String url = "http://api.beirut.com/BeirutProfile.php?"; 
String next = "profileid=111";


 //Creating adapter for retrofit with base url
    RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(url).setRequestInterceptor(requestInterceptor).build();

    //Creating service for the adapter
    placeApi placeApi = restAdapter.create(placeApi.class);

    placeApi.getFeed(id, new Callback<PlaceModel>() {
        @Override
        public void success(PlaceModel place, Response response) {
            // System.out.println();
            System.out.println(response.getUrl());
            name.setText("Name: " + place.getName());
        }

        @Override
        public void failure(RetrofitError error) {
            System.out.println(error.getMessage());
        }
    });

我尝试使用这个gson方法解决问题,但它没有起作用,很可能是因为它只包含了URL的第一部分,而不是我发送到placeApi接口的部分:

Gson gson = new GsonBuilder().disableHtmlEscaping().create();

创建RestAdapter时添加了这个:

RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(url).setRequestInterceptor(requestInterceptor).setConverter(new GsonConverter(gson)).setConverter(new GsonConverter(gson)).build();

请问有人能帮忙吗?

1个回答

7
您需要使用@EncodedPath。像这样:
public interface placeApi {
@GET("/{id}")
public void getFeed(@EncodedPath("id") TypedString id,
   Callback<PlaceModel> response);
}

注意:上述代码可以工作,但是现在我正在查看文档,发现@EncodedPath已经被弃用了,所以请改用带参数的@PATH:

public interface placeApi {
@GET("/{id}")
public void getFeed(@Path("id", encode=false) TypedString id,
   Callback<PlaceModel> response);
}

参考: https://square.github.io/retrofit/2.x/retrofit/

Retrofit 是一个适用于 Android、Java 和 Kotlin 的类型安全的 HTTP 客户端。它基于 OkHttp,可使网络通信变得简单和快速。您可以使用 Retrofit 来发送请求,并将响应转换为您期望的任何类型。此外,Retrofit 还支持异步请求和反应流。

它已经被弃用了,请参考这个答案 - alierdogan7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接