2017-07-16 5 views
0

erhalte ich eine URL von dem Server mit den Parametern wie folgt aus:Retrofit baseUrl mit Parametern

http://example/?p1=a&p2=b 

dem der Server-Adresse wird sein ich Anfrage senden.

Wenn ich den folgenden Code verwenden, um eine neue Nachrüstung vorzunehmen.

retrofit.newBuilder().baseUrl(url).build(); 

In der Interceptor:

Request oldRequest = chain.request(); 
Logger.e("url:" + oldRequest.url()); 

Im Log:

url:http://example/ 

Aber ich will die baseUrl wie machen:

http://example/?p1=a&p2=b 

NICHT:

http://example/ 

So gibt es einige Möglichkeiten, um die baseUrl mit Parametern zu machen?

Antwort

0

Versuchen Sie Folgendes, hier ist Ihre Generator-Klasse, die so aussehen kann.

public class ServiceGenerator { 
    public static String apiBaseUrl = "http://example/"; 
    private static Retrofit retrofit; 

    private static Retrofit.Builder builder = 
      new Retrofit.Builder() 
        .addConverterFactory(GsonConverterFactory.create()) 
        .baseUrl(apiBaseUrl); 

    private static OkHttpClient.Builder httpClient = 
      new OkHttpClient.Builder(); 

    // No need to instantiate this class. 
    private ServiceGenerator() { 
    } 

    public static void changeApiBaseUrl(String newApiBaseUrl) { 
     apiBaseUrl = newApiBaseUrl; 

     builder = new Retrofit.Builder() 
         .addConverterFactory(GsonConverterFactory.create()) 
         .baseUrl(apiBaseUrl); 
    } 

    public static <S> S createService(Class<S> serviceClass, AccessToken token) { 
     String authToken = token.getTokenType().concat(token.getAccessToken()); 
     return createService(serviceClass, authToken); 
    } 

    // more methods 
    // ... 
} 

Danach können Sie es in folgender Weise in Ihrer Tätigkeit nutzen können oder Fragmen

public class DynamicBaseUrlActivity extends AppCompatActivity { 

    public static final String TAG = "CallInstances"; 
    private Callback<ResponseBody> downloadCallback; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_file_upload); 

     downloadCallback = new Callback<ResponseBody>() { 
      @Override 
      public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
       Log.d(TAG, "server contacted at: " + call.request().url()); 
      } 

      @Override 
      public void onFailure(Call<ResponseBody> call, Throwable t) { 
       Log.d(TAG, "call failed against the url: " + call.request().url()); 
      } 
     }; 

     // first request 
     FileDownloadService downloadService = ServiceGenerator.create(FileDownloadService.class); 
     Call<ResponseBody> originalCall = downloadService.downloadFileWithFixedUrl(); 
     originalCall.enqueue(downloadCallback); 

     // change base url 
     ServiceGenerator.changeApiBaseUrl("http://example/?p1=a&p2=b"); 

     // new request against new base url 
     FileDownloadService newDownloadService = ServiceGenerator.create(FileDownloadService.class); 
     Call<ResponseBody> newCall = newDownloadService.downloadFileWithFixedUrl(); 
     newCall.enqueue(downloadCallback); 
    } 
} 

Für weitere Informationen überprüfen this

+0

es gewann‘ t Arbeit, die Methode ** baseUrl() ** wird keine Parameter enthalten, sie kann baseUrl ändern, hat aber immer noch Parameter in der URL in y verloren unser Weg.Alles, was ich will, ist that wenn senden Anfrage, verlieren Sie keine Parameter in der URL. – ChengTao

+0

Ich habe meine Antwort bearbeitet, ein wichtiger Teil fehlte. –

+0

Ich habe den Link gesehen, es funktioniert nicht. – ChengTao

0

Sie benötigen HttpUrl

HttpUrl url = new HttpUrl.Builder() 
        .scheme("https") 
        .host("www.google.com") 
        .addPathSegment("search") 
        .addQueryParameter("q", "polar bears") 
        .build(); 

retrofit = new Retrofit.Builder() 
       .baseUrl(url) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(httpClient) 
       .build();