2017-10-06 11 views
1

ODataクライアントをApache olingoで開発しています。資格情報にはネイティブ文字が含まれており、「Authorization」ヘッダーのBase64エンコード用にUTF-8で読む必要があります。 行くための最初の方法は、標準ではOlingoによって示唆された。Apache olingo基本認証エンコーディングの問題

EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(endpointURI, ContentType.JSON); 
client.getConfiguration().setHttpClientFactory(new BasicAuthHttpClientFactory(username, password)); 

しかしOlingoは、Base64エンコーディングのためのUS-ASCII文字セットの「ユーザー名」と「パスワード」のバイトを読み込むので、それは、私のために動作しませんしませんでした、と私のユーザー名は???に変わります。 HTTPクライアントレベルでは、org.apache.http.impl.auth.BasicSchemeFactoryに文字セットを渡す方法がありますが、Olingoレベルでカスタマイズする方法はありませんでした。

私の第二の試みは、生のヘッダ追加された:

URI searchURI = client.newURIBuilder(endpointURI) 
      .appendEntitySetSegment(segment) 
      .top(10) 
      .addQueryOption(QueryOption.FORMAT, "json")   
      .build(); 
    ODataEntitySetRequest<ClientEntitySet> request = client.getRetrieveRequestFactory().getEntitySetRequest(searchURI); 
    String auth = Base64.encodeBase64String(String.format("%s:%s", username, password).getBytes(StandardCharsets.UTF_8)); 
      request.addCustomHeader("Authorization", "Basic "+ auth); 
    ODataRetrieveResponse<ClientEntitySet> response = request.execute(); 

をしかしOlingoが実際request.executeコールの下で2つのHTTPリクエストを送信し、それが表示されます。最初のデータはデータ用で、ヘッダを含んでおり、認可を渡してデータを返します。しかし、2番目の要求はAuthorizationヘッダーのないメタデータであり、401 Unauthorizedを返します。したがって、最終結果は例外です。 基本認証を追加する方法が必要です。 (Olingoが常にレスポンスオブジェクトの構築にそれを使用する場合は、可能ではない可能性があります)

答えて

1

Found解決策はありますが、Olingoの推奨方法にはまだまだ興味があります。

  EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(endpointURI, ContentType.JSON); 
      final String auth = Base64.encodeBase64String(String.format("%s:%s", username, password).getBytes(StandardCharsets.UTF_8)); 
      client.getConfiguration().setHttpClientFactory(new DefaultHttpClientFactory() { 
       @SuppressWarnings("deprecation") 
       @Override 
       public DefaultHttpClient create(HttpMethod method, URI uri) { 
        final DefaultHttpClient client = super.create(method, uri); 
        client.addRequestInterceptor(new HttpRequestInterceptor() { 
         @Override 
         public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { 
          request.addHeader("Authorization", "Basic " + auth); 
        } 
       }); 
       return client; 
      } 
     });