データを取得するのではなく、ポストで客観的cに渡す
-
10-10-2019 - |
質問
URLインターセプトメソッドを使用して、URLエンコードパラメーターとしてデータを渡し、NSURLProtocolを使用してリクエストをインターセプトすることにより、JavaScriptから客観的Cにデータを渡していますが、10,000文字の長い文字列などの大量のデータを送信したいと考えていますがGETリクエストでは実用的ではないようです。右?
客観的なCがUIWeBViewから送信された投稿データを傍受する方法はありますか?
もしそうなら、私はまだnsurlprotocolを使用していますか、そしてどのようにポストデータを取得することができますか?
そうでない場合、他の方法があります。uiwebviewから客観的なcに大量のデータを渡すことができますか?
解決
次のようなコードを使用する場合:
@implementation AppProtocolHandler + (void)registerSpecialProtocol { static BOOL inited = NO; if (!inited) { inited = YES; [NSURLProtocol registerClass:[AppProtocolHandler class]]; } } - (void)handleRequest { NSURLRequest *request = [self request]; // null when via app:// but works when via http:// NSLog(@"[request HTTPBody]: %@", [request HTTPBody]); } + (BOOL)canInitWithRequest:(NSURLRequest *)request { return YES; } + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { return request; } @end
一部のプロトコルへのリクエスト(例: app://
) [request HTTPBody]
であること null
. 。しかし、あなたが通り抜けるなら http://
そうして [request HTTPBody]
anの要求データがあります NSData
予想どおりのオブジェクト。
したがって、あなたのjavaScriptは次のように見えるはずです:
$.post("http://test/hello/world", {'data':"foo bar"});
と いいえ 何かのようなもの:
$.post("app://test/hello/world", {'data':"foo bar"});
他のヒント
リクエストは代表者によって傍受されるため、ポストAJAXリクエストを送信し、必要なパラメーターと値を詰めてから送信できます。すべての値が傍受され、これまでと同じ方法でそれらを使用できます。 jqueryを使用して簡単な投稿リクエストを送信できます。
$ .post( "toobjc.html"、{'data': "10k文字長い文字列などここに..."});
間違いなく投稿を使用する必要があります。あなたはそれのリクエストを設定する必要があります。データがエンコードされていることを確認し、他のいくつかの詳細を処理する必要がある場合があります。
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:myMimeType forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", requestData.length]
forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:requestData];
[self.playerView loadRequest: request];
または、マルチパートドキュメントまたはフォーム値を送信することもできます。