3

基本認証をrestTemplateに追加しようとしています

私が遭遇する問題は、初期化できないことです:(コードスニペットの両方のインポートで)

HttpClient client = new HttpClient();

このコードはコンパイル エラーで解決されます (この問題を解決するための Eclipse からの提案はありません)。

1) 問題は何ですか?

2) 間違ったクラスをインポートしていますか?

私のコードスニペット:

import org.apache.http.client.HttpClient;
//OR (not together)
import sun.net.www.http.HttpClient;


HttpClient client = new HttpClient(); //this line dosent compile
UsernamePasswordCredentials credentials =
new UsernamePasswordCredentials("USERNAME","PASS");
client.getState().setCredentials(
  new AuthScope("www.example.com", 9090, AuthScope.ANY_REALM),
  credentials);
CommonsClientHttpRequestFactory commons =
     new CommonsClientHttpRequestFactory(client);

RestTemplate template = new RestTemplate(commons);
SomeObject result = template.getForObject(
     "http://www.example.com:9090/",SomeObject.class
 );

これを実行すると、例外が発生します:

> failed due to an unhandled exception: java.lang.Error: Unresolved
> compilation problems:     The constructor HttpClient() is not visible
>   The method getState() is undefined for the type HttpClient
>   CommonsClientHttpRequestFactory cannot be resolved to a type
>   CommonsClientHttpRequestFactory cannot be resolved to a type
>   SomeObject cannot be resolved to a type     The method
> getForObject(String, Class<SomeObject>, Object...) from the type
> RestTemplate refers to the missing type SomeObject    SomeObject cannot
> be resolved to a type
4

3 に答える 3

12

最終的に、次を使用して基本認証を実行する方がはるかに簡単です。

restTemplate.exchange()

そしてそうではない

restTemplate.getForObject()

私のコードスニペット:

private HttpHeaders createHeaders(final String username, final String password ){
    HttpHeaders headers =  new HttpHeaders(){
          {
             String auth = username + ":" + password;
             byte[] encodedAuth = Base64.encodeBase64(
                auth.getBytes(Charset.forName("US-ASCII")) );
             String authHeader = "Basic " + new String( encodedAuth );
             set( "Authorization", authHeader );
          }
       };
       headers.add("Content-Type", "application/xml");
       headers.add("Accept", "application/xml");

       return headers;
}


    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<MyClass> response;
    httpHeaders = this.createHeaders("user", "pass");

    String url = "www.example.com"
    response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<Object>(httpHeaders), MyClass.class);

そしてそれは動作します!

于 2013-03-18T16:07:46.477 に答える
3

Apache HttpClient を使用する場合は、単にインターフェイスDefaultHttpClientであるため、インスタンス化します。HttpClient

HttpClient httpclient = new DefaultHttpClient();

さまざまな認証スキームの使用に関するドキュメントをHttpClient こちらで参照してください。

于 2013-03-17T14:59:21.987 に答える
0

以下の方法でSpringブートで使用できます。

   @SpringBootApplication

public class Application は CommandLineRunner を実装します{

private static final Logger log = LoggerFactory.getLogger(Application.class);

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

@Override
public void run(String... args) throws Exception {
    try{
    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders = this.createHeaders();
    ResponseEntity<String> response;
    response  = restTemplate.exchange("<url>",HttpMethod.GET,new HttpEntity<Object>(httpHeaders),String.class);
    log.info(response.toString());
    }
    catch(Exception e)
    {
        System.out.println("Exception"+e);
    }


}

private HttpHeaders createHeaders(){
    HttpHeaders headers =  new HttpHeaders(){
          {            
             set( "Authorization", "3ee140");
          }
       };

       return headers;
}

}

于 2016-08-05T17:10:20.583 に答える