How do I get the response URL from Retrofit?

I am using Retrofit for REST web services for my android project. It works great in general until I try to read multiple parameters from the return URL. For exapmle in a web browser:

Now the question is how do I get the value "abc = 123" from the revised answer. Thanks heaps!

+3


source to share


5 answers


I solved the problem. Here is my solution:

Define a request

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

      



and send

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) {

    }
});

      

+8


source


Below is my path: (using retrofit2

)



  • First: create an instance 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;
    
    }
    }
    
          

  • Add Interceptor

    toretrofit

    Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    retrofit.client().interceptors().add(new LoggingInterceptor());
    
          

  • Get url

    from onResponse()

    method

    @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 ever you want with url
                    break;
                } else {
                    continue;
                }
            }
        }
    
    }
    
          

+2


source


You can try to get this data from Retrofit Callback. In your refitting service, declare a method with a 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)

      

And then process the response url in the callback

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) {
    }
});

      

Try using OkHttpClient. Add dependency to build.gradle and change 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*/)))

      

0


source


I have not tested it, but such redirects are sent via the "Location:" HTTP header.

You might be able to get the Url with the following code:

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) {

    }
}

      

One requirement is that the HTTP client does not auto-redirect, but I am not familiar with the modification.

0


source


First, create a call and print. See example below:

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

      

-1


source







All Articles