HttpClient é uma biblioteca de implementação de comunicação HTTP do lado do cliente. O objetivo do HttpClient é enviar e receber mensagens HTTP.
Acredito que não preciso dizer mais sobre a importância do protocolo Http Comparado com o URLConnection que vem com o JDK tradicional, o HttpClient aumentou a facilidade de uso e a flexibilidade (discutiremos as diferenças específicas no futuro). não é apenas uma forma de o cliente enviar solicitações HTTP, é fácil, mas também facilita aos desenvolvedores testar a interface (baseada no protocolo HTTP), o que melhora a eficiência do desenvolvimento e melhora a robustez do código. Portanto, a proficiência em HttpClient é muito importante e obrigatória. Depois de dominar o HttpClient, acredito que a compreensão do protocolo Http será mais profunda.
1. Introdução
HttpClient é um subprojeto do Apache Jakarta Common, usado para fornecer um kit de ferramentas de programação de cliente eficiente, atualizado e rico em recursos que suporta o protocolo HTTP e suporta a versão mais recente e as recomendações do protocolo HTTP. HttpClient tem sido usado em muitos projetos. Por exemplo, dois outros projetos de código aberto famosos no Apache Jakarta, Cactus e HTMLUnit, ambos usam HttpClient.
Endereço para download: http://hc.apache.org/downloads.cgi
2. Características
1. Baseado na linguagem java padrão e pura. Implementado Http1.0 e Http1.1
2. Implementa todos os métodos HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS e TRACE) com uma estrutura extensível orientada a objetos.
3. Suporte ao protocolo HTTPS.
4. Estabeleça uma conexão transparente através do proxy HTTP.
5. Use o método CONNECT para estabelecer uma conexão https em túnel por meio do proxy Http.
6. Esquema de autenticação Básico, Digest, NTLMv1, NTLMv2, Sessão NTLM2, SNPNEGO/Kerberos.
7. Esquema de autenticação personalizado do plug-in.
8. A fábrica de soquetes portátil e confiável facilita o uso de soluções de terceiros.
9. O gerenciador de conexões oferece suporte a aplicativos multithread. Suporta a configuração do número máximo de conexões, bem como a configuração do número máximo de conexões para cada host e descobre e fecha conexões expiradas.
10. Gerenciar cookies automaticamente em Set-Cookie.
11. Política de cookies personalizados do plug-in.
12. O fluxo de saída da solicitação pode evitar o buffer do conteúdo do fluxo diretamente no servidor de soquete.
13. O fluxo de entrada de Response pode efetivamente ler o conteúdo correspondente diretamente do servidor de soquete.
14. Use KeepAlive para manter conexões persistentes em http1.0 e http1.1.
15. Obtenha diretamente o código de resposta e os cabeçalhos enviados pelo servidor.
16. Capacidade de definir o tempo limite de conexão.
17. Suporte experimental para cache de resposta http1.1.
18. O código-fonte está disponível gratuitamente sob a licença Apache.
3. Como usar
É muito simples usar o HttpClient para enviar solicitações e receber respostas. Geralmente, as etapas a seguir são necessárias.
1. Crie um objeto HttpClient.
2. Crie uma instância do método de solicitação e especifique o URL da solicitação. Se precisar enviar uma solicitação GET, crie um objeto HttpGet; se precisar enviar uma solicitação POST, crie um objeto HttpPost.
3. Se precisar enviar parâmetros de solicitação, você pode chamar o método setParams (params HetpParams) comum a HttpGet e HttpPost para adicionar parâmetros de solicitação para o objeto HttpPost, você também pode chamar o método setEntity (entidade HttpEntity) para definir a solicitação; parâmetros.
4. Chame execute(solicitação HttpUriRequest) do objeto HttpClient para enviar a solicitação. Este método retorna um HttpResponse.
5. Chame getAllHeaders(), getHeaders(String name) do HttpResponse e outros métodos para obter os cabeçalhos de resposta do servidor; chame o método getEntity() do HttpResponse para obter o objeto HttpEntity, que envolve o conteúdo da resposta do servidor. O programa pode obter o conteúdo da resposta do servidor através deste objeto.
6. Libere a conexão. Independentemente de o método de execução ser bem-sucedido ou não, a conexão deve ser liberada
4. Exemplos
pacote com.test; importar java.io.File; importar java.io.FileInputStream; importar java.security.KeyStore; segurança.KeyStoreException; importar java.security.NoSuchAlgorithmException; java.security.cert.CertificateException; importar java.util.ArrayList; importar java.util.List; importar javax.net.ssl.SSLContext; org.apache.http.ParseException; importar org.apache.http.client.ClientProtocolException; org.apache.http.client.entity.UrlEncodedFormEntity; importar org.apache.http.client.methods.CloseableHttpResponse; importar org.apache.http.client.methods.HttpGet; ;importar org.apache.http.conn.ssl.SSLConnectionSocketFactory; importar org.apache.http.conn.ssl.SSLContexts importar org.apache.http.conn.ssl.TrustSelfSignedStrategy; org.apache.http.entity.mime.MultipartEntityBuilder importação; org.apache.http.entity.mime.content.FileBody; importar org.apache.http.entity.mime.content.StringBody; importar org.apache.http.impl.client.CloseableHttpClient; .client.HttpClients;importar org.apache.http.message.BasicNameValuePair; org.apache.http.util.EntityUtils; import org.junit.Test; public class HttpClientTest { @Test public void jUnitTest() { get() } /** * HttpClient se conecta ao SSL */ public void ssl() {; CloseableHttpClient httpclient = null; tente {KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = new FileInputStream(new File("d://tomcat.keystore")); , "123456".toCharArray()); catch (CertificateException e) { e.printStackTrace(); { instream.close(); catch (Exception ignore) { } } // Confie em sua própria CA e em todos os certificados autoassinados SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build() ; // Permitir apenas o uso do protocolo TLSv1 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); novo HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); System.out.println("executando solicitação" + httpget.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httpget); { Entidade HttpEntity = resposta.getEntity(); System.out.println("---------------------------------- -------"); System.out.println(response.getStatusLine()); (entidade)); EntityUtils.consume(entidade); (ParseException e) { e.printStackTrace(); catch (IOException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace() } finalmente { if (httpclient != null) { try { httpclient.close(); catch (IOException e) { e.printStackTrace(); } } } } /** * Envie o formulário em modo post (simule a solicitação de login do usuário) */ public void postForm() { // Cria uma instância httpClient padrão. CloseableHttpClient httpclient = HttpClients.createDefault(); HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // Cria fila de parâmetros List<namevaluepair> formparams = new ArrayList<namevaluepair>(); , "admin")); formparams.add(new BasicNameValuePair("senha", "123456")); UrlEncodedFormEntity uefEntity; tente { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity); (httppost); tente { Entidade HttpEntity = resposta.getEntity(); if (entidade! = nulo) { System.out.println("-------------------------- ------------"); System.out.println("Conteúdo da resposta: " + EntityUtils.toString(entity, "UTF-8")); System.out.println("-- ------------------------------------"); } } finalmente { resposta.close(); } } pegar (ClientProtocolException e) { e.printStackTrace(); catch (UnsupportedEncodingException e1) { e1.printStackTrace(); catch (IOException e) { e.printStackTrace(); httpclient .close(); catch (IOException e) { e.printStackTrace(); Envie uma solicitação de postagem para acessar o aplicativo local e retornar resultados diferentes de acordo com os diferentes parâmetros passados */ public void post() { // Crie uma instância httpClient padrão. CloseableHttpClient httpclient = HttpClients.createDefault(); = novo HttpPost(" http://localhost:8080/myDemo/Ajax/serivceJ.action"); Criar fila de parâmetros List<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair("type", "house")); "); httppost.setEntity(uefEntity); System.out.println("executando solicitação " + httppost.getURI()); CloseableHttpResponse resposta = httpclient.execute(httppost); tente { HttpEntity entidade = resposta.getEntity(); .println("------------------------------------------"); .out.println ("Conteúdo da resposta: " + EntityUtils.toString(entidade, "UTF-8")); System.out.println("----------------------------- ---------"); } } finalmente {response.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } pegar (IOException e) { e.printStackTrace(); finalmente { // Fecha a conexão e libera recursos try { httpclient.close(); catch (IOException e) { e.printStackTrace(); / public void get() { CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet("http://www.baidu.com/"); System.out.println("executando solicitação " + httpget.getURI()); // Executar solicitação de obtenção. try { // Obtém a entidade de resposta HttpEntity entidade = resposta.getEntity() System.out.println("-------------------------- ----------"); // Imprimir status da resposta System.out.println(response.getStatusLine()); if (entity != null) { // Imprimir comprimento do conteúdo da resposta System.out.println("Comprimento do conteúdo da resposta: " +entity.getContentLength()); //Imprime o conteúdo da resposta System.out.println("Conteúdo da resposta: " + EntityUtils.toString(entity) }); System.out.println("-------------------------------------------------------"); } finalmente { resposta .close() } catch (ClientProtocolException e) { e.printStackTrace(); finalmente { // Fecha a conexão e libera recursos try { httpclient.close(); e) { e.printStackTrace(); 8080/myDemo/Ajax/servivceFile.action"); FileBody bin = new FileBody(novo File("F://image//sendpix0.jpg")); StringBody comment = new StringBody("Algum tipo de arquivo binário", ContentType.TEXT_PLAIN("bin); ", bin).addPart("comentário", comentário).build(); httppost.setEntity(reqEntity); System.out.println("executando solicitação " + httppost.getRequestLine()); CloseableHttpResponse resposta = httpclient.execute(httppost); -----------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = resposta. getEntidade(); if (resEntidade != null) { System.out.println("Comprimento do conteúdo da resposta: " + resEntity.getContentLength() } EntityUtils.consume(resEntity } finalmente {response.close(); e.printStackTrace(); catch (IOException e) { e.printStackTrace(); httpclient.close(); } catch (IOException e) { e.printStackTrace() } } } }</namevaluepair></namevaluepair></namevaluepair></namevaluepair>;
Este exemplo usa a versão mais recente do HttpClient4.3. Esta versão é bem diferente do estilo de escrita de código anterior, portanto, preste mais atenção.
Ok, o texto acima é todo o conteúdo deste artigo, espero que gostem.