我在我的應用中打開一個簡單的HTML文檔內的UIWebView:AJAX在UIWebView的類型PUT或POST的未通過HTTP主體
<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>
爲了簡單起見,我省略成功和錯誤處理程序從代碼因爲我的問題與真正回覆請求無關。
我使用的是jQuery 1.10.2但是,當使用純粹的XMLHttpRequest
對象時,我得到完全相同的結果。
由於這是已知的問題,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
然後我運行應用程序,點擊按鈕「通過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。
你能否就這個問題提出建議,或者至少告訴我我是否做錯了什麼?我需要獲取傳遞的值作爲HTTP正文內容,而不是URL,因爲它可能很長。
只是嘗試了你的建議,它不工作。無論你在「數據」屬性中指定了什麼,它都無法通向它應該在的HTTP主體。如果指定了「contentType」的值,則無關緊要。 – oradyvan
我懷疑WebKit實現中有一個錯誤。我已經向蘋果的bug追蹤器發佈了一個錯誤報告,到目前爲止它仍處於開放狀態。我希望這個問題在即將發佈的iOS版本中得到解決。 – oradyvan