web-dev-qa-db-ja.com

HttpClientリダイレクトの処理

302 Moved Temporarilyに応答しているサーバーにデータをPOSTしています。

私はそれがHttpClientのデフォルトの動作だと信じているので、HttpClientにリダイレクトに従い、新しい場所を自動的にGETするようにします。しかし、私は例外を受け取っており、リダイレクトに従っていません:(

関連するコードは次のとおりです。どんなアイデアでも歓迎します。

HttpParams httpParams = new BasicHttpParams();
HttpClientParams.setRedirecting(httpParams, true);
SchemeRegistry schemeRegistry = registerFactories();
ClientConnectionManager clientConnectionManager = new ThreadSafeClientConnManager(httpParams, schemeRegistry);

HttpClient httpClient = new DefaultHttpClient(clientConnectionManager, httpParams)
HttpPost postRequest = new HttpPost(url);
postRequest.setHeader(HTTP.CONTENT_TYPE, contentType);
postRequest.setHeader(ACCEPT, contentType);

if (requestBodyString != null) {
    postRequest.setEntity(new StringEntity(requestBodyString));
}

return httpClient.execute(postRequest, responseHandler);
39
mgv

HttpClientのデフォルトの動作は、HTTP仕様(RFC 2616)の要件に準拠しています。

 10.3.3 302 Found 
 ... 
 
 GETまたはHEAD以外の要求
に応答して302ステータスコードを受信した場合、ユーザーエージェントは、ユーザーが確認できない限り、
リクエストを自動的にリダイレクトしてはなりません。リクエストが発行された条件を変更する可能性があるためです。
 

DefaultRedirectStrategyをサブクラス化し、その#isRedirected()メソッドをオーバーライドすることにより、HttpClientのデフォルトの動作をオーバーライドできます。

37
ok2c

HttpClientの場合4.

HttpClient instance = HttpClientBuilder.create()
                     .setRedirectStrategy(new LaxRedirectStrategy()).build();

HttpClientの場合4.2

DefaultHttpClient client = new DefaultHttpClient();
client.setRedirectStrategy(new LaxRedirectStrategy());

HttpClientの場合<4.2

DefaultHttpClient client = new DefaultHttpClient();
client.setRedirectStrategy(new DefaultRedirectStrategy() {
    /** Redirectable methods. */
    private String[] REDIRECT_METHODS = new String[] { 
        HttpGet.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOD_NAME 
    };

    @Override
    protected boolean isRedirectable(String method) {
        for (String m : REDIRECT_METHODS) {
            if (m.equalsIgnoreCase(method)) {
                return true;
            }
        }
        return false;
    }
});
77
RTF

HTTPリダイレクトはデフォルトで無効になっているようです。有効にしようとしましたが、動作しますが、まだ問題にエラーがあります。しかし、リダイレクトを実際に処理することはできます。あなたの問題は解決できると思う:だから古いコード:

AndroidHttpClient httpClient = AndroidHttpClient.newInstance("User-Agent");
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
long contentSize = httpResponse.getEntity().getContentLength();

Httpリダイレクトが発生した場合、このコードはcontentSize = -1を返します

そして、デフォルトのフォローリダイレクトを有効にしようとした後、自分でリダイレクトを処理します

AndroidHttpClient client;
HttpGet httpGet;
HttpResponse response;
HttpHeader httpHeader;
private void handleHTTPRedirect(String url) throws IOException {
    if (client != null)
        client.close();

    client = AndroidHttpClient.newInstance("User-Agent");
    httpGet = new HttpGet(Network.encodeUrl(url));
    response = client.execute(httpGet);
    httpHeader = response.getHeaders("Location");
    while (httpHeader.length > 0) {
        client.close();
        client = AndroidHttpClient.newInstance("User-Agent");

        httpGet = new HttpGet(Network.encodeUrl(httpHeader[0].getValue()));
        response = client.execute(httpGet);
        httpHeader = response.getHeaders("Location");
    }
}

使用中で

handleHTTPRedirect(url);
long contentSize = httpResponse.getEntity().getContentLength();

おかげでグエン

1
khaintt

私のソリューションはHttpClientを使用しています。呼び出し元に応答を返さなければなりませんでした。これは私の解決策です

    CloseableHttpClient httpClient = HttpClients.custom()
            .setRedirectStrategy(new LaxRedirectStrategy())
            .build();

    //this reads the input stream from POST
    ServletInputStream str = request.getInputStream();

    HttpPost httpPost = new HttpPost(path);
    HttpEntity postParams = new InputStreamEntity(str);
    httpPost.setEntity(postParams);

    HttpResponse httpResponse = null ;
    int responseCode = -1 ;
    StringBuffer response  = new StringBuffer();

    try {

        httpResponse = httpClient.execute(httpPost);

        responseCode = httpResponse.getStatusLine().getStatusCode();
        logger.info("POST Response Status::  {} for file {}  ", responseCode, request.getQueryString());

        //return httpResponse ;
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                httpResponse.getEntity().getContent()));

        String inputLine;
        while ((inputLine = reader.readLine()) != null) {
            response.append(inputLine);
        }
        reader.close();

        logger.info(" Final Complete Response {}  " + response.toString());
        httpClient.close();

    } catch (Exception e) {

        logger.error("Exception ", e);

    } finally {

        IOUtils.closeQuietly(httpClient);

    }

    // Return the response back to caller
    return  new ResponseEntity<String>(response.toString(), HttpStatus.ACCEPTED);
0
vsingh