5

アプリの UIWebView 内で単純な HTML ドキュメントを開いています。

<h3>Testing Put</h3>
<form id="testPut" action="onPut">
    <div>
        <p><input type="text" id="putValue" name="putValue" value="some value string goes here" size="100"/></p>
        <p><input type="submit" value="Submit via PUT"/></p>
    </div>
</form>

<script>
$('#testPut').submit(function(ev) {
    ev.preventDefault();
    var value = $('#putValue').val();

    $.ajax({
        type: "PUT",
        url: "data/info/put",
        contentType: "text/plain; charset=utf-8",
        data: encodeURIComponent(value),
        dataType: "text"
    });
});
</script>

簡単にするために、コードから成功とエラーのハンドラーを省略しました。これは、私の問題が実際に要求に応答することとは関係がないためです。

XMLHttpRequestjQuery 1.10.2 を使用していますが、純粋なオブジェクトを使用するとまったく同じ結果が得られます。

これは、Ajax リクエストをメソッドでキャッチできないという既知の問題であるUIWebViewDelegateため、非常に単純な子​​孫を作成NSURLProtocolし、コントローラーの-viewDidLoadメソッドに登録することにしました。

@implementation MyProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    // only "data/info" requests are welcome
    NSRange range = [[request.URL absoluteString] rangeOfString:@"data/info"];
    return NSNotFound != range.location;
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    return request;
}

- (void)startLoading {
    NSURLRequest *request = self.request;

    NSLog(@"%@", request);
    NSLog(@"Headers: %@", [request allHTTPHeaderFields]);
    NSLog(@"Method: %@", [request HTTPMethod]);
    NSLog(@"Body: %@", [request HTTPBody]);
}

- (void)stopLoading {}

@end

次に、アプリを実行し、[Submit via PUT] ボタンをタップして、Xcode のコンソール ログで次のことを確認します。

2013-10-31 16:38:28.077 TestHTTPPUTiOS[1608:4a03] <NSURLRequest: 0x8942c20> { URL: file:///Users/oradyvanyuk/Library/Application%20Support/iPhone%20Simulator/7.0.3/Applications/90232D0E-3243-4517-A2B7-15A17371E117/TestHTTPPUTiOS.app/data/info/put }
2013-10-31 16:38:28.079 TestHTTPPUTiOS[1608:4a03] Headers: {
    Accept = "text/plain, */*; q=0.01";
    "Content-Type" = "text/plain; charset=utf-8";
    Origin = "file://";
    "X-Requested-With" = XMLHttpRequest;
}
2013-10-31 16:38:28.079 TestHTTPPUTiOS[1608:4a03] Method: PUT
2013-10-31 16:38:28.080 TestHTTPPUTiOS[1608:4a03] Body: (null)

ご覧のとおり、HTTP 要求の本文は空です。POST メソッドを使用してみましたが、まったく同じ出力が得られましたがMethod: POST、コンソールのみが異なります。

GET メソッドを使用すると、空の HTTP ボディも取得されputValueますが、フォームからの文字列が HTTP リクエストの URL に到着するため、これは実際には予想されます。

この問題についてアドバイスしていただけますか、少なくとも私が何か間違っているかどうか教えてください。渡された値は非常に長い可能性があるため、URL ではなく HTTP 本文コンテンツとして取得する必要があります。

4

1 に答える 1

0

AJAX 呼び出しで次のことを試すことができますか?

$.ajax({
    type: "POST",
    url: "data/info/put",
    data: 'key='+encodeURIComponent(value),
    dataType: "text"
});

特定の例で一連の組み合わせと設定を試しましたが、これが期待どおりにデータを確実に送信した唯一のものでした(つまり、 contentType 仕様を削除し、リクエストタイプを PUT から POST に変更することにより)。また、PUT はすべてのブラウザーでサポートされているわけではないため、POST の代わりに使用する重大な理由がない限り、使用しないでください。

于 2013-12-06T17:35:18.650 に答える