問題タブ [httpurlconnection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - HTTPUrlConnectionでContentHandlerFactoryの設定を解除する方法
HTTPUrlConnection.setContentHandlerFactory()
メソッドは、ファクトリがすでに定義されていることを示す例外をスローします。という事は承知しています。ファクトリの設定を解除して、コンテンツハンドラファクトリを変更することはできますか?
java - アクティビティがHTTP接続を行うまで、AndroidサービスはHTTP接続を行うことができません
これが私の投稿です:
私は自分自身をできるだけ明確にしようとしています:
- 私のアプリケーションのクラスの説明
- コードアーキテクチャの説明(サービス別およびアクティビティ別)
- 何が起こるべきかの説明
- 実際に起こることの説明
- Logcat
- ソースコード
アプリケーションクラスの説明
私のアプリケーションには次のようなものがあります。
MAJService
クラスによって管理される、起動時に起動するサービスConsoNRJ
クラスによって管理されるアクティビティ- HTTP経由でHTMLページを取得するワーカークラス。
MAJDonnees
InfosConso
呼び出され、ワーカーをインスタンス化するヘルパークラスMAJDonnees
。
処理の説明
サービスが開始されると、次のようになります。
InfosConso
オブジェクトを作成する- この
InfosConso
オブジェクトはMAJDonnees
- この
MAJDonnees
オブジェクトは、を使用してHTTPクエリを実行しますHttpURLConnection
アクティビティはほぼ同じです。
InfosConso
オブジェクトを作成する- この
InfosConso
オブジェクトはMAJDonnees
- この
MAJDonnees
オブジェクトはを作成しAsyncTask
、を使用してHTTPクエリを実行しますHttpURLConnection
あなたは私のコードを理解するのに役立つかもしれないグラフを見ることができます:
code.google.com/p/consonrj/wiki/CodeStructure
何が起こるべきか
アクティビティとサービスは基本的に(クラス内で)同じコードを実行するためMAJDonnees
、HTMLページをフェッチして解析するというまったく同じように動作する必要があります。
実際に何が起こるか
サービスから実行すると、でのHttpURLConnections
処理中に悪い結果が返されMAJDonnees
ます。呼び出されたHttpURLConnections
インスタンスh
は無効なHTTP応答を返します:h.getResponseCode()
-1を返します。
より多くのデバッグ情報を取得する方法がわかりません。
ただし、アクティビティが開始されると、HTTP接続は処理中MAJDonnees
に機能し、実際h.getResponseCode()
に200(HTTP 200 OK)を返します。
次に、サービスが再度実行されると(x分ごとに実行されるようにスケジュールされています)、HTTP接続が機能します。
Logcat
サービスのログキャットを最初に実行し、次にアクティビティを実行し、次にサービスを再度実行して、動作を確認できます。
http://pastebin.com/DGc8fym2
申し訳ありませんが、フランス語です。まだ推測できるといいのですが。:)
ソースコード
必要に応じて、次のソース全体を確認できます:
code.google.com/p/consonrj/source/browse/#svn/trunk
私がこれをデバッグするのを手伝ってくれることを願っています!私のサービスは、デバイスの起動時およびx時間/日ごとにインターネットからデータをフェッチする必要があり、最初にアクティビティを開始する必要はありません。
ありがとう。
java - HttpURLConnection: connect() を呼び出す必要がありますか?
私が見た多くの例では、 を明示的に呼び出していませんconnect()
。代わりに、getInputStream()
orを使用するだけgetResponseCode()
です。
接続を必要とするこれらの HttpURLConnection メソッドはすべて、connect()
自分自身を呼び出すだけだと思いますか?
connect()
HttpURLConnection に対して明示的に呼び出す必要がある場合はありますか?
java - HttpURLConnection: 応答全体を読まなければならないのはどういうことですか?
私の現在の問題は、これと非常によく似ています。
downloadFile(URL)
新しい HttpURLConnection を作成し、それを開いて読み取り、結果を返す関数があります。同じ URL でこの関数を複数回呼び出すと、2 回目はほとんどの場合、応答コード -1 が返されます (ただし、例外はスローされません!!!)。
その質問の一番の答えは非常に役に立ちますが、私が理解しようとしていることがいくつかあります。
では、http.keepAlive を false に設定すると問題が解決する場合、正確には何を示しているのでしょうか? サーバーが http プロトコルに違反する方法で応答していることは? または、コードが何らかの形でプロトコルに違反している可能性が高いですか? トレースは何を教えてくれますか? 何を探すべきですか?
そして、これとの取引は何ですか:
エラーストリームからすべてを読み取る必要があります。そうしないと、次の接続が混乱し、それが -1 の原因になります。
これは、応答が何らかのタイプのエラー (応答コードは何ですか?) である場合、ストリームを完全に読み取る必要があることを意味しますか? また、http リクエストを試みるたびに、基本的に新しい接続を作成disconnect()
し、最後にそれを ing します。
ただし、私の場合、401などは取得していません。それは常に 200 です。しかし、私の 2 番目の接続はほとんどの場合失敗します。これは、私が読んでいないはずの他のデータがあることを意味しますか(エラーストリームを完全に読み取る必要があるのと同様の方法で)?
これに光を当てるのを手伝ってください。私が見逃している基本的な http プロトコルの理解があるように感じます。
PS Apache HttpClient だけを使用していた場合、これらすべてのプロトコルの詳細を処理する必要はありませんか? それは私のためにすべてを処理しますか?
java - How to use java.net.URLConnection to fire and handle HTTP requests
Use of java.net.URLConnection
is asked about pretty often here, and the Oracle tutorial is too concise about it.
That tutorial basically only shows how to fire a GET request and read the response. It doesn't explain anywhere how to use it to, among others, perform a POST request, set request headers, read response headers, deal with cookies, submit a HTML form, upload a file, etc.
So, how can I use java.net.URLConnection
to fire and handle "advanced" HTTP requests?
buffer - HttpURLConnection InputStream の読み取り - 手動バッファまたは BufferedInputStream?
HttpURLConnection の InputStream を読み取るとき、次のいずれかを使用する理由はありますか? 例で両方が使用されているのを見てきました。
手動バッファ:
BufferedInputStream
EDIT私はまだ一般的にHTTPに不慣れですが、頭に浮かぶ1つの考慮事項は、永続的なHTTP接続を使用している場合、入力ストリームが空になるまで読み取ることができないということですよね? その場合、メッセージの長さを読み取って、その長さの入力ストリームを読み取る必要はありませんか?
同様に、永続的な接続を使用していない場合、ストリームを適切に読み取るという点で、私が含めたコードは 100% 適切ですか?
xml - JSP を使用してリモート Web サイトの XML ファイルを読み込む方法は?
アプリケーションで Java サーブレットと JSP を使用しており、リモート XML ファイルを読み取って HTML に適切にレンダリングし、Web ページに表示する必要があります...読み取りプロセスに使用されるテクノロジは何ですか? HTTPURLConnection クラスを使用してxml ファイルの内容を読み取るか、他の方法がありますか? また、サーブレットをコントローラーとして使用し、JSP をビューとして使用する場合、このプロセスでサーブレットと JSP の責任はどうなるでしょうか?サーブレットは XML ファイル全体を読み取ってから、読み取った出力を JSP に渡して、出力するだけにする必要があります。たとえば、XSLを使用して適切にレンダリングしますか?
助けてくれる人からの連絡を本当に望んでいます、
敬具
java - urlconnection の入力ストリームから読み取るときの速度低下 (byte[] とバッファを使用しても)
問題を解決するために 2 日間を費やし、膨大な数の記事を読んだ後、私はついに立ち上がってアドバイスを求めることにしました (ここに来たのは初めてです)。
今目の前の問題に - 私は、ゲームからのAPIデータ、つまりバトルログを解析するプログラムを書いています。データベースには大量のエントリ (2000 万以上) が存在するため、各戦闘ログ ページの解析速度が非常に重要になります。
解析されるページは次のようになります: http://api.erepublik.com/v1/feeds/battle_logs/10000/0. (クロムを使用している場合はソースコードを参照してください。ページが正しく表示されません)。1000 件のヒット エントリがあり、その後に少し戦闘情報が続きます (最後のページには明らかに 1000 件未満になります)。平均して、ページには 175000 文字、UTF-8 エンコーディング、xml 形式 (v 1.0) が含まれます。プログラムは適切な PC でローカルに実行され、メモリは事実上無制限です (そのため、バイト [250000] の作成はまったく問題ありません)。
フォーマットが変わることはありません。これは非常に便利です。
今、私はいつものように始めました:
ここから楽しい部分が始まりました。System.currentTimeMillis() を使用してプロファイリングを実行し、時間がかかるものとそうでないものを見つけました。このメソッドの呼び出しは平均で 200 ミリ秒しかかかりません
ネットワーク操作からは 200 ミリ秒がかなり予想されますが、私はそれで問題ありません。しかし、何らかの方法でinputStreamを解析すると(文字列に読み込む/Java XMLパーサーを使用する/別のByteArrayStreamに読み込む)、プロセスに1000ミリ秒以上かかります!
たとえば、このコードは、上記の getContentStream() から取得したストリームをこのメソッドに直接渡す場合、1000 ミリ秒かかります。
このコードも、最初の InputStream 'is' が渡された場合、約 920 ミリ秒かかります (コード自体を読み取らないでください。文字を直接カウントして必要なデータを抽出するだけです。これは、厳格な API フィード形式のおかげで実行できます)。 :
デフォルトの BufferedReader を置き換えてみました
これはあまり変わりませんでした。2 番目の試みは、A と B の間のコードを次のように置き換えることでした。 Iterator it = IOUtils.lineIterator(is, "UTF-8");
今回は AB が 0 ミリ秒で BC が 1000 ミリ秒だったことを除いて、同じ結果でした。そのため、it.next() へのすべての呼び出しはかなりの時間を消費していたに違いありません (IOUtils は apache-commons-io ライブラリからのものです)。
そして、ここに原因があります - ストリームを文字列に解析するのにかかった時間は、すべてのケースでイテレータまたは BufferedReader によって約 1000 ミリ秒でしたが、コードの残りの部分は 0 ミリ秒かかりました (たとえば無関係)。これは、ストリームを LinkedList に解析したり、ストリームを反復処理したりすると、何らかの理由で多くのシステム リソースが消費されたことを意味します。質問は-なぜですか?それはただの Java の作り方なのですか...いや...それはただのばかげているので、別の実験を行いました。
メイン メソッドで、getWebPageAsStream() の後に追加しました。
InputStream->byte[] の変換には、再び 1000 ミリ秒かかりました。これは、多くの人が InputStream を読み取る方法として提案していますが、それでも遅いです。上記の 2 つのパーサー メソッド (convertToXML() と convertBattlePagetoXMLWithoutDOM()) は、「is」の代わりに「is2」が渡されると、4 つのケースすべてで完了までに 50 ミリ秒未満かかりました。
ブロックを解除する前にストリームが接続を閉じるのを待つという提案を読んだので、代わりに HttpComponentsClient 4.0 ( http://hc.apache.org/httpcomponents-client/index.html ) を使用してみましたが、最初の InputStream には同じくらい時間がかかりましたパースします。たとえば、このコード:
処理にさらに時間がかかり(ネットワークだけで50ミリ秒以上)、ストリームの解析時間は同じままでした. 明らかに、毎回 HttpClient とプロパティを作成しないようにインスタンス化できますが (ネットワーク時間の短縮)、ストリームの問題はその影響を受けません。
では、問題の中心に行き着きます。最初の URLConnection InputStream (または HttpClient InputStream) の処理に時間がかかるのはなぜですか? ローカルで作成された同じサイズのストリームとコンテンツは桁違いに高速です。つまり、最初の応答は既に RAM のどこかにあり、バイト [] から同じストリームが作成されたばかりの場合と比較して、処理が非常に遅い理由がわかりません。
何百万ものエントリと何千ものページを解析しなければならないことを考えると、1 ページあたり約 1.5 秒の合計処理時間は、かなり長すぎるように思えます。
何か案は?
PS 追加のコードが必要な場合は質問してください - 解析後に私が行う唯一のことは、PreparedStatement を作成し、エントリを 1000 以上のパックで JavaDB に入れることです。パフォーマンスは問題ありません ~ 200ms/1000 エントリ、prb はより多くのキャッシュで最適化できますしかし、私はそれをあまり調べませんでした。
java - httpURLConnectionとApacheCommonshttp
JavaのデフォルトのHttpURLConnectionクラスの使用で問題が発生したかどうかを知りたいだけです。ApacheCommonsに切り替える原因となったある種のバグ。
それとも、サードパーティのhttp libの誕生を正当化するのは、クラスが公開する(醜い)インターフェイスだけですか?
開示:java.netに深刻な問題があることに対するいくつかの議論を聞きましたが、Javaコアディストリビューションの一部であるクラスがJDKのいくつかのリリース後もまだ問題を抱えているとは信じがたいです。
java - getRequestProperty("Authorization") は常に null を返します
HTTP リクエストの認証ヘッダーを読み取ろうとしています (何かを追加する必要があるため) が、ヘッダー値が常に null になります。他のヘッダーは問題なく動作します。
私は何か間違ったことをしていますか?これは「セキュリティ」機能ですか?これを URLConnection で機能させる方法はありますか、それとも別の HTTP クライアント ライブラリを使用する必要がありますか?