2017-09-18 62 views
0

0)我正在使用Retrofit 2與Bank API一起工作。
1)我有一些接口:Retrofit 2:@Query「encoded = false」不起作用

public interface ApiService { 
    @GET("statdirectory/exchange") 
    Call<List<MyModel>> getСurrency(@Query("date") String inputDate); 
} 

2),當我調用方法getСurrency(someParametr),其中someParametr是串,由具有 「日期& JSON」(例如,「20170917 & JSON 「):

ApiService apiService = RetrofitController.getApi(); 
apiService.getCurrency("20170917&json").enqueue(new Callback<List<MyModel>>() { 

     @Override 
     public void onResponse(Call<List<MyModel>> call, Response<List<MyModel>> response) { 
      call.request().url(); 
      Log.e("URL", call.request().url()+""); 
      response.code(); 
      Log.e("CODE", response.code()+"");  
} 
//..... 

3)我看到:
網址:https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?date=20170917%26 JSON」 「404」
4)Inmy接口I添加編碼
CODE(&%26取代)

getСurrency(@Query(value="date", encoded=false) String inputDate); 

但是我的結果是相同的,如第3步

5)如何檢查這個問題?如何在我的字符串上沒有%26?我閱讀了類似問題的其他問題,但沒有解決我的問題。謝謝!

+0

替代26%到底爲什麼這是一個問題?爲什麼你有沒有價值的param'json'? –

+0

@TimCastelijns,我的完整代碼是可行的,但我不知道爲什麼我的網址_20170917&json_編碼爲_20170917%26json_以及如何修復它。 – Tomas

+0

你想解決什麼問題?你甚至知道什麼是網址編碼? –

回答

1

如這裏https://github.com/square/okhttp/issues/2623注意到swankjesse

使用HttpUrl打造的URL

HttpUrl url = HttpUrl.parse("https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?date=20170916&json"); 

然後你的方法調用更改爲

@GET 
Call<List<MyModel>> getСurrency(@Url String ur); 

然後

apiService.getCurrency(url.toString()) 
     .enqueue(new Callback<List<MyModel>>() { 

     @Override 
     public void onResponse(Call<List<MyModel>> call, retrofit2.Response<List<MyModel>> response) { 
      // your response 
     } 

     @Override 
     public void onFailure(Call<List<MyModel>> call, Throwable t) { 

     } 

    }); 

另一種方法是使用Okhttp的攔截和&

class MyInterceptor implements Interceptor { 
    @Override 
    Response intercept(Interceptor.Chain chain) throws IOException { 
    Request request = chain.request() 
    String stringurl = request.url().toString() 
    stringurl = stringurl.replace("%26", "&") 

    Request newRequest = new Request.Builder() 
     .url(stringurl) 
     .build() 

    return chain.proceed(newRequest) 
} 
} 

然後

OkHttpClient client = new OkHttpClient.Builder(); 
client.addInterceptor(new MyInterceptor()); 
+0

指出的github問題中提到的那樣工作謝謝你的回答!這對我有用!)但我有一個問題...如何使用你的第二種方式與「Okhttp的攔截器」?我在哪裏覆蓋'攔截'方法? – Tomas

+0

@Tomas檢查編輯 – Raghunandan

+0

我明白了,謝謝!) – Tomas

0

你的Json將擁有關鍵值數據。嘗試通過以下格式。 它會在Json鍵之前自動添加&

getСurrency(@Query("date") String inputDate, @Query("key1") String value1, @Query("key2") String value2);