7

Javaを使用して次のcurlコマンドを再現しようとしています。

curl -v -u user:pass http://myapp.com/api

このコマンドは、いくつかのJSONデータを返します。

私のバグのあるJavaの実装は次のとおりです。

@Test
public void callTest() {
    RestTemplate restTemplate = createRestTemplate("user", "pass");
    URI uri = new URI("http://myapp.com/api");
    String res = restTemplate.getForObject(uri, String.class);
}

private static RestTemplate createRestTemplate(String username, String password) {

    UsernamePasswordCredentials cred = new UsernamePasswordCredentials(username, password);
    BasicCredentialsProvider cp = new BasicCredentialsProvider();
    cp.setCredentials(AuthScope.ANY, cred);
    DefaultHttpClient client = new DefaultHttpClient();
    client.setCredentialsProvider(cp);
    ClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(client);

    RestTemplate restTemplate = new RestTemplate(factory);
    // set the media types properly
    return restTemplate;
}

それでも、テストを実行すると、org.springframework.web.client.HttpClientErrorException: 401 Unauthorized例外が返されます。

ログインするとDEBUG、認証に関する情報が表示されません...

認証クレデンシャルを設定しているときに何が間違っていますか?

4

4 に答える 4

13

を使用してインスタンス化する

HttpClient client = new HttpClient();

はもう存在せず、クラスDefaultHttpClientバージョン 4.3からHttpComponents HttpClientから廃止されました。したがって、他の回答は無効または非推奨です。これが私のバージョンです。基本認証を必要とする残りのリクエスト用にこのクラスを作成しました。

import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClients;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

public class RestClient extends RestTemplate {
    public RestClient(String username, String password) {
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(
                new AuthScope(null, -1),
                new UsernamePasswordCredentials(username, password));
        HttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
        setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
    }
}

次に、たとえば次のように使用します。

RestClient restClient = new RestClient("username", "password");

String result = restClient.postForObject(...
于 2013-12-08T00:22:55.127 に答える
1

この回答は @kevinpeterson による回答に基づいていますが、更新された Apache HTTP クライアントを使用するように書き直されています。

RestTemplate createRestTemplate(String username, String password, String host, int port ) {
    return new RestTemplate(this.createSecureTransport( username, password, host, port ));
}

ClientHttpRequestFactory createSecureTransport( String username, String password, String host, int port ){
    DefaultHttpClient client = new DefaultHttpClient();
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials( username, password );
    client.getCredentialsProvider().setCredentials( new AuthScope( host, port ), credentials );
    return new HttpComponentsClientHttpRequestFactory(client);
于 2013-08-24T15:25:35.027 に答える
1

私はこのようなことをします-そしてそれは私にとってうまくいきました:

private RestTemplate createRestTemplate(String username, String password) {
    return new RestTemplate(this.createSecureTransport(username, password));
}

protected ClientHttpRequestFactory createSecureTransport(String username, String password){
    HttpClient client = new HttpClient();
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username,password);
    client.getState().setCredentials(AuthScope.ANY, credentials);
    CommonsClientHttpRequestFactory commons = new CommonsClientHttpRequestFactory(client);

    return commons;
}

ここで使用されます:参照コード

于 2013-01-18T12:46:41.967 に答える
1

httpclient v4.0 はプリエンプティブ認証をサポートしていません

これを見てください: http://forum.springsource.org/showthread.php?123385-Preemptive-Basic-Authentication-with-RestTemplate

春にソースはこの解決策を見つけました。

わたしにはできる。

これを見てください:Spring 3.1の基本認証を使用したRestTemplate

于 2013-03-25T22:24:40.787 に答える