2017-03-21 110 views
1

作爲@Query註釋上面the Retrofit documentation指出:更改列表/陣列的URL格式爲[改造2]

傳遞一個列表或陣列將導致在每個 非空條目的查詢參數。


截至目前我的電話看起來是這樣的:

@GET("questions") 
Call<List<QuestionHolder>> getQuestionsExcludingTheSpecified(
     @Query("exclude_ids") long[] excludedQuestionIds 
); 

這工作,但結果相當長的URL相當快。

E.g.對於excludedQuestionIds = new long[]{1L, 4L, 16L, 64L}請求URL已經是/questions?exclude_ids=1&exclude_ids=4&exclude_ids=16&exclude_ids=64


有沒有一種簡單的方法來交換導致格式化爲exclude_ids=[1,4,16,64]或類似的東西數組這種行爲?

什麼來到我的腦海裏又是到:

  • 使用JsonArray作爲參數,但後來我需要打出電話
  • 截獲每個請求之前,每個陣列/列表轉換和壓縮重複鍵
  • 覆蓋內置@Query裝飾

任何想法?

回答

0

我決定採用攔截器的方法。我只是簡單地更改任何包含單個查詢參數的多個值的傳出請求。

public class QueryParameterCompressionInterceptor implements Interceptor { 

    @Override 
    public Response intercept(Interceptor.Chain chain) throws IOException { 
     Request request = chain.request(); 

     HttpUrl url = request.url(); 
     for (String parameterName : url.queryParameterNames()) { 
      List<String> queryParameterValues = url.queryParameterValues(parameterName); 

      if (queryParameterValues.size() > 1) { 
       String formattedValues= "[" + TextUtils.join(",", queryParameterValues) + "]"; 

       request = request.newBuilder() 
         .url(
           url.newBuilder() 
             .removeAllQueryParameters(parameterName) 
             .addQueryParameter(parameterName, formattedValues) 
             .build() 
         ).build(); 
      } 
     } 

     return chain.proceed(request); 
    } 

非Android解決方案

文本實用程序是Android SDK的一部分,如果你不開發Android您可能會爲這樣的方式來交換TextUtils.join:

public static String concatListOfStrings(String separator, Iterable<String> strings) { 
     StringBuilder sb = new StringBuilder(); 

     for (String str : strings) { 
      sb.append(separator).append(str); 
     } 

     sb.delete(0, separator.length()); 

     return sb.toString(); 
    } 
} 

您也可以看看this SO question瞭解有關串聯更多的解決方案。