Cocoa 这是来自iPad的格式错误的http请求,它会杀死Node.js多部分解析器吗

Cocoa 这是来自iPad的格式错误的http请求,它会杀死Node.js多部分解析器吗,cocoa,http,ipad,node.js,multipart,Cocoa,Http,Ipad,Node.js,Multipart,下面的代码在iPad应用程序中用于向Node.js web服务器发送HTTP请求,这会产生以下错误,但在使用常规HTML+浏览器表单时效果良好 服务器是Node.js+,它有一个多部分解析器,只有在以下情况下才会失效: 消息:分析器错误,0/29162 解析的字节数 堆栈:错误:解析器错误,0/29162 解析的字节数 在IncomingForm.write(/usr/local/lib/node/.npm/forward/0.9.8/package/lib/forward/incoming_f

下面的代码在iPad应用程序中用于向Node.js web服务器发送HTTP请求,这会产生以下错误,但在使用常规HTML+浏览器表单时效果良好

服务器是Node.js+,它有一个多部分解析器,只有在以下情况下才会失效:

消息:分析器错误,0/29162 解析的字节数

堆栈:错误:解析器错误,0/29162 解析的字节数 在IncomingForm.write(/usr/local/lib/node/.npm/forward/0.9.8/package/lib/forward/incoming_form.js:120:17) 在收到消息时。(/usr/local/lib/node/.npm/undervable/0.9.8/package/lib/undervable/incoming_form.js:73:12)

这是iPad的代码:

NSMutableURLRequest * theRequest   = [[NSMutableURLRequest alloc] initWithURL:url];

[theRequest setTimeoutInterval:60];

[theRequest setHTTPMethod:@"POST"];

NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];

[theRequest addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSMutableData *body = [NSMutableData data];


//media 

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];    
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"image\"; filename=\"iosaudio.cai\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:theAudio]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// setting the body of the post to the reqeust
[theRequest setHTTPBody:body];

请求发送的格式是否错误?如果是这样的话,为什么要这样做?如何这样做?

事实上,在发布到Node.js的一些iOS代码中,我们也遇到了同样的问题。我们的问题是第一条边界之前的CR-LF。Node.js使用一个组件解析MIME,该组件对格式非常挑剔,前面的CR-LF字符被视为格式错误。我不确定,但最后一个边界后的CR-LF可能会导致相同的问题。您的第一个边界应如下所示:

[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
您的最终边界应如下所示:

[body appendData:[[NSString stringWithFormat:@"\r\n--%@--",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
注意,中间边界应包括边界前后的CR-LF:

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

我对规范的阅读表明,您可以在第一个边界之前和最后一个边界之后拥有数据,但是解析器应该忽略这些区域。Node.js用来解析这一点的组件非常挑剔。解析组件有一个补丁,但它还没有进入到项目中。

我们实际上只是在发布到Node.js的一些iOS代码中遇到了同样的问题。我们的问题是第一条边界之前的CR-LF。Node.js使用一个组件解析MIME,该组件对格式非常挑剔,前面的CR-LF字符被视为格式错误。我不确定,但最后一个边界后的CR-LF可能会导致相同的问题。您的第一个边界应如下所示:

[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
您的最终边界应如下所示:

[body appendData:[[NSString stringWithFormat:@"\r\n--%@--",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
注意,中间边界应包括边界前后的CR-LF:

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

我对规范的阅读表明,您可以在第一个边界之前和最后一个边界之后拥有数据,但是解析器应该忽略这些区域。Node.js用来解析这一点的组件非常挑剔。解析组件有一个补丁,但它还没有进入项目。

我不知道您是否生成了一个格式错误的请求,但是ASIHTTPRequest()使创建多部分表单帖子变得非常简单,您不必再担心这些细节,也不必在NSString文本(
@“…
)上使用
stringWithString:
)。它已经是一个字符串了。我很怀疑你是否使用了
dataWithData:
:你真的需要复制你已经拥有的数据对象吗?@Robot K-谢谢,特里奇不知道你是否生成了一个格式错误的请求,但是ASIHTTPRequest()使创建多部分表单帖子变得非常简单,您不必再担心这些细节,也不必在NSString文本(
@“…
)上使用
stringWithString:
)。它已经是一个字符串了。我很怀疑你是否使用了
dataWithData:
:你真的需要复制你已经拥有的数据对象吗?@Robot K-谢谢你这么做了你是个救命恩人!!!谢谢!8个小时我不知道这个多部分请求有什么问题!你是救命恩人!!!谢谢!8个小时我不知道这个多部分请求有什么问题!