1 HTTP
HTTPプロトコルは、おそらくインターネット上で最も使用され、最も重要なプロトコルです。ますます多くのJavaアプリケーションが、HTTPプロトコルを介してネットワークリソースに直接アクセスする必要があります。
HTTPプロトコルへのアクセスの基本的な機能はJDK java.netパッケージで提供されていますが、JDKライブラリ自体は、ほとんどのアプリケーションに対して十分にリッチで柔軟ではありません。 HTTPClientは、HTTPプロトコルをサポートする効率的で最新の機能が豊富なクライアントプログラミングツールキットを提供するために使用され、HTTPプロトコルの最新バージョンと推奨事項をサポートします。
一般的に言えば、Chromeまたはその他のブラウザを使用してWebサーバーにアクセスします。これは、ページを閲覧して情報を表示したり、データを送信したり、ファイルをアップロードしたりするページの一部です。訪問されたページの一部は、通常のページで、ユーザーが使用する前にログインするか、認証を必要とする必要があります。現在、これらの状況を処理するために使用しているブラウザは問題を引き起こしません。しかし、ブラウザを介してサーバーのリソースにアクセスしない必要がある場合はどうなりますか?それで、私は何をすべきですか?
小さなデモを作成するための例として、ローカルクライアントを例としてアップロードおよびダウンロードしましょう。 httpclientには2つの形式があり、1つはorg.apache.httpの下にあり、もう1つはorg.apache.commons.httpclient.httpclientです。
2ファイルアップロード
ファイルのアップロードは2つの方法で実装できます。1つはPostMethodメソッド、もう1つはhttppostメソッドです。 2つは似ています。 PostMethodはファイルボディを使用してファイルラッピングストリームをラップし、httppostはFilePartを使用してファイルフローをラップします。ファイルをサーバーに渡すと、他のパラメーターを同時に渡すことができます。
2.1クライアント処理
2.1.1 Method PostMethodメソッド
ファイルをFilePartにカプセル化し、パーツ配列に入れます。同時に、他のパラメーターをStringPartに配置できます。ここには書くことはありませんが、SetParameterの形でパラメーターを設定するだけです。ここのhttpclientはorg.apache.commons.httpclient.httpclientです。
public void upload(string localfile){file file = new file(localfile); Method filepost = new postmethod(url_str); httpclient client = new httpclient(); try {//次のメソッドを使用して、ページパラメーターの提出filepost.setParameter( "username"、username)をシミュレートすることができます。 filepost.setParameter( "passwd"、passwd); part [] parts = {new filepart(file.getName()、file)}; filepost.setRequestentity(new MultiPartrequestentity(parts、filepost.getParams())); client.gethttpconnectionmanager()。getParams()。setConnectionTimeout(5000); int status = client.executemethod(filepost); if(status == httpstatus.sc_ok){system.out.println( "uploaded rauded"); } else {system.out.println( "upload failed"); }} catch(Exception ex){ex.printstacktrace(); }最後に{filepost.releaseconnection(); }}ReleaseConnectionを完了した後、接続をリリースすることを忘れないでください。
2.1.2 httppostメソッド
この方法は上記に似ていますが、ファイルボディになります。上の部分配列は、ここのHttpentityに対応しています。ここのhttpclientはorg.apache.http.client.methodsの下にあります。
public void upload(string localfile){closeablehttpclient httpclient = null; closeablehttpresponse応答= null; try {httpclient = httpclients.createdefault(); //通常のパラメーターとファイルを次のアドレスにアップロードすることはサーブレットhttppost httppost = new httppost(url_str); //ファイルをストリームオブジェクトに変換しますfilebody filebody bin = new filebody(new file(localfile)); stringbody username = 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()// <input type = "file" name "name =" file "/> .addpart(" file "、bin)// <入力タイプ=" text "name" name = "username" value = username> .addpart( "username"、username "、username"、pass 。建てる(); httppost.setentity(reqentity); //リクエストを開始し、リクエスト応答の応答を返します= httpclient.execute(httppost); system.out.println( "tokenの応答値:" + respons.getFirstheader( "token")); //応答オブジェクトを取得httpentity resentity = respons.getEntity(); if(resentity!= null){//応答長system.out.println( "応答コンテンツ長:" + resentity.getContentLength()); //応答コンテンツSystem.out.println(entityutils.toString(resentity、charset.forname( "utf-8"))); } // entityutils.consume(res entity)を破壊します。 } catch(Exception e){e.printstacktrace(); }最後に{try {if(response!= null){respons.close(); }} catch(ioexception e){e.printstacktrace(); } try {if(httpclient!= null){httpclient.close(); }} catch(ioexception e){e.printstacktrace(); }}}2.2サーバー側の処理
クライアントのアップロード方法に関係なく、サーバー上の処理は同じです。 httpservletrequestを介してパラメーターを取得した後、取得したアイテムは通常のフォームとファイルフォームに分類されます。
servletfileuploadは、アップロードされたファイルのサイズとエンコード形式を設定できます。
要するに、サーバー側の処理は、得られたパラメーターをHTML形式として扱います。
public void processupload(httpservletrequest request、httpservletResponse応答){file uploadFile = new File(uploadPath); if(!uploadfile.exists()){uploadfile.mkdirs(); } system.out.println( "now on、baby ......"); request.setcharacterencoding( "utf-8"); Response.setcharacterencoding( "utf-8"); //アップロードファイルが存在するかどうかはboolean ismultipart = servletfileupload.ismultipartcontent(request); if(ismultipart){diskFileItemFactory Factory = new DiskFileItemFactory(); //メモリ内のキャッシュされたデータサイズを指定します。ユニットはバイトです。ここでは、1MB Factory.SetsizethReshold(1024*1024)に設定されています。 //ファイルサイズがgetSizethReshold()factory.setRepository(new file( "d:// temp"))の値を超えると、データはハードディスクディレクトリに保存されます。 //新しいファイルの作成ハンドラーservletfileupload upload = new servletfileupload(Factory); //単一のアップロードされたファイルの最大サイズ、ユニット:バイト、50MB upload.setFilesizeMax(50 * 1024 * 1024)に設定します。 //一度にアップロードされた複数のファイルの合計サイズを指定します。ユニット:バイト、50MB upload.setsizemax(50 * 1024 * 1024)に設定します。 upload.setheaderencoding( "utf-8"); List <FileItem> items = null; try {// parse request requestアイテム= upload.parserequest(request); } catch(fileuploadexception e){e.printstacktrace(); } if(items!= null){// parse form item iterator <fileitem> iter = items.iterator(); while(iter.hasnext()){fileitem item = iter.next(); //それが通常のフォームの場合属性の場合(item.isformfield()){//入力に相当する名前属性<入力型= "text" name = "content"> string name = item.getFieldName(); //入力文字列値の値属性= item.getString(); System.out.println( "Property:" + name + "属性値:" +値); } //それがファイルのアップロードである場合else {//属性名文字列fieldname = item.getFieldName(); //ファイルパス文字列filename = item.getName(); filename = filename.substring(filename.lastindexof( "/") + 1); //アップロードされたファイルのファイル名を取得{item.write(upload(upload、filename)); } catch(Exception e){e.printstacktrace(); }}}}}} respons.addheader( "token"、 "hello"); }処理後、サーバーはヘッダー内のクライアントに返される簡単な情報を設定できます。リターンクライアントがストリームの場合、ストリームサイズを事前に設定する必要があります!
Response.setContentLength((int)file.length());
3つのファイルのダウンロード
ファイルのダウンロードは、httpclientのgetMethod、httpgetメソッド、および元のhttpurlconnectionメソッドを使用して実装できます。
3.1クライアント処理
3.1.1 getMethodメソッド
ここのhttpclientはorg.apache.commons.httpclient.httpclientです。
public void download(String RemoteFileName、String localFileName){httpclient client = new httpclient(); getMethod get = null; fileoutputStream出力= null; try {get = new getMethod(url_str); get.setRequestHeader( "username"、username); get.setRequestheader( "passwd"、passwd); get.setRequestheader( "filename"、remoteFileName); int i = client.executemethod(get); if(success == i){system.out.println( "tokenの応答値:" + get.Get.SeSPonseHeader( "Token")); file storefile = new file(localfilename); output = new FileOutputStream(storeFile); //ネットワークリソースのバイト配列を取得し、ファイルoutput.write(get.getResponseBody())に書き込みます。 } else {system.out.println( "ファイルをダウンロードする例外が発生します。エラーコードは:" + i); }} catch(例外e){e.printstacktrace(); }最後に{try {if(output!= null){output.close(); }} catch(ioexception e){e.printstacktrace(); } get.releaseConnection(); client.gethttpconnectionmanager()。closeidleconnections(0); }}3.1.2 HTTPGETメソッド
ここのhttpclientは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( "username"、username); httpget.addheader( "passwd"、passwd); httpget.addheader( "filename"、remoteFileName); httpresponse httpresponse = httpclient.execute(httpget); httpentity entity = httpresponse.getentity(); in = entity.getContent(); long length = entity.getContentLength(); if(length <= 0){system.out.println( "ダウンロードファイルは存在しません!");戻る; } system.out.println( "tokenの応答値:" + httpresponse.getfirstheader( "token"));ファイルfile = new file(localfilename); if(!file.exists()){file.createNewFile(); } out = new fileoutputStream(file); byte [] buffer = new byte [4096]; int readlength = 0; while((readlength = in.read(buffer))> 0){byte [] bytes = new byte [readlength]; System.ArrayCopy(Buffer、0、Bytes、0、ReadLength); out.write(bytes); } out.flush(); } catch(ioexception e){e.printstacktrace(); } catch(Exception e){e.printstacktrace(); }最後に{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メソッド
public void download3(string remotefileName、string localfilename){fileoutputStream out = null; inputstream in = null; {url url = new url(url_str); urlconnection urlconnection = url.openconnection(); httpurlconnection httpurlconnection =(httpurlconnection)urlconnection; // true-パラメーターを設定しますhttpurlconnection.setdooutput(true); // true - will httpurlconnection.setDoinput(true)から読むことを許可します。 //キャッシュは使用しませんhttpurlconnection.setusecaches(false); // Serialized httpurlconnection.setRequestProperty( "content-type"、 "application/x-java-serialized-object"); //デフォルトはget httpurlconnection.setRequestMethod( "post"); httpurlconnection.setRequestProperty( "Connection"、 "Keep-Alive"); httpurlconnection.setRequestProperty( "charsert"、 "utf-8"); // 1分httpurlconnection.setConnectTimeout(60000); // 1分httpurlconnection.setReadTimeout(60000); httpurlconnection.addrequestproperty( "username"、username); httpurlconnection.addrequestproperty( "passwd"、passwd); httpurlconnection.addrequestproperty( "filename"、remoteFileName); // server(tcp)に接続httpurlconnection.connect(); in = httpurlconnection.getInputStream(); // server file = new File(localfileName)にリクエストを// server file = new File( if(!file.exists()){file.createNewFile(); } out = new fileoutputStream(file); byte [] buffer = new byte [4096]; int readlength = 0; while((readlength = in.read(buffer))> 0){byte [] bytes = new byte [readlength]; System.ArrayCopy(Buffer、0、Bytes、0、ReadLength); out.write(bytes); } out.flush(); } catch(Exception e){e.printstacktrace(); }最後に{try {if(in!= null){in.close(); }} catch(ioexception e){e.printstacktrace(); } try {if(out!= null){out.close(); }} catch(ioexception e){e.printstacktrace(); }}}3.2サーバー側の処理
クライアントは異なる方法で処理しますが、サーバーは同じです。
public voidプロセスダウンロード(httpservletrequest request、httpservletresponse応答){int buffer_size = 4096; inputstream in = null; outputStream out = null; system.out.println( "cone on、baby ......"); try {request.setcharacterencoding( "utf-8"); Response.setcharacterencoding( "utf-8"); Response.setContentType( "Application/Octet-Stream");文字列username = request.getheader( "username"); string passwd = request.getheader( "passwd");文字列filename = request.getheader( "filename"); system.out.println( "username:" + username); system.out.println( "passwd:" + passwd); system.out.println( "filename:" + filename); //リクエストが合法かどうかを確認するなど、パスされたユーザー名とPassWDに基づいてさらに処理を実行できます。ファイル= newファイル(ダウンロード + "//" + filename); Response.setContentLength((int)file.length()); Response.setheader( "Accept-ranges"、 "bytes"); int readlength = 0; in = new BufferedInputStream(new FileInputStream(file)、buffer_size); out = new BufferedOutputStream(Response.getOutputStream()); byte [] buffer = new byte [buffer_size]; while((readlength = in.read(buffer))> 0){byte [] bytes = new byte [readlength]; System.ArrayCopy(Buffer、0、Bytes、0、ReadLength); out.write(bytes); } out.flush(); Response.Addheader( "Token"、 "Hello 1"); } catch(Exception e){e.printstacktrace(); Response.Addheader( "Token"、 "Hello 2"); }最後に{if(in!= null){try {in.close(); } catch(ioException e){}} if(out!= null){try {out.close(); } catch(ioexception e){}}}}4つの要約
HTTPCLIENTの最も基本的な機能は、HTTPメソッドを実行することです。 HTTPメソッドの実行には、1つ以上のHTTPリクエスト/HTTP応答の相互作用が含まれます。通常、このプロセスはhttpClientによって自動的に処理され、ユーザーに対して透過的です。ユーザーはHTTPリクエストオブジェクトを提供するだけで、HTTPCLIENTはHTTPリクエストをターゲットサーバーに送信し、サーバーの応答を受信します。 HTTP要求が正常に実行されない場合、HTTPPClientは例外をスローします。したがって、コードを書くときに最終的に処理することに注意してください。
すべてのHTTPリクエストには、メソッド名、リクエストURI、HTTPバージョン番号など、リクエスト行があります。 HTTPCLIENTは、HTTP/1.1で定義されているすべてのHTTPメソッドをサポートします。上記のアップロードは投稿を使用し、ダウンロードは取得されます。
現在、org.apache.commons.httpclient.httpclientをもっと使用しています。それは私次第です〜
上記は、httpclientを使用してファイルを実装する方法のすべての内容です。誰もがwulin.comをもっとサポートできることを願っています〜