2015-07-28 2 views
2

Я использую Retrofit для веб-сервисов REST моего проекта андроида. Он отлично работает в целом до тех пор, пока я не попытаюсь прочитать несколько параметров из обратного URL. Для exapmle на веб-браузере:Как получить URL-адрес ответа от «Дооснащения»?

  1. типа «http://foobar.com/»
  2. Хит введите
  3. становится «http://foobar2.com/abc=123»

Теперь вопрос, как я понимаю, что «ABC = 123 «ценность от доработанного ответа. Спасибо, кучи!

ответ

0

Вы можете попытаться найти эти данные из раздела «Обратный звонок». В своей службе по восстановлению объявите метод с обратным вызовом.

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) 

А затем обрабатывать 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*/))) 
+0

Привет, getUrl() возвращает исходный URL-адрес, а не тот, на который перенаправляется. – WenChao

+0

@WenChao попробовал мое последнее издание –

0

Я не проверял это, но такие редиректы посылаются через HTTP-заголовка «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 не следует перенаправлять автоматически, но я не знаком с дооснащения.

+0

Привет, я проследил сетевую активность в браузере, первый ответ был 302, и модификация не смогла его поймать по какой-то причине, возможно, я просто буду ждать будущих обновлений. Спасибо, в любом случае. – WenChao

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; 
          } 
         } 
        } 
    
    } 
    
6

Я имею решить problem.Here мое решение:

Определить запрос

@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

Сначала создайте вызов, затем распечатайте.См. Пример ниже:

ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); 
Call<LoginResponse> call = apiService.getLoginData(phone_number.getText().toString()); 
Log.e(" Login url", call.request().url().toString()); 
Смежные вопросы