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:
- type " http://foobar.com/ "
- Hit enter
- it becomes " http://foobar2.com/abc=123 "
Now the question is how do I get the value "abc = 123" from the revised answer. Thanks heaps!
source to share
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) {
}
});
source to share
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
fromonResponse()
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; } } } }
source to share
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*/)))
source to share
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.
source to share