如何从Retrofit获取响应URL?

时间:2015-07-28 04:12:19

标签: android retrofit

我使用Retrofit for REST web services我的android项目。它整体工作正常,直到我试图从返回URL读取几个参数。 对于网络浏览器上的exapmle:

  1. 输入" http://foobar.com/"
  2. 点击进入
  3. 它变为" http://foobar2.com/abc=123"
  4. 现在的问题是我如何得到这个" abc = 123"来自改造响应的价值。 谢谢你!

6 个答案:

答案 0 :(得分:13)

我已经解决了这个问题。这是我的解决方案:

定义请求

@GET 
Call<String> getSend(@Url String url);

并发送

Api.get(WXApi.class).getSend(ip).enqueue(new Callback<String>() {

    @Override
    public void onResponse(Call<String> call, Response<String> response) {

        Log.d(TAG,"response.raw().request().url();"+response.raw().request().url());}

    @Override
    public void onFailure(Call<String> call, Throwable t) {

    }
});

答案 1 :(得分:2)

以下是我的方式:(使用retrofit2

  • 首先:创建Interceptor的实例:

    public class LoggingInterceptor implements Interceptor {
    
    private String requestUrl;
    
    public String getRequestUrl() {
        return requestUrl;
    }
    
    public void setRequestUrl(String requestUrl) {
        this.requestUrl = requestUrl;
    }
    
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        setRequestUrl(response.request().url().toString());
        return response;
    
    }
    }
    
  • Interceptor添加到retrofit

    Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    retrofit.client().interceptors().add(new LoggingInterceptor());
    
  • url方法获取onResponse()

    @Override
    public void onResponse(Response<T> response, Retrofit retrofit) {
        List<Interceptor> data = retrofit.client().interceptors();
        if (data != null && data.size() > 0) {
            for (int i = 0; i < data.size(); i++) {
                if (data.get(i) instanceof LoggingInterceptor) {
                    LoggingInterceptor intercept = (LoggingInterceptor) data.get(i);
                    String url = intercept.getRequestUrl();
                    // todo : do what's ever you want with url
                    break;
                } else {
                    continue;
                }
            }
        }
    
    }
    

答案 2 :(得分:0)

您可以尝试从Retrofit Callback获取此数据。 在您的Retrofit Service声明方法中使用Callback。

public interface YourService {
  @GET("/url")
  JsonElement get(Callback<JsonElement> cb);
}

RestAdapter adapter = new RestAdapter.Builder().setEndpoint("http://foobar.com").build();
YourService service = adapter.create(YourService.class)

然后在Callback中处理响应url

service.createUser(new Callback<JsonElement>() {
    @Override
    public void success(JsonElement jsonElement, retrofit.client.Response response) {
        String url = response.getUrl();
        // handle url
    }
    @Override
    public void failure(RetrofitError error) {
    }
});

尝试使用OkHttpClient。在build.gradle中添加依赖项并修改RestAdapter

compile 'com.squareup.okhttp:okhttp:2.0.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'

RestAdapter restAdapter = new RestAdapter.Builder()
   ...

   .setClient(new OkClient(new OkHttpClient().setFollowSslRedirects(false /* or try true*/)))

答案 3 :(得分:0)

没有测试,但是这些重定向是通过HTTP-Header“Location:”发送的。

您可以使用以下代码检索Url:

Callback<Void> cb = new Callback<Void>() {
    @Override
    public void success(Void aVoid, Response response) {
        String url = null;
        List<Header> headers = response.getHeaders();
        for (Header header : headers) {
            if (header.getName() == "Location") {
                url = header.getValue();
                break;
            }
        }
        // Do something with url
    }

    @Override
    public void failure(RetrofitError error) {

    }
}

一个要求是,HTTP客户端不会自动遵循重定向,但我对改造并不熟悉。

答案 4 :(得分:0)

.child>div:first-of-type { vertical-align: bottom; }

为我工作。

答案 5 :(得分:-1)

首先创建一个调用然后打印。见下面的例子:

ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<LoginResponse> call = apiService.getLoginData(phone_number.getText().toString());
Log.e(" Login url", call.request().url().toString());