0

最初に基本認証が必要な Web サイトにアクセスしてから、パラメーター (検索キーワード) をホームページに投稿したいと考えています。

私のコードは基本認証を通過でき、応答テキストを取得できますが、検索結果を取得できず、代わりにホームページ コードを取得します。

そのため、私は parameters.size() を出力し、0 を返すので、HttpClient リダイレクト メソッドが基本認証後にパラメーターを渡さないとは思えません。

検索結果を取得しようとしている私のコードに従ってください:

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("search_keyword", "test"));
params.add(new BasicNameValuePair("search_size", "50"));

DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.setRedirectStrategy(new DefaultRedirectStrategy() {                
    public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException  {
        boolean isRedirect=false;
        try {
            isRedirect = super.isRedirected(request, response, context);
        } catch (ProtocolException e) {
            throw e;
        }
        if (!isRedirect) {
            int responseCode = response.getStatusLine().getStatusCode();
            if (responseCode == 301 || responseCode == 302) {
                return true;
            }
        }
        return isRedirect;
    }
});

String encoding = Base64Encoder.encode("admin:password");   
HttpPost httppost = new HttpPost("http://127.0.0.1/MySystem/home");
httppost.setHeader("Authorization", "Basic " + encoding);   
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

//Execute and get the response.
HttpResponse response = httpclient.execute(httppost);
int responseCode = response.getStatusLine().getStatusCode();

switch(responseCode) {
    case HttpURLConnection.HTTP_OK:
        HttpEntity entity = response.getEntity();
        List<NameValuePair> parameters = new ArrayList<NameValuePair>(URLEncodedUtils.parse(entity));
        System.out.println("parameters size: "+parameters.size());
        for(NameValuePair p:parameters)
            System.out.println("parameter: "+ p.getName() + p.getValue());
        if(entity != null) {
            responseText = EntityUtils.toString(entity);
            System.out.println("responseText: ");
            System.out.println(responseText);
        }
        break;
    default:
        throw new Exception("Failed to pass the basic authorization. Response code: "+responseCode);
}

更新しました:

次の条件は true を返します。

if (responseCode == 301 || responseCode == 302) {
   return true;
}
4

1 に答える 1

0

わかりました、回避策を見つけました。基本的に、302 で別のページにリダイレクトされますが、基本的な認証セッションは現在の .xml で渡されhttpclientます。

case HttpURLConnection.HTTP_OK: 解決策は、「接続がまだ割り当てられている」という例外を防ぐために、httpclient を再利用し、エンティティ バッファリーダーを閉じることです。

サンプルコードは次のとおりです。

String line;
BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
    sb.append(line);
}

br.close();
responseText = sb.toString();
....

HttpPost httppost2 = new HttpPost("http://127.0.0.1/MySystem/home");
httppost2.setHeader("Authorization", "Basic " + encoding);
httppost2.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
HttpResponse response2 = httpclient.execute(httppost2);
HttpEntity entity2 = response2.getEntity();
于 2013-11-14T08:02:37.393 に答える