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);
HttpClientのデフォルトの動作は、HTTP仕様(RFC 2616)の要件に準拠しています。
10.3.3 302 Found ... GETまたはHEAD以外の要求 に応答して302ステータスコードを受信した場合、ユーザーエージェントは、ユーザーが確認できない限り、 リクエストを自動的にリダイレクトしてはなりません。リクエストが発行された条件を変更する可能性があるためです。
DefaultRedirectStrategyをサブクラス化し、その#isRedirected()メソッドをオーバーライドすることにより、HttpClientのデフォルトの動作をオーバーライドできます。
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;
}
});
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();
おかげでグエン
私のソリューションは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);