我使用Retrofit for REST web services我的android项目。它整体工作正常,直到我试图从返回URL读取几个参数。 对于网络浏览器上的exapmle:
现在的问题是我如何得到这个" abc = 123"来自改造响应的价值。 谢谢你!
答案 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());