2017-11-16 11 views
0

私はRetrofit 2.3.0を使用してOAI-PMHエンドポイントと対話します。スラッシュなしで改造防止機能の "baseUrlは/で終わらなければなりません"

:意図したとおりに

http://www.relacionesinternacionales.info/ojs/oai.html?verb=Identify作品を

私は今、そのベースURLがスラッシュかで終わるかどうかについての好き嫌いであるエンドポイントと対話するために起こります。スラッシュで

http://www.relacionesinternacionales.info/ojs/oai.html/?verb=Identifyは404ページへのリダイレクトが発生します。

今、問題は、Retrofit 2.3.0がベースURLにスラッシュで終わるよう要求することです。

Retrofitビルダーにno-ending-slashベースURLを指定すると、Retrofitがエラーになります。

Retrofit Builderにend-with-a-slashベースURLを指定すると、Retrofitは不正なURLを作成し、404エラーを引き起こします。

この制限を回避するにはどうすればよいですか?

答えて

0

回避策として、RetrofitオブジェクトのbaseUrlフィールドを操作するために、Java Reflectionを使用します。

まず、baseUrlがスラッシュで終わっているかどうかをチェックします。もしそうなら、特別なことは起こらない。

設けbaseUrlはその後、このbaseUrlにオブジェクトが元のbaseUrlに非スラッシュ終わりに置き換えられ、第retrofitオブジェクトがbaseUrlにスラッシュを使用して作成され、スラッシュで終わっていない場合には:

String baseUrl = "..."; // can end with slash or not 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(baseUrl.endsWith("/") ? baseUrl : baseUrl + "/") 
     .addConverterFactory(ScalarsConverterFactory.create()) 
     .build(); 

// workaround for https://stackoverflow.com/q/47331753/923560 
if (! baseUrl.endsWith("/")) { 
    try { 
     Field baseUrlField = retrofit.getClass().getDeclaredField("baseUrl"); 
     baseUrlField.setAccessible(true); 
     HttpUrl newHttpUrl = HttpUrl.parse(baseUrl); 
     baseUrlField.set(retrofit, newHttpUrl); 
     baseUrlField.setAccessible(false); 
    } 
    catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { 
     LOG.error("Exception while manipulating baseUrl=" + baseUrl + " to not end with a slash", e); 
     throw new RuntimeException(e); 
    } 
} 

service = retrofit.create(OaiPmhService.class); 
// ... 
関連する問題