2013-10-31 34 views
4

我在我的應用中打開一個簡單的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,因爲它可能很長。

回答

0

你可以嘗試以下爲您的AJAX調用?

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

我試圖一束與您的特定示例性組合和設置的,並且這是可靠地發送如預期的數據(即通過去除的contentType說明書和改變請求類型從PUT到POST)唯一的一個。另外,請注意,所有瀏覽器都不支持PUT,因此除非有一些重要原因使用它而不是POST,否則您可能不應該這麼做。

+0

只是嘗試了你的建議,它不工作。無論你在「數據」屬性中指定了什麼,它都無法通向它應該在的HTTP主體。如果指定了「contentType」的值,則無關緊要。 – oradyvan

+0

我懷疑WebKit實現中有一個錯誤。我已經向蘋果的bug追蹤器發佈了一個錯誤報告,到目前爲止它仍處於開放狀態。我希望這個問題在即將發佈的iOS版本中得到解決。 – oradyvan