1. ホーム
  2. ジャワ

java httpclientを使用したエラー org.apache.http.client.ClientProtocolException

2022-02-26 23:04:49

以下は、httpclient を使って書いたメソッドです。

public static void GetFromServer(String url)

{ <未定義

<スパン HttpClient client = new DefaultHttpClient()。



HttpGet get = new HttpGet(url)。



トライ { <未定義



HttpResponse response = client.execute(get)。



HttpEntity entity = response.getEntity()。



retStr = EntityUtils.toString(entity)。



} catch (ClientProtocolException e) {. <未定義



// TODO 自動生成されたキャッチブロック



e.printStackTrace()を実行します。



System.out.println(url)を実行します。



return ""。



} catch (IOException e) {. <未定義



// TODO 自動生成されたキャッチブロック



e.printStackTrace()を実行します。











<スパン return ""。



}



return retStr;



}

urlが通常のパスの場合、このコードは問題なく、retStrは正しいurlの戻り値を取得します。しかし、urlがプロキシ経由でアクセスされたり、登録を通してアクセスされる必要がある場合、例えばurlは、retStrの戻り値を取得します。



http://list.tmall.com/search_product.htm?spm=a220m.1000858.0.0.pCYtHr&cat=51260020&s=119&sort=s&style=g&search _condition=48&from=sn_1_cat&active=1&new=1&shopType=any&industryCatId=51260020&type=pc#J_Filter



上記のurlをパラメータとして使用すると、以下のエラーが発生します。

org.apache.http.client.ClientProtocolException

at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:909)



at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)



<スパン . . . . . 

<スパン . . . . . 



原因: org.apache.http.HttpException: Unable to establish route: planned = {s}->https://pass.tmall.com; current = {s}->https://login .taobao.com



at org.apache.http.impl.client.DefaultRequestDirector.announceRoute(DefaultRequestDirector.java:842)



at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:645)



at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:480)



<スパン at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)

回避策 ClientConnectionManager を httpclient に追加します。

public static void GetFromServer(String url)

{ <未定義

<スパン ClientConnectionManager connManager = new PoolingClientConnectionManager()。



DefaultHttpClient client = new DefaultHttpClient(connManager).DefaultHttpClient = new DefaultHttpClient(connManager);



<スパン <スパン HttpGet get = new HttpGet(url)。



<スパン トライ { <未定義



<スパン HttpResponse response = client.execute(get)。



<スパン HttpEntity entity = response.getEntity()。



<スパン retStr = EntityUtils.toString(entity)。



<スパン } catch (ClientProtocolException e) {. <未定義



<スパン // TODO 自動生成されたキャッチブロック



<スパン e.printStackTrace()を実行します。



<スパン System.out.println(url)。



<スパン return ""。



<スパン } catch (IOException e) {. <未定義



<スパン // TODO 自動生成されたキャッチブロック



<スパン e.printStackTrace()を実行します。











<スパン return ""。



<スパン }



<スパン retStrを返します。



<スパン }