1 http
Le protocole HTTP est probablement le protocole le plus utilisé et le plus important sur Internet maintenant. De plus en plus d'applications Java doivent accéder directement aux ressources du réseau via le protocole HTTP.
Bien que la fonctionnalité de base de l'accès au protocole HTTP ait été fournie dans le package JDK Java.NET, la bibliothèque JDK elle-même ne fournit pas assez riche et flexible pour la plupart des applications. HTTPClient est utilisé pour fournir des kits de programmation client efficaces et riches en fonctionnalités qui prennent en charge le protocole HTTP, et il prend en charge les dernières versions et recommandations du protocole HTTP.
D'une manière générale, nous utilisons Chrome ou d'autres navigateurs pour accéder à un serveur Web, qui est utilisé pour parcourir des pages pour afficher les informations, soumettre certaines données, télécharger des fichiers, etc. Certaines des pages visitées ne sont que des pages ordinaires, certains nécessitent que les utilisateurs se connectent avant de les utiliser ou nécessitent une authentification et certains sont transmis via Encryption, comme HTTPS. Les navigateurs que nous utilisons actuellement pour gérer ces situations ne poseront pas de problème. Mais que se passe-t-il si nous avons besoin de ne pas accéder aux ressources du serveur via le navigateur? Alors que dois-je faire?
Prenons le client local pour télécharger et télécharger des fichiers à titre d'exemple pour faire une petite démo. Il existe deux formes de httpclient, l'une est sous org.apache.http et l'autre est org.apache.commons.httpclient.httpclient.
2 téléchargement de fichiers
Le téléchargement de fichiers peut être implémenté de deux manières, l'une est la méthode post-méthode et l'autre est la méthode HTTPPOST. Les deux sont similaires. PostMethod utilise FileBody pour envelopper le flux d'emballage de fichiers, et HTTPPOST utilise FilePart pour envelopper le flux de fichiers. Lors de la transmission de flux de fichiers vers le serveur, d'autres paramètres peuvent être passés en même temps.
2.1 Traitement des clients
2.1.1 Méthode post-méthode
Encapsuler le fichier dans filepart et le mettre dans le tableau des pièces. En même temps, d'autres paramètres peuvent être placés dans StringPart. Il n'y a pas d'écriture ici, mais définissez simplement les paramètres sous la forme de SetParameter. Le httpclient ici est org.apache.commons.httpclient.httpclient.
public void upload (String localfile) {file file = new File (localFile); PostMethod filepost = new PostMethod (URL_STR); HttpClient client = new httpclient (); essayez {// Les méthodes suivantes peuvent être utilisées pour simuler la soumission des paramètres de page filepost.setParameter ("nom d'utilisateur", nom d'utilisateur); filepost.setParameter ("passwd", passwd); Pièce [] parties = {new FileSt (file.getName (), file)}; fileposost.setRequesttentity (nouvelle multiparTrequeSTentity (parties, filepost.getParams ())); client.gethttpConnectionManager (). getParams (). setConnectionTimeout (5000); int status = client.executeMethod (filepost); if (status == httpstatus.sc_ok) {System.out.println ("Uploaded réussi"); } else {System.out.println ("téléchargement de téléchargement"); }} catch (exception ex) {ex.printStackTrace (); } enfin {filepost.releaseconnection (); }}N'oubliez pas de libérer la connexion via Releaseconnection après l'avoir terminée.
2.1.2 Méthode HTTPPOST
Cette méthode est similaire à ce qui précède, mais il devient FileBody. Le tableau des pièces ci-dessus correspond à Httpentity ici. Le httpclient ici est sous org.apache.http.client.methods.
public void upload (String localfile) {CloseableHttpClient httpClient = null; CloseableHttpResponse Response = null; essayez {httpClient = httpclients.CreateDefault (); // Téléchargez un paramètre et un fichier normaux sur l'adresse suivante est un servlet httppost httppost = new httppost (url_str); // convertit le fichier en flux de fichiers d'objet Stream FileBody bin = new FileBody (nouveau fichier (localFile)); StringBody username = new StringBody ("Scott", contentType.Create ("Text / Plain", const.utf_8)); StringBody Password = new StringBody ("123456", contentType.Create ("Text / PLAIN", const.utf_8)); Httpentity reqentity = multipartentitybuilder.create () // équivalent à <entrée type = "file" name = "file" /> .addPart ("file", bin) // équivalent à <entrée type = "text" name = "username" value = username> .addPart ("username", username) .addPart ("Pass", Passway). .construire(); httppost.sentity (reqentity); // initier la demande et renvoyer la réponse de la demande de demande = httpclient.exécute (httppost); System.out.println ("La valeur de réponse de Token:" + Response.getFiRStheader ("Token")); // Obtenez l'objet de réponse httpentity Ressentity = Response.GetEntity (); if (Resentity! = null) {// imprimer la longueur de réponse System.out.println ("Longueur du contenu de la réponse:" + Ressentity.getContentLength ()); // Imprimer la réponse Système de contenu.out.println (entityUtils.tostring (Ressentity, charSet.Forname ("UTF-8"))); } // détruire entityUtils.consume (Ressentity); } catch (exception e) {e.printStackTrace (); } enfin {try {if (réponse! = null) {réponse.close (); }} catch (ioException e) {e.printStackTrace (); } essayez {if (httpClient! = null) {httpclient.close (); }} catch (ioException e) {e.printStackTrace (); }}}2.2 Traitement côté serveur
Peu importe la méthode de téléchargement que le client est, le traitement sur le serveur est le même. Après avoir obtenu les paramètres via httpservletRequest, l'élément obtenu est classé en formulaires ordinaires et formulaires de fichier.
ServletFileUpload peut définir le format de taille et de codage du fichier téléchargé.
En bref, le traitement côté serveur traite les paramètres obtenus comme des formulaires HTML.
public void processUpload (requette httpservletRequest, réponse httpservletResponse) {file uploadFile = new File (uploadPath); if (! uploadFile.exists ()) {uploadFile.mkDirs (); } System.out.println ("Allez, bébé ......"); request.SetcharAtterencoding ("UTF-8"); Response.SetcharAtterencoding ("UTF-8"); // Détection si le fichier de téléchargement existe booléen isMultupart = servletFileUpload.ismulTipartContent (demande); if (isMultupart) {diskFileItemFactory Factory = new DiskFileItemFactory (); // spécifie la taille des données en cache en mémoire, l'unité est octet, ici est définie sur 1 Mo d'usine.SetSizethReshold (1024 * 1024); // Définir les données sont stockées dans le répertoire du disque dur lorsque la taille du fichier dépasse la valeur de getIzethReshold () factory.setRepository (nouveau fichier ("d: // temp")); // Créer un nouveau gestionnaire de fichiers de téléchargement ServletFileUpload upload = new ServletFileUpload (Factory); // spécifie la taille maximale d'un seul fichier téléchargé, unité: octets, réglé sur 50 Mo upload.setFileSizEmax (50 * 1024 * 1024); // spécifie la taille totale de plusieurs fichiers téléchargés à la fois, unité: octets, réglé sur 50 Mo upload.setSizemax (50 * 1024 * 1024); upload.setheDereencoding ("UTF-8"); List <FeleItem> items = null; essayez {// l'analyse des éléments de la demande = upload.PaSeRequest (demande); } catch (fileUpLoadexception e) {e.printStackTrace (); } if (items! = null) {// Parse Form Item iterator <FichierItem> iter = items.Itator (); while (iter.hasnext ()) {fileItem item = iter.next (); // s'il s'agit d'un attribut de formulaire normal if (item.isformField ()) {// L'attribut de nom équivalent à la saisie est <entrée type = "text" name = "Content"> String name = item.getFieldName (); // l'attribut de valeur de la valeur de chaîne d'entrée = item.getString (); System.out.println ("propriété:" + name + "Valeur d'attribut:" + valeur); } // s'il est téléchargé le fichier else {// name d'attribut String fieldName = item.getFieldName (); // Télécharger la chaîne de path de fichier filename = item.getName (); filename = filename.substring (filename.lastIndexof ("/") + 1); // Obtenez le nom du fichier du fichier téléchargé try {item.write (nouveau fichier (uploadPath, filename)); } catch (exception e) {e.printStackTrace (); }}}}}} réponse.addheader ("token", "bonjour"); }Après traitement, le serveur peut définir des informations simples renvoyées au client dans l'en-tête. Si le client de retour est un flux, la taille du flux doit être définie à l'avance!
réponse.setContentLength ((int) file.length ());
3 téléchargements de fichiers
Le téléchargement de fichiers peut être implémenté à l'aide du GetMethod de HttpClient, et de la méthode HTTPGET et de la méthode HttpurlConnection d'origine.
3.1 Traitement des clients
3.1.1 Méthode GetMethod
Le httpclient ici est org.apache.commons.httpclient.httpclient.
public void download (String RemoteFileName, String localFileName) {httpClient client = new httpClient (); GetMethod get = null; FileOutputStream output = null; essayez {get = new GetMethod (url_str); get.setRequestHeader ("nom d'utilisateur", nom d'utilisateur); get.setRequestHeader ("passwd", passwd); get.setRequestHeader ("FileName", RemoteFileName); int i = client.executeMethod (get); if (Success == i) {System.out.println ("La valeur de réponse de Token:" + get.getResponseHeader ("token")); File StoreFile = nouveau fichier (localFileName); Output = new FileOutputStream (StoreFile); // Obtenez le tableau d'octets de ressources réseau et écrivez dans le fichier output.write (get.getResponseBody ()); } else {System.out.println ("Le fichier de téléchargement se produit exception, le code d'erreur est:" + i); }} catch (exception e) {e.printStackTrace (); } enfin {try {if (output! = null) {output.close (); }} catch (ioException e) {e.printStackTrace (); } get.releaseconnection (); client.gethttpConnectionManager (). CloseIdleConnections (0); }}3.1.2 Méthode httpget
Le httpclient ici est sous org.apache.http.client.methods.
public void download (String RemoteFileName, String localFileName) {DefaulthTTPClient httpClient = new DefaulthTTPClient (); OutputStream out = null; InputStream dans = null; essayez {httpget httpget = new httpget (url_str); httpget.addheader ("nom d'utilisateur", nom d'utilisateur); httpget.addheader ("passwd", passwd); httpget.addHeader ("FileName", RemoteFileName); HttpResponse httpResponse = httpclient.execute (httpget); Httpentity Entity = httpResponse.getEntity (); dans = entity.getContent (); longueur long = entity.getContentLength (); if (le long <= 0) {System.out.println ("Le fichier de téléchargement n'existe pas!"); retour; } System.out.println ("La valeur de réponse de Token:" + httpResponse.getFiRStheader ("token")); Fichier fichier = nouveau fichier (localFileName); if (! file.exists ()) {file.createenewfile (); } out = new FileOutputStream (fichier); octet [] tampon = nouveau octet [4096]; int readLength = 0; while ((readLength = in.read (tampon))> 0) {byte [] bytes = new byte [readLength]; System.ArrayCopy (tampon, 0, octets, 0, ReadLength); out.write (octets); } out.flush (); } catch (ioException e) {e.printStackTrace (); } catch (exception e) {e.printStackTrace (); } enfin {try {if (in! = null) {in.close (); }} catch (ioException e) {e.printStackTrace (); } essayez {if (out! = null) {out.close (); }} catch (ioException e) {e.printStackTrace (); }}}3.1.3 Méthode HttpurlConnection
public void download3 (String RemoteFileName, String localFileName) {fileoutputStream out = null; InputStream dans = null; essayez {url url = new url (url_str); UrlConnection urlConnection = url.openconnection (); HttpurlConnection httpurlconnection = (httpurlconnection) urlConnection; // true - définira les paramètres httpurlconnection.setDoOutput (true); // Vrai - autoriser la lecture à partir de httpurlconnection.setDoInput (true); // n'utilisera pas les caches httpurlconnection.seTUSECaches (false); // Définition de httpurlconnection sérialisée.SetRequestProperty ("Content-Type", "Application / X-Java-Serialized-Object"); // Default est Get httpurlConnection.setRequestMethod ("Post"); httpurlconnection.setRequestProperty ("connexion", "keep-alive"); httpurlconnection.setRequestProperty ("Charsert", "utf-8"); // 1 min httpurlconnection.setConnectTimeout (60000); // 1 min httpurlconnection.setReadTimeout (60000); httpurlconnection.addrequestProperty ("nom d'utilisateur", nom d'utilisateur); httpurlconnection.addrequestProperty ("passwd", passwd); httpurlconnection.adDrequestProperty ("FileName", RemoteFileName); // Connectez-vous au serveur (TCP) httpurlconnection.connect (); dans = httpurlconnection.getInputStream (); // Envoyer une demande à // fichier de serveur = new File (localFileName); if (! file.exists ()) {file.createenewfile (); } out = new FileOutputStream (fichier); octet [] tampon = nouveau octet [4096]; int readLength = 0; while ((readLength = in.read (tampon))> 0) {byte [] bytes = new byte [readLength]; System.ArrayCopy (tampon, 0, octets, 0, ReadLength); out.write (octets); } out.flush (); } catch (exception e) {e.printStackTrace (); } enfin {try {if (in! = null) {in.close (); }} catch (ioException e) {e.printStackTrace (); } essayez {if (out! = null) {out.close (); }} catch (ioException e) {e.printStackTrace (); }}}3.2 Traitement côté serveur
Bien que le client gère différemment, le serveur est le même.
public void processownload (HttpServLetRequest Request, HttpServletResponse Response) {int buffer_size = 4096; InputStream dans = null; OutputStream out = null; System.out.println ("Allez, bébé ......"); essayez {request.SetcharAtteRencoding ("utf-8"); Response.SetcharAtterencoding ("UTF-8"); Response.SetContentType ("Application / Octet-Stream"); String username = request.getheader ("nom d'utilisateur"); String Passwd = request.GetHeader ("passwd"); String filename = request.getheader ("filename"); System.out.println ("nom d'utilisateur:" + nom d'utilisateur); System.out.println ("passwd:" + passwd); System.out.println ("FileName:" + FileName); // Un traitement supplémentaire peut être effectué en fonction du nom d'utilisateur et de PASSWD passé, tels que la vérification si la demande est légale, etc. fichier fichier = nouveau fichier (téléchargement Path + "//" + nom de fichier); réponse.setContentLength ((int) file.length ()); Response.Setheader ("Accept-Grees", "octets"); int readLength = 0; dans = new BufferedInputStream (new FileInputStream (fichier), buffer_size); out = new BufferedOutputStream (réponse.getOutputStream ()); octet [] buffer = new byte [buffer_size]; while ((readLength = in.read (tampon))> 0) {byte [] bytes = new byte [readLength]; System.ArrayCopy (tampon, 0, octets, 0, ReadLength); out.write (octets); } out.flush (); Response.Addheader ("Token", "Hello 1"); } catch (exception e) {e.printStackTrace (); Response.Addheader ("Token", "Hello 2"); } enfin {if (in! = null) {try {in.close (); } catch (ioException e) {}} if (out! = null) {try {out.close (); } catch (ioexception e) {}}}}4 Résumé
La fonction la plus élémentaire de HttpClient est d'exécuter la méthode HTTP. L'exécution d'une méthode HTTP implique l'interaction d'une ou plusieurs réponses HTTP / HTTP. Habituellement, ce processus sera automatiquement traité par HttpClient et est transparent à l'utilisateur. L'utilisateur doit uniquement fournir l'objet de demande HTTP, et le HTTPClient enverra la demande HTTP au serveur cible et recevra la réponse du serveur. Si la demande HTTP n'est pas exécutée avec succès, le HTTPPClient lancera une exception. Faites donc attention à la manipulation enfin lors de l'écriture de code.
Toutes les demandes HTTP ont une ligne de requête, y compris le nom de la méthode, la demande URI et le numéro de version HTTP. HTTPClient prend en charge toutes les méthodes HTTP définies dans HTTP / 1.1: obtenir, diriger, publier, mettre, supprimer, tracer et options. Le téléchargement ci-dessus utilise la publication, et le téléchargement est GET.
Actuellement, utilisez org.apache.commons.httpclient.httpclient plus. C'est à moi ~
Ce qui précède est tout le contenu des méthodes de téléchargement et de téléchargement de l'utilisation de HttpClient pour implémenter des fichiers. J'espère que tout le monde pourra soutenir Wulin.com plus ~