問題タブ [nsurlprotocol]
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.
objective-c - NSURLProtocol をサブクラス化するときにインスタンス メソッドを呼び出す
UIWebView を使用していて、この例のように正常に動作する ajax 呼び出しをインターセプトしたいので、NSURLProtocol をサブクラス化する必要がありました。問題の原因となるリクエストからデータを取得する+ (BOOL)canInitWithRequest:(NSURLRequest *)request
必要があります。インスタンスメソッドを呼び出してデータを処理する必要がありますが、クラスメソッドであるためできません。
リクエストの内容に基づいてインスタンス メソッドを呼び出すにはどうすればよいですか?
ios - iOS: カスタム NSURL を NSURLProtocol に渡す
UIWebView loadRequest:
の実装に到達するように、いくつかの追加情報を とともに渡す必要がありNSURLProtocol
ます。NSURLRequest
情報も保持する必要があるため、情報をバインドすることはできませんNSURLRequest mainDocumentURL
。だから私はそれをサブクラス化してNSURL
構築NSURLRequest
しました。NSURLRequest
に到達するのNSURLProtocol startLoading
は、私がフィードしたインスタンスではないことはすでにわかっていたので、URL読み込みシステムがそれを使用することを素朴に期待して、UIWebView loadRequest
私も実装しました。NSURL copyWithZone
現在、NSURLProtocol canInitWithRequest
は合理的に予想されるように 1 回ではなく、少なくとも 4 回呼び出されていstartLoading
ます。その最初の 2 回、着信にNSURLRequest
はまだカスタムNSURL
実装が含まれています。次に、という不幸な内部コードが私のカスタムの をCFURLCopyAbsoluteURL
要求し、次の(および後続の) はすでに完全に新しいを取得しています。は呼び出されず、私のサブクラスは失われます。absoluteURL
NSURL
canInitWithRequest
startLoading
NSURLRequest
NSURL
copyWithZone
NSURL
あきらめて、URL 文字列に直接何かを添付する劣悪で脆弱なソリューションを実装する前に、より高いレベルのウィザードに尋ねたいと思いますNSURLProtocol
。CFURLCopyAbsoluteURL
私のカスタムインスタンスを運んでいます。カスタム NSURL クラスの新しいインスタンスを再度返すことでハッキングを試みましNSURL absoluteURL
たが、役に立ちませんでした。機能面で期待できることはいくつかありましNSURLProtocol setProperty
たが、今ではかなり役に立たないようです。URL 読み込みシステムは、すべての新しいインスタンスを喜んで作成し、NSURLRequest
到着したものは、誤っNSURLProtocol
て入力されたものと同じように見えます。UIWebView
更新:投稿をできるだけ短くしたかったのですが、最初の返信でさえ技術的な背景を尋ねているので、ここに行きます:UIWebView
アプリに複数の があります. これらのビューは同時にリクエストを実行する可能性があり、同じ URL に対するリクエストを絶対に実行できます。デスクトップブラウザのタブのようなものです。しかし、私はそれぞれの特定の到着UIWebView
の起源がどれであったかを区別する必要があります. 各 URL 要求で運ばれるコンテキストが必要です。複数の URL がいつでも同じ URL をロードしている可能性があるため、単純に URL をデータにマップすることはできません。NSURLRequest
NSURLProtocol
UIWebViews
更新 2:コンテキスト情報を添付することNSURL
が推奨され、私の理解では、唯一の使用可能なものです。問題は、ページ内で参照されるリソース (画像など) のリクエストがまったく通過せずUIWebViewDelegate
、NSURLProtocol
直接到達することです。まで、そのようなリクエストに触れたり、検査したり、変更したりする機会はありませんNSURLProtocol
。このようなリクエストの唯一のコンテキスト リンクは、NSURLRequest mainDocumentURL
.
java - 既存の URL スキームのアダプタとしてのカスタム URL スキーム
別の URL から返されるリソースでアダプターとして機能するカスタム URL スキームを定義する、クリーンで仕様に準拠した方法はありますか?
ローカル ファイルの復号化された表現を返すカスタム URL プロトコルを既に定義しています。たとえば、私のコードでは、
から取得するファイルを透過的に復号化しますfile:///path/to/file
。ただし、これはローカル ファイルに対してのみ機能します。つまらない!URL 仕様が、新しい URL スキームを既存の URL の一種のアダプターとして定義することによって、これを一般化できるクリーンな方法を可能にすることを願っています。
たとえば、代わりにdecrypted:
、リソースを取得する別の絶対 URL の前に付けるアダプターとして使用できるカスタム URL スキームを定義できますか? それから私はただすることができました
またはdecrypted:http://server/path/to/file
またはdecrypted:ftp://server/path/to/file
または何でも。これにより、私のdecrypted:
プロトコルは、ファイルの取得を行う既存のすべての URL スキームで構成可能になります。
jar:
Java はURL スキームで同様のことを行いますが、 RFC 3986を読むと、この Java テクノロジは URL 仕様に違反しているように見えます。埋め込まれた URL は適切にバイト エンコードされていないため、埋め込まれた URL の/
、?
、または#
区切り記号は、埋め込み URL のセグメント区切り記号として公式に扱われるべきです (それがJarURLConnectionの動作ではない場合でも)。スペック内に収まりたい。
これを行うための適切で正しい方法はありますか?それとも、埋め込まれた URL 全体をバイトエンコードする唯一のオプションですか (つまり、decrypted:file%3A%2F%2F%2Fpath%2Fto%2Ffile
あまり良くありません)。
私が提案していること (URL アダプター) は他の場所で行われていますか? それとも、これが誤った方向に導かれるより深い理由がありますか?
ios - NSURLProtocol を使用して iOS でネットワーク呼び出し (REST) をインターセプトする方法
クライアントがアプリケーションで行うネットワーク呼び出しをインターセプトする必要がありますが、呼び出しは正常に完了します。ソリューションが NSURLProtocol 抽象クラスを実装し、アプリケーションに登録していることがわかりました。
これで問題が解決したように見えましたが、壁にぶつかり、タイムアウトを要求しました。iOS 5.0 をサポートする必要があるため、AFNetworking の最新バージョン 1.x を使用しています。
したがって、最初のリクエストのタイムアウトを延長する方法、または問題に対する別のより適切な解決策を見つける必要があります。
これが私がやったことです。NSURLProtocol 実装:
ネットワーク ViewController:
ログ出力は次のとおりです。
2014-01-15 17:07:19.518 InterceptionHttp[510:1303] Intercept Request startLoading 2014-01-15 17:07:19.520 InterceptionHttp[510:1303] URL: http://requestb.in/19kcum21 2014-01- 15 17:07:19.521 InterceptionHttp[510:1303] HTTP メソッド: POST 2014-01-15 17:07:19.522 InterceptionHttp[510:1303] データ: REQUEST AFNETWORKING 2014-01-15 17:07:29.522 InterceptionHttp[510: 400b] Intercept Request stopLoading 2014-01-15 17:07:29.522 InterceptionHttp[510:70b] AFNetworking エラー: エラー Domain=NSURLErrorDomain Code=-1001 「要求がタイムアウトしました。」UserInfo=0x8a5cb10 {NSErrorFailingURLStringKey= http://requestb.in/19kcum21、NSErrorFailingURLKey= http://requestb.in/19kcum21, NSLocalizedDescription=リクエストがタイムアウトしました., NSUnderlyingError=0x8a5c220 "リクエストがタイムアウトしました."}
編集:
jqyao の回答と記事を読んだ後、NSURLProtocol のサブクラス化に関するいくつかのトピックを学びました。残念ながら、HTTP をインターセプトすることはまだできません。つまり、元の要求を通常どおり続行する必要があります。
一方、URLProtocol デリゲート セレクターを呼び出す 3 行を追加すると、元の要求は続行されますが、サーバーの応答ではなく、データの応答が返されます。
startLoading
これがメソッドに追加したものです。
これが私の出力ログです。
2014-02-04 17:27:22.253 InterceptionHttp[419:3a03] Intercept Request startLoading 2014-02-04 17:27:22.254 InterceptionHttp[419:3a03] URL: http://requestb.in/tsvc14ts 2014-02- 04 17:27:22.255 InterceptionHttp[419:3a03] HTTP メソッド: POST 2014-02-04 17:27:22.255 InterceptionHttp[419:3a03] データ: { 'メッセージ': 'JSON_MESSAGE' } 2014-02-04 17: 27:22.258 InterceptionHttp[419:70b] AFNetworking 応答: {'メッセージ':'JSON_MESSAGE'} 2014-02-04 17:27:22.260 InterceptionHttp[419:1303] インターセプト リクエスト stopLoading
objective-c - OCMock または OCMockito を使用して NSURLProtocol モックへのメソッド呼び出しを検証するにはどうすればよいですか?
GET リクエストを行うメソッドをテストしたいと思います。
これは不自然な例です:
このメソッドの実装の詳細 (モック、期待値の設定、依存関係の検証など) について心配するよりも、GET 要求が行われたかどうかをテストできるようにしたいと思います。
NSURLProtocolでこれを行うことができると信じていますが、これまでの試みは成功していません。
たとえば、OCMock を使用すると、次のようになります。
canInitWithRequest が呼び出されないため、上記のテストは失敗します。
NSURLProtocol に期待値を設定して、リクエストが行われたことを確認するにはどうすればよいですか?
ios - ビデオ要求の NSURLProtocol が失敗する
NSURLProtocol サブクラスの特別なプロトコル スキームを介して処理されるビデオ リクエストに問題があります。他のすべてのリソース (画像/テキスト) は正しく処理されていますが、ビデオ リクエストが送信されると、「canInitWithRequest」への呼び出しのみが行われ、フォローアップは行われません。そのため、ビデオ リソースが解決されません。今、私は周りを見回しましたが、これに対する明確な解決策は見つかりませんでした。代わりに組み込み HTTP サーバーを使用する人もいますが、それはやり過ぎのようです。これがバグであるかどうか、またはそうでない場合、なぜこの制限があるのか 、回避策があるのか 誰かが知っていますか?
同様の問題: WebView のカスタム NSURLProtocol クラスは、HTML5 ドキュメントにビデオをロードするときに機能しませんが、残念ながら回答がありません。
ios - NSURLProtocol サブクラスで startLoading が呼び出されないのはなぜですか?
NSURLProtocol を見て、いくつかのヘッダーを挿入しようとしています。
しかし、私の startLoading は決して呼び出されません