HttpURLConnection は Java で WEB リソースをリクエストするために使用できます。
1. URL リクエストのカテゴリ
は、GET リクエストと POST リクエストの 2 つのカテゴリに分かれています。 2 つの違いは次のとおりです:
a:) get リクエストは静的ページを取得することも、URL 文字列の後にパラメータを置いてサーブレットに渡すこともできます
b:) post と get の違いは、投稿のパラメータは URL 文字列には配置されず、http リクエストの本文に配置されます。
2. URLConnection オブジェクトの問題
Java コード
URL = new URL("http://localhost:8080/TestHttpURLConnectionPro.do");
URLConnection = url.openConnection (); / ここでの UrlConnection オブジェクトは、実際には URL の
// リクエスト プロトコル (ここでは http) に基づいています。
' s 's 's 's ‐ ‐ ‐ ‐ HttpURLConnection を使用する
3. HttpURLConnection オブジェクトのパラメータの問題
Java コード
// これはポストリクエストであるため、パラメータを http ボディに配置する必要があるため、設定する必要があります。デフォルトは false です。
httpUrlConnection.setDoInput(true);
//リクエストはキャッシュを使用できません
httpUrlConnection.setUseCaches(false);
// Set 送信されるコンテンツ タイプはシリアル化可能な Java オブジェクトであると判断されます
// (これが設定されていない場合、シリアル化されたオブジェクトを送信するとき、デフォルトの WEB サービスがこのタイプではない場合、java.io.EOFException がスローされる可能性があります)
httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");
//リクエストメソッドを「POST」に設定します。デフォルトは GET
httpUrlConnection.setRequestMethod("POST ");
//Connection、上記の項目 2 の url.openConnection() からこの時点までの設定を完了する必要があります。接続する前に、
Java コード // ここで getOutputStream は暗黙的に接続します (つまり、上記の connect() メソッドを呼び出すのと同じように、 // したがって、開発中に上記の connect() を呼び出さなくても大丈夫です) 。 OutputStream outStrm = httpUrlConnection.getOutputStream(); 5. HttpURLConnection のデータ書き込みとデータ送信の問題 Java コード // 次に、出力ストリーム オブジェクトを介してオブジェクト出力ストリーム オブジェクトを構築し、シリアル化可能な出力オブジェクトを実現します。 ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); //データをオブジェクト出力ストリームに書き込み、データはメモリ バッファに保存されます objOutputStrm.writeObject(new String("I am test data" ) ;現時点では、これ以上データをオブジェクト出力ストリームに書き込むことはできません。以前に書き込まれたデータはメモリ バッファーに存在します。// 準備された http リクエストは、以下の getInputStream() 関数が呼び出されたときにのみ正式にサーバーに送信されます。 . objOutputStm.close(); // HttpURLConnection 接続オブジェクトの getInputStream() 関数を呼び出します。 // メモリ バッファーにカプセル化された完全な HTTP リクエスト メッセージをサーバーに送信します。 InputStream inStrm = httpConn.getInputStream(); // <===実際にリクエストを送信するコードセグメントはここにあります // 上記の httpConn.getInputStream() メソッドが呼び出されています。 request 終了しました。 オブジェクト出力ストリームへの次の出力は無意味です // オブジェクト出力ストリームが close() メソッドを呼び出していない場合でも、次の操作はオブジェクト出力ストリームにデータを書き込みません。
// したがって、データを再送信する場合は、接続を再作成し、パラメータを再設定し、ストリームオブジェクトを再作成し、データを再書き込みし、
// データを再送信する必要があります(これらの操作は再調査する必要はありません。さらに調査する必要があります)
objOutputStm(new String(""));
Javaコード
OutputStream os = httpConn.getOutputStream();
param = new String (); = = + 電話番号 +
" "&msg=" + java.net.URLEncoder.encode(msg,"GBK ") ; ;
os.write(param.getBytes());
7. ネットワーク異常時にプログラムがフリーズして実行を継続しないようにするためのタイムアウト設定
System.setProperty(" sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTimeout", "30000");
ここで: sun.net. client.defaultConnectTimeout: タイムアウトホストへの接続のタイムアウト (単位: ミリ秒)
sun.net.client.defaultReadTimeout: ホストからのデータ読み取りのタイムアウト (単位: ミリ秒)
JDK 1.5 より前のバージョンのみを渡すことができます これら 2 つのシステム プロパティを次のように設定しますネットワークタイムアウトを制御します。 1.5では、HttpURLConnectionの親クラスURLConnectionの次の2つのメソッドも使用できます:
setConnectTimeout: 接続ホストのタイムアウトを設定します(単位: ミリ秒)
setReadTimeout: ホストからのデータ読み取りのタイムアウトを設定します(単位: ミリ秒) )
例:
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setReadTimeout(30000);
概要:
a : HttpURLConnection の connect() 関数は、実際にはサーバーとの TCP 接続を確立するだけであり、実際には http リクエストを送信しません。
post であっても get であっても、http リクエストは実際には HttpURLConnection の getInputStream() 関数まで正式に送信されません。b: POST を使用して URL リクエストを送信する場合、URL リクエストパラメータの設定順序が最優先されます。
接続オブジェクト (設定された関数) のすべての設定は、connect() 関数の前に実行する必要があります。 OutputStream での書き込み操作は、inputStream での読み取り操作よりも前に行う必要があります。これらの順序は、実際には http リクエストの形式によって決まります。
inputStream 読み取り操作が outputStream 書き込み操作よりも前にある場合、例外がスローされます:java.net.ProtocolException: 入力の読み取り後に出力を書き込むことはできません....
c: http リクエストは実際には 2 つの部分で構成されます。は http ヘッダーです。この http リクエストに関するすべての設定は http ヘッダーで定義されます。
もう 1 つはコンテンツです。connect() 関数は、HttpURLConnection オブジェクトの設定値に基づいて http ヘッダー情報を生成するため、connect 関数を呼び出す前に、
すべての設定を準備する必要があります。d: http ヘッダーの直後に http リクエストの本文が続きます。本文の内容は、outputStream ストリームを通じて書き込まれます。実際、outputStream は単なる文字列ストリームです。書き込まれた内容はすぐにネットワークに送信されませんが、outputStream が閉じられると、入力内容に基づいて http ボディが生成されます。
この時点で、http によって要求されたすべての準備が整いました。 getInputStream() 関数が呼び出されると、準備された http リクエストが正式にサーバーに送信され、この http リクエストに対するサーバーの戻り情報を読み取るための入力ストリームが返されます。 httpリクエストはgetInputStream(httpヘッダーとボディを含む)中に送信されているため、getInputStream()関数
の後に接続オブジェクトを設定する(httpヘッダー情報を変更する)か、outputStreamに書き込む(ボディを変更する) は無意味です。これらの操作を実行すると例外が発生します。