Приветствую. Раньше писал на пыхе, CURL, но нужна нормальная многопоточность и пересел на яву. Пробовал стандартную HttpURLConnection, но она муторная, запросы сложно отправлять. Написал либу для работы с этим классом, но некоторые запросы, какие нормально выполнялись курлом, она не выполняет. HttpClient от апача так вообще громоздкая хрень, с извращенной протеворечаей друг другу документацией. Может кто поделится своими наработками.
На основе Appache переделка "а-ля Indy" Работал мало, могут быть баги. Если найдешь - отпишись пожалуйста HTTP.java Code: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.xophet.http; /** * * @author xophet */ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.ResponseHandler; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.params.ClientPNames; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.params.CoreProtocolPNames; import org.apache.http.params.HttpParams; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.ExecutionContext; import org.apache.http.util.EntityUtils; public class HTTP { ResponseHandler<String> responseHandler = new BasicResponseHandler(); DefaultHttpClient http = new DefaultHttpClient(); BasicHttpContext localContext = new BasicHttpContext(); HttpPost post; HttpGet get; String lastRedirect=""; public HTTP(){ HttpParams params = new BasicHttpParams(); params.setBooleanParameter(ClientPNames.HANDLE_REDIRECTS,true); params.setIntParameter(ClientPNames.MAX_REDIRECTS,15); params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,10000); params.setParameter(CoreProtocolPNames.USER_AGENT, "default user agent"); http.setParams(params); } public void setHandleRedirects(Boolean handle){ HttpParams params = http.getParams(); params.setBooleanParameter(ClientPNames.HANDLE_REDIRECTS,handle); } public Boolean getHandleRedirects(){ HttpParams params = http.getParams(); return params.getBooleanParameter(ClientPNames.HANDLE_REDIRECTS, true); } public void setMaxRedirects(int maxRedirects){ HttpParams params = http.getParams(); params.setIntParameter(ClientPNames.MAX_REDIRECTS,maxRedirects); } public int getMaxRedirects(){ HttpParams params = http.getParams(); return params.getIntParameter(ClientPNames.MAX_REDIRECTS, 15); } public void setReadTimeout(int timeOut){ HttpParams params = http.getParams(); params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT,timeOut); } public int getReadTimeout(){ HttpParams params = http.getParams(); return params.getIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); } public void setConnectionTimeout(int timeOut){ HttpParams params = http.getParams(); params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,timeOut); } public int getConnectionTimeout(){ HttpParams params = http.getParams(); return params.getIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); } public void setUserAgent(String userAgent){ HttpParams params = http.getParams(); params.setParameter(CoreProtocolPNames.USER_AGENT,userAgent); } public String getUserAgent(){ HttpParams params = http.getParams(); return (String) params.getParameter(CoreProtocolPNames.USER_AGENT); } public String get(String link) throws HttpException{ get = new HttpGet(link); return this.executeAction(get, link); } public String post(String link, MultipartEntity data) throws HttpException{ post = new HttpPost(link); post.setEntity(data); return this.executeAction(post, link); } public String post(String link, List <NameValuePair> data) throws HttpException{ post = new HttpPost(link); try { post.setEntity(new UrlEncodedFormEntity(data)); } catch (UnsupportedEncodingException ex) { Logger.getLogger(HTTP.class.getName()).log(Level.SEVERE, null, ex); } return this.executeAction(post, link); } public byte[] getToByteArray(String link) throws HttpException{ get = new HttpGet(link); return this.executeActionToByteArray(get, link); } public byte[] postToByteArray(String link, MultipartEntity data) throws HttpException{ post = new HttpPost(link); post.setEntity(data); return this.executeActionToByteArray(post, link); } public byte[] postToByteArray(String link, List <NameValuePair> data) throws HttpException{ post = new HttpPost(link); try { post.setEntity(new UrlEncodedFormEntity(data)); } catch (UnsupportedEncodingException ex) { Logger.getLogger(HTTP.class.getName()).log(Level.SEVERE, null, ex); } return this.executeActionToByteArray(post, link); } /** * Здесь всегда будет храниться последний редирект * в случае, если редиректа не было, то последний URI */ public String getLastRedirect(){ return this.lastRedirect; } String executeAction(final HttpRequestBase action, final String link) throws HttpException{ String res=""; String Error=""; HttpResponse response = null; try { response = http.execute(action, localContext); } catch (ClientProtocolException ex) { Logger.getLogger(HTTP.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(HTTP.class.getName()).log(Level.SEVERE, null, ex); } try { try { // если в ответе хоть что-то есть (может не быть, если превышено максимальное число редиректов, etc) // то преобразуем ответ в строку if (response != null) res=responseHandler.handleResponse(response); } catch (ClientProtocolException ex) { //если возникнет ошибка преобразования, то генериуем исключение //с кодом завершения последней HTTP-операции (200,301 etc) throw new HttpException(response.getStatusLine().getReasonPhrase(),response.getStatusLine().getStatusCode()); } catch (IOException ex1) { Logger.getLogger(HTTP.class.getName()).log(Level.SEVERE, null, ex1); } } finally { //при любом завершении операции сохраним последний редирект Header head = ((HttpResponse) localContext.getAttribute(ExecutionContext.HTTP_RESPONSE)).getFirstHeader("Location"); lastRedirect = head==null? "": head.getValue(); } return res; } byte[] executeActionToByteArray(final HttpRequestBase action, final String link) throws HttpException{ HttpResponse response = null; byte[] result = new byte[0]; ResponseHandler<byte[]> a2 = new ResponseHandler<byte[]>() { @Override public byte[] handleResponse(HttpResponse response) throws ClientProtocolException, IOException { StatusLine statusLine = response.getStatusLine(); HttpEntity entity = response.getEntity(); if (statusLine.getStatusCode() >= 300) { EntityUtils.consume(entity); throw new HttpException(statusLine.getReasonPhrase(),statusLine.getStatusCode()); } return entity == null ? new byte[0] : EntityUtils.toByteArray(entity); } }; try { response = http.execute(action, localContext); } catch (ClientProtocolException ex) { Logger.getLogger(HTTP.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(HTTP.class.getName()).log(Level.SEVERE, null, ex); } try { try { // если в ответе хоть что-то есть (может не быть, если превышено максимальное число редиректов, etc) // то преобразуем ответ в строку result = a2.handleResponse(response); } catch (ClientProtocolException ex) { //если возникнет ошибка преобразования, то генериуем исключение //с кодом завершения последней HTTP-операции (200,301 etc) throw new HttpException(response.getStatusLine().getReasonPhrase(),response.getStatusLine().getStatusCode()); } catch (IOException ex) { Logger.getLogger(HTTP.class.getName()).log(Level.SEVERE, null, ex); } } finally { //при любом завершении операции сохраним последний редирект Header head = ((HttpResponse) localContext.getAttribute(ExecutionContext.HTTP_RESPONSE)).getFirstHeader("Location"); lastRedirect = head==null? "": head.getValue(); } return result; } public static void main(String[] args) { // TODO code application logic here HTTP http = new HTTP(); http.setHandleRedirects(false); // http.setMaxRedirects(15); try { System.out.println(http.get("https://www.google.com.ua")); } catch (HttpException ex) { System.out.println(ex.getErrorCode()); Logger.getLogger(HTTP.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("Final redirect: " + http.getLastRedirect()); } } HttpException.java Code: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.xophet.http; import org.apache.http.client.ClientProtocolException; /** * * @author XopHeT */ public class HttpException extends ClientProtocolException { int errorCode; public HttpException(String message, int errorCode){ super(message); this.errorCode=errorCode; } public HttpException(String message, String errorCode){ super(message); this.errorCode=Integer.parseInt(errorCode); } public int getErrorCode(){ return errorCode; } } InputStreamBody.java Code: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.xophet.http; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.http.entity.mime.MIME; import org.apache.http.entity.mime.content.AbstractContentBody; /** *{@inheritDoc} * @since 4.0 */ public class InputStreamBody extends AbstractContentBody { private final InputStream in; private final String filename; public InputStreamBody(final InputStream in, final String mimeType, final String filename) { super(mimeType); if (in == null) { throw new IllegalArgumentException("Input stream may not be null"); } this.in = in; this.filename = filename; } public InputStreamBody(final InputStream in, final String filename) { this(in, "application/octet-stream", filename); } public InputStream getInputStream() { return this.in; } /** * @deprecated use {@link #writeTo(OutputStream)} */ @Deprecated public void writeTo(final OutputStream out, int mode) throws IOException { writeTo(out); } public void writeTo(final OutputStream out) throws IOException { if (out == null) { throw new IllegalArgumentException("Output stream may not be null"); } try { byte[] tmp = new byte[4096]; int l; while ((l = this.in.read(tmp)) != -1) { out.write(tmp, 0, l); } out.flush(); } finally { this.in.close(); } } public String getTransferEncoding() { return MIME.ENC_BINARY; } public String getCharset() { return null; } @Override public long getContentLength() { long s=-1; try { s=in.available(); } catch (IOException ex) { } return s; } public String getFilename() { return this.filename; } }