1 Http
Das HTTP -Protokoll ist wahrscheinlich das am häufigsten verwendete und wichtigste Protokoll im Internet. Immer mehr Java -Anwendungen müssen über das HTTP -Protokoll direkt auf Netzwerkressourcen zugreifen.
Obwohl die grundlegende Funktionalität des Zugriffs auf das HTTP -Protokoll im JDK Java.net -Paket bereitgestellt wurde, bietet die JDK -Bibliothek selbst für die meisten Anwendungen nicht reich und flexibel genug. HTTPCLIENT wird verwendet, um ein effizientes, neueste, featurereichen Client-Programmier-Toolkits bereitzustellen, die das HTTP-Protokoll unterstützen, und unterstützt die neuesten Versionen und Empfehlungen des HTTP-Protokolls.
Im Allgemeinen verwenden wir Chrome oder andere Browser, um auf einen Webserver zuzugreifen, der zum Durchsuchen von Seiten verwendet wird, um Informationen anzuzeigen, einige Daten zu senden, Dateien hochzuladen. Einige der besuchten Seiten sind nur einige gewöhnliche Seiten. Einige verlangen, dass Benutzer sich anmelden oder eine Authentifizierung erfordern, und einige werden über Enkryption wie HTTPS übertragen. Die Browser, die wir derzeit verwenden, um diese Situationen zu behandeln, werden kein Problem darstellen. Aber was ist, wenn wir über den Browser nicht auf die Ressourcen des Servers zugreifen müssen? Also, was soll ich tun?
Nehmen wir den lokalen Client zum Hochladen und Herunterladen von Dateien als Beispiel, um eine kleine Demo zu erstellen. Es gibt zwei Formen von httpclient, einer befindet sich unter org.apache.http und der andere ist org.apache.commons.httpclient.httpclient.
2 Datei hochladen
Das Datei -Upload kann auf zwei Arten implementiert werden, eine ist die Postmethode -Methode und die andere die HTTPPOST -Methode. Die beiden sind ähnlich. POSTMETHOD verwendet FileBody, um den Datei -Wraping -Stream zu wickeln, und HTTPPOST verwendet FilePart, um den Dateifluss zu wickeln. Wenn Dateiströme an den Server übertragen werden, können gleichzeitig andere Parameter übergeben werden.
2.1 Client -Verarbeitung
2.1.1 Postmethode -Methode
Kapitulieren Sie die Datei in FilePart und setzen Sie sie in ein Teilarray ein. Gleichzeitig können andere Parameter in StringPart platziert werden. Hier gibt es kein Schreiben, sondern legt einfach die Parameter in Form von SetParameter fest. Das Httpclient hier ist org.apache.commons.httpclient.httpclient.
public void upload (String localFile) {Datei Datei = neue Datei (localFile); Postmethod filepost = new postmethod (url_str); Httpclient client = new httpclient (); Versuchen Sie {// Die folgenden Methoden können verwendet werden, um die Übermittlung von Page Parameter filepost.setParameter ("Benutzername", Benutzername) zu simulieren; filepost.setParameter ("Passwd", Passwd); Part [] part = {new FilePart (Datei.getName (), Datei)}; filepost.setRequestentity (neuer MultiparTequestentity (Teile, filepost.getParams ())); client.gethttpConnectionManager (). getParams (). setConnectionTimeOut (5000); int status = client.executemethod (filepost); if (status == httpstatus.sc_ok) {System.out.println ("erfolgreich hochgeladen"); } else {System.out.println ("Upload fehlgeschlagen"); }} catch (Ausnahme ex) {ex.printstacktrace (); } endlich {filepost.releaseconnection (); }}Denken Sie daran, die Verbindung nach dem Abschluss durch ReleasConnection freizugeben.
2.1.2 HTTPPOST -Methode
Diese Methode ähnelt dem oben genannten, wird jedoch zum Filekörper. Das obige Teilarray entspricht Httpentity hier. Das Httpclient hier unter org.apache.http.client.methods.
public void upload (String localFile) {ClodableableHttpclient httpclient = null; ClodableHttPesponse -Antwort = NULL; try {httpclient = httpclients.CreateFault (); // Laden Sie einen normalen Parameter und eine Datei in die folgende Adresse hoch. Ein Servlet httppost httppost = new httppost (url_str); // Die Datei in einen Stream -Objekt -Dateikörper -FileBody Bin = New FileBody (neue Datei (localFile)) konvertieren; Stringbody userername = new StringBody ("Scott", contentType.create ("text/plain", consts.utf_8)); Stringbody password = new StringBody ("123456", contentType.create ("text/plain", consts.utf_8)); Httpentity reqentity = multipartEntityBuilder.create () // äquivalent zu <input type = "Datei" name = "Datei"/> .addPart ("Datei", bin) // äquivalent zu <Eingabe type = "text" name = "username" value = username>. httppost.setentity (Reqentity); // die Anforderung einleiten und die Antwort der Request -Antwort = httpclient.execute (httppost) zurückgeben; System.out.println ("Der Antwortwert von Token:" + response.getFirStheader ("Token"); // das Antwortobjekt httpentity reentity = response.getEntity () abrufen; if (resentity! // Antwort inhaltsdrucken system.out.println (Entityutils.toString (RESENTITY, CHARSET.FORNAME ("UTF-8")); } // EntityUtils.consume (Resentity) zerstören; } catch (Ausnahme e) {e.printstacktrace (); } endlich {try {if (response! = null) {response.close (); }} catch (ioException e) {e.printstacktrace (); } try {if (httpclient! = null) {httpclient.close (); }} catch (ioException e) {e.printstacktrace (); }}}2.2 serverseitige Verarbeitung
Unabhängig davon, welche Methode der Client hochladen wird, ist die Verarbeitung auf dem Server gleich. Nachdem die Parameter über httpServletRequest erhalten wurden, wird das erhaltene Element in gewöhnliche Formulare und Dateiformulare eingeteilt.
ServletFileUpload kann das Größe und das Codierungsformat der hochgeladenen Datei festlegen.
Kurz gesagt, die serverseitige Verarbeitung behandelt die erhaltenen Parameter als HTML-Formulare.
public void processUpload (httpServletRequest -Anforderung, httpServletResponse -Antwort) {Datei UploadFile = new Datei (UploadPath); if (! uploadfile.exists ()) {uploadFile.mkdirs (); } System.out.println ("Komm schon, Baby ......"); request.setcharactercoding ("utf-8"); response.setcharactercoding ("utf-8"); // Erkennung, ob die Upload -Datei boolean ismultipart = servletFileUpload.ismultipartContent (Anfrage) existiert; if (ismultiPart) {diskFileItemFactory factory = new diskFileItemfactory (); // Geben Sie die zwischengespeicherte Datengröße im Speicher an, das Gerät ist Byte, hier wird auf 1 MB FACTORY eingestellt. SetSizethreshold (1024*1024); // Setzen Sie die Daten werden im Festplattenverzeichnis gespeichert, wenn die Dateigröße den Wert von getizethreshold () factory.setRepository (neue Datei ("d: // temp") überschreitet; // Erstellen Sie eine neue Datei -Upload -Handler -ServletFileUpload upload = new servletFileUpload (factory); // Geben Sie die maximale Größe einer einzelnen hochgeladenen Datei an, Einheit: Bytes, auf 50 MB Upload eingestellt.SetFileMax (50 * 1024 * 1024); // Geben Sie die Gesamtgröße mehrerer Dateien an, die gleichzeitig hochgeladen wurden, Einheit: Bytes, auf 50 MB hochladen.setsizemax (50 * 1024 * 1024); upload.SetheaDerencoding ("utf-8"); LIST <FileItem> items = null; Versuchen Sie {// analysieren Sie Anforderungsanforderungselemente = Upload.ParSequest (Anfrage); } catch (FileUploadexception e) {e.printstacktrace (); } if (items! while (iter.hasnext ()) {FileItem item = iter.next (); // Wenn es sich um ein normales Formular -Attribut handelt, wenn (isformfield ()) {// das Namensattribut entspricht der Eingabe ist <Eingabe type = "text" name = "content"> String name = item.getFieldName (); // Das Wertattribut von Eingabe string value = item.getString (); System.out.println ("Eigenschaft:" + name + "Attributwert:" + Wert); } // Wenn es die Datei else {// Attributname String fieldname = item.getfieldname () hochladen; // Dateipfadstring -String -Dateiname = item.getName () hochladen; Dateiname = Dateiname.substring (Dateiname.lastIndexof ("/") + 1); // Erhalten Sie den Dateinamen der hochgeladenen Datei try {item.write (neue Datei (UploadPath, Dateiname)); } catch (Ausnahme e) {e.printstacktrace (); }}}}}} response.addHeader ("token", "hello"); }Nach der Verarbeitung kann der Server einfache Informationen festlegen, die im Header an den Client zurückgegeben wurden. Wenn der Return -Client ein Stream ist, muss die Stream -Größe im Voraus festgelegt werden!
Antwort.SetContentLength ((int) Datei.length ());
3 Datei -Downloads
Der Datei -Download kann mit dem GetMethod von httpclient und der HTTPGet -Methode und der ursprünglichen HTTPurlConnection -Methode implementiert werden.
3.1 Client -Verarbeitung
3.1.1 GetMethod -Methode
Das Httpclient hier ist org.apache.commons.httpclient.httpclient.
public void download (String remoteFileName, String localFileName) {httpclient client = new httpclient (); GetMethod Get = null; FileOutputStream output = null; Versuchen Sie {get = new getMethod (url_str); get.setRequestheader ("Benutzername", Benutzername); get.setRequestheader ("Passwd", Passwd); get.setRequestheader ("Dateiname", RemoteFileName); int i = client.executemethod (get); if (success == i) {System.out.println ("Der Antwortwert von Token:" + get.getResponseHeader ("Token"); Datei storeFile = new Datei (LocalFileName); output = new FileOutputStream (StoreFile); // Erhalten Sie das Byte -Array von Netzwerkressourcen und schreiben Sie in die Dateiausgabe (Get.GetResponseBody ()); } else {system.out.println ("Download -Datei wird ausgenommen, der Fehlercode lautet:" + i); }} catch (Ausnahme e) {e.printstacktrace (); } endlich {try {if (output! = null) {output.close (); }} catch (ioException e) {e.printstacktrace (); } get.releaseconnection (); client.gethttpConnectionManager (). CloseIdleConnections (0); }}3.1.2 Httpget -Methode
Das Httpclient hier unter org.apache.http.client.methods.
public void download (String remoteFileName, String localFileName) {Defaulthttpclient httpclient = new Defaulthttpclient (); OutputStream out = null; InputStream in = null; try {httpget httpget = new httpget (url_str); httpget.addHeader ("Benutzername", Benutzername); httpget.addHeader ("Passwd", Passwd); httpget.addHeader ("Dateiname", RemoteFileName); HttPresponse httPresponse = httpclient.execute (httpget); Httpentity entity = httPresponse.getEntity (); in = entity.getContent (); Langlänge = Entity.GetContentLength (); if (Länge <= 0) {System.out.println ("Die Download -Datei existiert nicht!"); zurückkehren; } System.out.println ("Der Antwortwert von Token:" + httPesponse.getFirStheader ("Token")); Datei Datei = neue Datei (LocalFileName); if (! file.exists ()) {file.createNewFile (); } out = new FileOutputStream (Datei); byte [] buffer = neues byte [4096]; int readLength = 0; while ((readLength = in System.ArrayCopy (Puffer, 0, Bytes, 0, ReadLength); out.write (bytes); } out.flush (); } catch (ioException e) {e.printstacktrace (); } catch (Ausnahme e) {e.printstacktrace (); } endlich {try {if (in! = null) {in.close (); }} catch (ioException e) {e.printstacktrace (); } try {if (out! = null) {out.close (); }} catch (ioException e) {e.printstacktrace (); }}}3.1.3 HttpurlConnection -Methode
public void download3 (String remoteFileName, String localFileName) {FileOutputStream out = null; InputStream in = null; try {url url = new url (url_str); UrlConnection urlConnection = url.openconnection (); HttpurlConnection httpurlConnection = (httpurlConnection) UrlConnection; // true - setzt Parameter httpurlConnection.setDooutput (true); // true-will erlauben Sie von httpurlConnection.setDoInput (true) zu lesen; // verwendet keine Caches httpurlConnection.setusecaches (false); // serialisierte httpurlConnection.setRequestProperty ("Content-Typ", "Anwendung/X-Java-serialisierte Objekt"); // Standard ist httpurlConnection.setRequestMethod ("post"); httpurlConnection.setRequestProperty ("Verbindung", "Keep-Alive"); httpurlConnection.setRequestProperty ("charsert", "utf-8"); // 1 min httpurlConnection.setConnectTimeout (60000); // 1 min httpurlConnection.setReadTimeout (60000); httpurlConnection.addRequestProperty ("Benutzername", Benutzername); httpurlConnection.addRequestProperty ("Passwd", Passwd); httpurlConnection.addRequestProperty ("Dateiname", RemoteFileName); // eine Verbindung zum Server (TCP) httpurlConnection.Connect (); in = httpurlConnection.getInputStream (); // Anforderung an // server File = neue Datei (LocalFileName) senden; if (! file.exists ()) {file.createNewFile (); } out = new FileOutputStream (Datei); byte [] buffer = neues byte [4096]; int readLength = 0; while ((readLength = in System.ArrayCopy (Puffer, 0, Bytes, 0, ReadLength); out.write (bytes); } out.flush (); } catch (Ausnahme e) {e.printstacktrace (); } endlich {try {if (in! = null) {in.close (); }} catch (ioException e) {e.printstacktrace (); } try {if (out! = null) {out.close (); }} catch (ioException e) {e.printstacktrace (); }}}3.2 serverseitige Verarbeitung
Obwohl der Client unterschiedlich behandelt wird, ist der Server gleich.
public void processDownload (httpServletRequest -Anforderung, httpServletResponse -Antwort) {int buffer_size = 4096; InputStream in = null; OutputStream out = null; System.out.println ("Komm schon, Baby ......"); try {request.setcharactercoding ("utf-8"); response.setcharactercoding ("utf-8"); response.setContentType ("Anwendung/Oktett-Stream"); String username = request.getheader ("userername"); String passwd = request.getheader ("passwd"); String Dateiname = request.getheader ("Dateiname"); System.out.println ("Benutzername:" + Benutzername); System.out.println ("Passwd:" + Passwd); System.out.println ("Dateiname:" + Dateiname); // Eine weitere Verarbeitung kann basierend auf dem übergebenen Benutzernamen und PassWD durchgeführt werden, z. Antwort.SetContentLength ((int) Datei.length ()); response.setheader ("Akzeptieren", "Bytes"); int readLength = 0; in = new buferedInputStream (neuer FileInputStream (Datei), Buffer_size); out = new bufferedOutputStream (response.getOutputStream ()); byte [] buffer = new byte [buffer_size]; while ((readLength = in System.ArrayCopy (Puffer, 0, Bytes, 0, ReadLength); out.write (bytes); } out.flush (); Antwort.AddHeader ("Token", "Hallo 1"); } catch (Ausnahme e) {e.printstacktrace (); response.addHeader ("Token", "Hallo 2"); } endlich {if (in! = null) {try {in.close (); } catch (ioException e) {}} if (out! = null) {try {out.close (); } catch (ioException e) {}}}}4 Zusammenfassung
Die grundlegendste Funktion von httpclient ist die Ausführung der HTTP -Methode. Die Ausführung einer HTTP -Methode umfasst die Interaktion einer oder mehrerer HTTP -Anforderungen/HTTP -Antworten. Normalerweise wird dieser Vorgang automatisch von HTTPClient verarbeitet und ist für den Benutzer transparent. Der Benutzer muss nur das HTTP -Anforderungsobjekt bereitstellen, und der HTTPCLISE sendet die HTTP -Anforderung an den Zielserver und empfängt die Antwort des Servers. Wenn die HTTP -Anfrage nicht erfolgreich ausgeführt wird, wird der HTTPPCLIENT eine Ausnahme ausgelöst. Achten Sie also darauf, endlich zu handeln, wenn Sie Code schreiben.
Alle HTTP -Anforderungen haben eine Anforderungszeile, einschließlich des Method -Namens, des Anforderungs -URI und der HTTP -Versionsnummer. HTTPCLIENT unterstützt alle in http/1.1 definierten HTTP -Methoden: Get, Head, Post, Put, Löschen, Spuren und Optionen. Der obige Upload verwendet Post und der Download ist erhalten.
Verwenden Sie derzeit org.apache.commons.httpclient.httpclient more. Es liegt an mir ~ ~
Das obige ist der gesamte Inhalt der Upload- und Download -Methoden zur Verwendung von HTTPClient zum Implementieren von Dateien. Ich hoffe, jeder kann Wulin.com mehr unterstützen ~