1 http
O protocolo HTTP é provavelmente o protocolo mais usado e mais importante da Internet agora. Cada vez mais aplicativos Java precisam acessar diretamente os recursos de rede através do protocolo HTTP.
Embora a funcionalidade básica de acessar o protocolo HTTP tenha sido fornecida no pacote JDK Java.net, a própria biblioteca JDK fornece não rico e flexível o suficiente para a maioria dos aplicativos. O httpclient é usado para fornecer kits de ferramentas de programação de clientes eficientes e mais ricos em recursos que suportam o protocolo HTTP e suporta as versões e recomendações mais recentes do protocolo HTTP.
De um modo geral, usamos o Chrome ou outros navegadores para acessar um servidor da Web, usado para navegar por páginas para visualizar informações, enviar alguns dados, fazer upload de arquivos etc. Algumas das páginas visitadas são apenas algumas páginas comuns, alguns exigem que os usuários efetuem login antes de usá -los ou exigem autenticação e outros são transmitidos por meio de criptografia, como HTTPs. Os navegadores que usamos atualmente para lidar com essas situações não representam um problema. Mas e se precisarmos não acessar os recursos do servidor através do navegador? Então, o que devo fazer?
Vamos levar o cliente local para fazer upload e baixar arquivos como um exemplo para fazer uma pequena demonstração. Existem duas formas de httpclient, uma está sob org.apache.http e a outra é org.apache.commons.httpclient.httpclient.
2 upload de arquivo
O upload de arquivo pode ser implementado de duas maneiras, uma é o método pós -metódico e o outro é o método HTTPPOST. Os dois são semelhantes. O PostMethod usa o FileBody para embrulhar o fluxo de embrulho de arquivo, e o HTTPPOST usa o FilePart para envolver o fluxo de arquivo. Ao passar por fluxos de arquivo para o servidor, outros parâmetros podem ser passados ao mesmo tempo.
2.1 Processamento do cliente
2.1.1 Método pós -metódico
Encapsular o arquivo no FilePart e coloque -o em uma matriz de peças. Ao mesmo tempo, outros parâmetros podem ser colocados em StringPart. Não há escrita aqui, mas simplesmente defina os parâmetros na forma de SetParameter. O httpclient aqui é org.apache.commons.httpclient.httpclient.
public void upload (string localfile) {arquivo file = new File (localFile); Pós -metódico filepost = novo pós -método (url_str); Cliente httpclient = new httpClient (); tente {// Os seguintes métodos podem ser usados para simular o envio de parâmetros da página filepost.setParameter ("nome de usuário", nome de usuário); filepost.setParameter ("Passwd", Passwd); Parte [] partes = {new FilePart (file.getName (), arquivo)}; filepost.setRequestentity (nova multipartreCestentity (partes, filepost.getparams ())); client.gethttpConnectionManager (). getParams (). SetConnectionTimeout (5000); int status = client.executemethod (filepost); if (status == httpstatus.sc_ok) {System.out.println ("carregado com sucesso"); } else {System.out.println ("Falha no upload"); }} catch (Exceção ex) {ex.PrintStackTrace (); } finalmente {filepost.releaseconnection (); }}Lembre -se de liberar a conexão através da ReleaseConnection depois de concluí -la.
2.1.2 Método HttpPost
Este método é semelhante ao acima, mas se torna o arquivo de arquivo. A matriz de peças acima corresponde à httpentity aqui. O httpclient aqui está sob org.apache.http.client.methods.
upload public void (string localfile) {ClosableHttpClient httpClient = null; ClosableHttpResponse Response = null; tente {httpclient = httpclients.createFault (); // Carregar um parâmetro e arquivo normais para o seguinte endereço é um servlet httppost httppost = new httppost (url_str); // Converta o arquivo em um objeto de fluxo FileBodyBodyBody Bin = new FileBody (novo arquivo (LocalFile)); Stringbody userName = new stringbody ("scott", contentType.create ("text/planing", consts.utf_8)); Stringbody senha = new Stringbody ("123456", contentType.create ("text/planing", const.utf_8)); Httpentity reqentity = multipartentitybuilder.create () // equivalente a <input type = "file" name = "file"/> .addpart ("arquivo", bin) // equivalente a <input type = "text" name = "username = username> .ArtDart (" username "," name "usename". .construir(); httppost.setentity (reqentity); // inicia a solicitação e retorne a resposta da resposta da solicitação = httpclient.execute (httppost); System.out.println ("O valor da resposta do token:" + Response.getFirStheader ("Token")); // obtenha o objeto de resposta httpentity ressentity = Response.getEntity (); if (ressentity! = null) {// Imprima o comprimento da resposta System.out.println ("Comprimento do conteúdo da resposta:" + ressentity.getContentLength ()); // Impresso a System.out.println (entityutils.toString (ressentity, charset.formoname ("utf-8"))); } // Destroy entityutils.consume (ressentidade); } catch (Exceção e) {e.printStackTrace (); } finalmente {try {if (resposta! = null) {Response.close (); }} catch (ioexception e) {e.printStackTrace (); } tente {if (httpClient! = null) {httpclient.close (); }} catch (ioexception e) {e.printStackTrace (); }}}2.2 Processamento do lado do servidor
Independentemente do método de upload o cliente, o processamento no servidor é o mesmo. Após obter os parâmetros através do HTTPServletRequest, o item obtido é classificado em formulários e formulários de arquivo comuns.
ServletfileUpload pode definir o formato de tamanho e codificação do arquivo carregado.
Em resumo, o processamento do servidor trata os parâmetros obtidos como formulários HTML.
public void ProcessUpload (solicitação httpServletRequest, resposta httpServLetResponse) {file uploadFile = new File (uploadPath); if (! uploadfile.exists ()) {uploadfile.mkdirs (); } System.out.println ("Vamos, baby ......"); request.setcharacterencoding ("UTF-8"); Response.Setcharacterencoding ("UTF-8"); // detecção se o arquivo de upload existe boolean ismultipart = servletfileupload.ismultipartContent (request); if (ismultipart) {DiskFileItemFactory Factory = new DiskFileItemFactory (); // Especifique o tamanho dos dados em cache na memória, a unidade é byte, aqui está definido como 1MB Factory.SetSizETHreshold (1024*1024); // Definir os dados é armazenado no diretório de disco rígido quando o tamanho do arquivo excede o valor de getSizeShreshold () factory.setRepository (novo arquivo ("d: // temp")); // Crie um novo manipulador de upload de arquivos servletfileUpload upload = new ServletFileUpload (fábrica); // Especifique o tamanho máximo de um único arquivo carregado, unidade: bytes, defina como 50MB upload.setFilesizEMAX (50 * 1024 * 1024); // Especifique o tamanho total de vários arquivos enviados de uma só vez, unidade: bytes, defina como 50MB upload.SetSizEMAX (50 * 1024 * 1024); upload.setheadeRencoding ("UTF-8"); List <FileItem> itens = null; tente {// parse solicitar itens = upload.parserequest (request); } catch (fileUploadexception e) {e.printStackTrace (); } if (itens! = null) {// parse o item de formulário <FileItem> iter = items.iterator (); while (iter.hasnext ()) {fileItem item = iter.Next (); // se for um atributo de formulário normal if (item.isformfield ()) {// o atributo de nome equivalente à entrada é <input type = "text" name = "content"> string name = item.getfieldName (); // o atributo de valor do valor da string de entrada = item.getString (); System.out.println ("Propriedade:" + nome + "Valor do atributo:" + valor); } // se estiver carregando arquivo else {// atributo name string fieldname = item.getfieldName (); // Carregar o caminho do arquivo string string filename = item.getName (); FILENAME = FILENAME.SUBSTRING (FILENAME.LASTIndexOf ("/") + 1); // Obtenha o nome do arquivo do arquivo carregado, tente {Item.write (new File (uploadPath, FileName)); } catch (Exceção e) {e.printStackTrace (); }}}}}} resposta.addheader ("token", "hello"); }Após o processamento, o servidor pode definir informações simples retornadas ao cliente no cabeçalho. Se o cliente de retorno for um fluxo, o tamanho do fluxo deve ser definido com antecedência!
Response.setContentLength ((int) file.Length ());
3 downloads de arquivos
O download do arquivo pode ser implementado usando o modelo getMethod do httpclient e o método HTTPGET e o método HttpurlConnection original.
3.1 Processamento do cliente
3.1.1 Método GetMethod
O httpclient aqui é org.apache.commons.httpclient.httpclient.
public void Download (String RemoteFilename, String LocalFileName) {HttpClient Client = new HttpClient (); GetMethod get = null; FileOutputStream Output = NULL; tente {get = new getMethod (url_str); get.setRequestHeader ("nome de usuário", nome de usuário); get.setRequestHeader ("Passwd", Passwd); get.setRequestHeader ("nome do arquivo", RemoteFileName); int i = client.executemethod (get); if (success == i) {System.out.println ("o valor da resposta do token:" + get.getResponseHeader ("token")); Arquivo storefile = novo arquivo (localfilename); output = new FileOutputStream (StoreFile); // Obtenha a matriz de bytes de recursos de rede e escreva na saída do arquivo.Write (get.getResponseBody ()); } else {System.out.println ("O arquivo de download ocorre exceção, o código de erro é:" + i); }} catch (Exceção e) {e.printStackTrace (); } finalmente {try {if (output! = null) {output.close (); }} catch (ioexception e) {e.printStackTrace (); } get.ReleasEConnection (); clíniques. }}3.1.2 Método HttpGet
O httpclient aqui está sob org.apache.http.client.methods.
public void Download (String RemoteFilename, String LocalFileName) {DefaULTHTTPCLIENT HTTPCLIENT = new DefaultThttpClient (); OutputStream out = null; InputStream in = null; tente {httpget httpget = new httpget (url_str); httpget.addheader ("nome de usuário", nome de usuário); httpget.addheader ("passwd", passwd); httpget.addheader ("nome do arquivo", RemoteFileName); HttpResponse httpResponse = httpclient.execute (httpget); Entidade httpentity = httpResponse.getEntity (); in = entity.getContent (); comprimento longo = entity.getContentLength (); if (comprimento <= 0) {System.out.println ("O arquivo de download não existe!"); retornar; } System.out.println ("O valor de resposta do token:" + httproponse.getFirStheader ("token")); Arquivo de arquivo = novo arquivo (localFilename); if (! file.exists ()) {file.createnewfile (); } out = new FileOutputStream (arquivo); byte [] buffer = novo byte [4096]; int readLength = 0; while ((readLength = in.read (buffer))> 0) {byte [] bytes = new Byte [ReadLength]; System.arraycopy (buffer, 0, bytes, 0, comprimento de leitura); out.write (bytes); } out.flush (); } catch (ioexception e) {e.printStackTrace (); } catch (Exceção e) {e.printStackTrace (); } finalmente {tente {if (in! = null) {in.close (); }} catch (ioexception e) {e.printStackTrace (); } tente {if (out! = null) {out.close (); }} catch (ioexception e) {e.printStackTrace (); }}}3.1.3 Método de HttpurlConnection
public void Download3 (String RemoteFilename, String localFileName) {FileOutputStream Out = NULL; InputStream in = null; tente {url url = novo url (url_str); UrlConnection urlConnection = url.openconnection (); HttpurlConnection httpurlConnection = (httpurlConnection) urlConnection; // true - definirá parâmetros httpurlconnection.setdoOutput (true); // true-will Permitir leitura em httpurlconnection.setdoinput (true); // não usará caches httpurlconnection.setUseCaches (false); // definir httpurlconnection.setRequestProperty serializado ("conteúdo-type", "Application/x-java-serialized-object"); // O padrão é get httpurlconnection.setRequestMethod ("post"); httpurlconnection.setRequestProperty ("conexão", "Keep-alive"); httpurlconnection.setRequestProperty ("charsert", "utf-8"); // 1 min httpurlconnection.setConnectTimeout (60000); // 1 min httpurlconnection.SetReadTimeout (60000); httpurlconnection.addrequestProperty ("nome de usuário", nome de usuário); httpurlconnection.addrequestProperty ("passwd", passwd); httpurlConnection.addrequestProperty ("nome do arquivo", RemoteFilename); // Conecte -se ao servidor (TCP) httpurlConnection.connect (); in = httpurlConnection.getInputStream (); // Enviar solicitação para // arquivo de arquivo servidor = novo arquivo (localFileName); if (! file.exists ()) {file.createnewfile (); } out = new FileOutputStream (arquivo); byte [] buffer = novo byte [4096]; int readLength = 0; while ((readLength = in.read (buffer))> 0) {byte [] bytes = new Byte [ReadLength]; System.arraycopy (buffer, 0, bytes, 0, comprimento de leitura); out.write (bytes); } out.flush (); } catch (Exceção e) {e.printStackTrace (); } finalmente {tente {if (in! = null) {in.close (); }} catch (ioexception e) {e.printStackTrace (); } tente {if (out! = null) {out.close (); }} catch (ioexception e) {e.printStackTrace (); }}}3.2 Processamento do lado do servidor
Embora o cliente lida de maneira diferente, o servidor é o mesmo.
Public void ProcessDownload (solicitação httpServletReQuest, httpServLeTletResponse resposta) {int buffer_size = 4096; InputStream in = null; OutputStream out = null; System.out.println ("Vamos, baby ......"); tente {request.SetcharacterEncoding ("UTF-8"); Response.Setcharacterencoding ("UTF-8"); Response.setContentType ("Application/Octet-Stream"); String userName = request.getheader ("nome de usuário"); String passwd = request.getheader ("passwd"); String filename = request.getheader ("nome do arquivo"); System.out.println ("Nome de usuário:" + nome de usuário); System.out.println ("passwd:" + passwd); System.out.println ("nome do arquivo:" + nome do arquivo); // Processamento adicional pode ser executado com base no nome de usuário passado e no passe, como verificar se a solicitação é legal, etc. arquivo de arquivo = novo arquivo (downloadpath + "//" + nome do arquivo); Response.setContentLength ((int) file.Length ()); Response.setheader ("Acesso Ranges", "Bytes"); int readLength = 0; in = new bufferInputStream (new FileInputStream (arquivo), buffer_size); out = new BufferedOutputStream (Response.getOutputStream ()); byte [] buffer = novo byte [buffer_size]; while ((readLength = in.read (buffer))> 0) {byte [] bytes = new Byte [ReadLength]; System.arraycopy (buffer, 0, bytes, 0, comprimento de leitura); out.write (bytes); } out.flush (); Response.AddHeader ("Token", "Hello 1"); } catch (Exceção e) {e.printStackTrace (); Response.AddHeader ("Token", "Hello 2"); } finalmente {if (in! = null) {tente {in.close (); } catch (ioexception e) {}} if (out! = null) {try {out.close (); } catch (ioexception e) {}}}}4 Resumo
A função mais básica do httpclient é executar o método HTTP. A execução de um método HTTP envolve a interação de uma ou mais respostas de solicitações HTTP/HTTP. Geralmente, esse processo será processado automaticamente pelo HTTPClient e é transparente para o usuário. O usuário precisa fornecer apenas o objeto de solicitação HTTP e o HTTPClient enviará a solicitação HTTP ao servidor de destino e receberá a resposta do servidor. Se a solicitação HTTP não for executada com sucesso, o httppclient lançará uma exceção. Portanto, preste atenção ao manuseio finalmente ao escrever código.
Todas as solicitações HTTP têm uma linha de solicitação, incluindo o nome do método, o URI da solicitação e o número da versão HTTP. O HTTPClient suporta todos os métodos HTTP definidos em HTTP/1.1: Get, Head, Publique, Put, Excluir, Trace e Opções. O upload acima usa a postagem e o download é Get.
Atualmente, use org.apache.commons.httpclient.httpclient More. Depende de mim ~
O exposto acima é todo o conteúdo dos métodos de upload e download de usar o HTTPClient para implementar arquivos. Espero que todos possam apoiar mais wulin.com ~