ora*_*van 5 javascript ajax uiwebview nsurlrequest ios
我正在我的应用程序的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>
Run Code Online (Sandbox Code Playgroud)
为了简单起见,我从代码中省略了成功和错误处理程序,因为我的问题与真正回复请求无关。
我正在使用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
Run Code Online (Sandbox Code Playgroud)
然后,我运行该应用程序,点击“通过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)
Run Code Online (Sandbox Code Playgroud)
如您所见,HTTP请求主体为空。我已经尝试过使用POST方法,并获得完全相同的输出,但Method: POST在控制台中仅有区别。
当使用GET方法时,我也会得到空的HTTP正文,但这实际上是预期的,因为putValue来自表单的字符串到达HTTP请求的URL中。
您能否就这个问题提供建议,或者至少告诉我我做错了什么?我需要获取传递的值作为HTTP正文内容而不是URL,因为它可能很长。
您可以尝试以下 AJAX 调用吗?
$.ajax({
type: "POST",
url: "data/info/put",
data: 'key='+encodeURIComponent(value),
dataType: "text"
});
Run Code Online (Sandbox Code Playgroud)
我使用您的特定示例尝试了一系列组合和设置,这是唯一能够按预期可靠发送数据的组合和设置(即通过删除 contentType 规范并将请求类型从 PUT 更改为 POST)。另请注意,并非所有浏览器都支持 PUT,因此除非有某些关键原因需要使用它而不是 POST,否则您可能不应该这样做。