0

以下のコードは iPad アプリで HTTP リクエストを Node.js Web サーバーに送信するために使用され、次のエラーが発生しますが、通常の HTML + ブラウザー フォームでは正常に動作します。

サーバーはNode.js +手ごわいもので、マルチパートパーサーがあり、このエラーでこのコード行でのみ停止します:

メッセージ: パーサー エラー、29162 バイト中 0 バイトが解析されました

スタック: エラー: パーサー エラー、IncomingForm.write (/usr/local/lib/node/.npm/formidable/0.9.8/package/lib/formidable/incoming_form.js:120:17) で解析された 29162 バイトの 0着信メッセージ。(/usr/local/lib/node/.npm/formidable/0.9.8/package/lib/formidable/incoming_form.js:73:12)

at IncomingMessage.emit (events:27:15)
at HTTPParser.onBody (http:100:23)
at Stream.ondata (http:763:22)
at IOWatcher.callback (net:494:29)
at node.js:768:9

これは 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];

送信されたリクエストの形式が正しくありませんか? もしそうなら、なぜ、どのようにそれを行うべきですか?

4

1 に答える 1

4

実際、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 がこれを解析するために使用しているコンポーネントは、非常にうるさいです。解析コンポーネントへのパッチがありますが、まだプロジェクトに組み込まれていません。

于 2013-03-27T23:41:25.787 に答える