0

サーバーに定期的にデータを送信し、応答コードを受信するメソッドがあります。そのために NSURLConnection の sendAsynchronousRequest を実装しましたが、小さなデータでも問題なく動作していました。アプリの一般的なタスクであるbase64でエンコードされた画像の送信をテストする機会があり、エンコードされた画像の数文字の後に途切れることがわかりました。関連するコードは次のとおりです。

// Initial setup
NSString *urlStr = @"https://example.com/";
urlRequest = [[NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr]] retain];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

// The actual sending part
- (void)sendRequest:(NSString *)reqStr {

@try {
    if (sendRequestStatus == kRequestState_waiting) {
        sendRequestStatus = kRequestState_processing;
        NSString *dataStr = [NSString stringWithFormat:@"request_data=%@",reqStr];
        NSLog(@"datastr is %@",dataStr);
        NSData *dataForUrl = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"nsdata length is: %i",[dataForUrl length]);
        [urlRequest setHTTPBody:dataForUrl];
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];

        [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *res, NSData *data, NSError *err) {
          // housekeeping
        }];
    }
}

ログにエラーはありません。dataStr を出力するログ ステートメントは、正しいデータを出力します。データの長さを出力するログ ステートメントは 183384 バイトを出力します。これは画像に適しているようです。ただし、サーバー上では、エンコードされた画像データの開始後、投稿本文が数文字切り取られます。たとえば/9j/4、サーバーが最後に受信した文字は 4 です。

これを iPhone 3Gs でテストしています。これは phonegap アプリケーションであり、私の Android バージョンで同じことをテストしても問題がないため、問題はデータ送信の実装にあるはずです。iPhone 4または4sを使用している別のテスターから問題を聞いていないので、処理速度の問題である可能性があります. これを締めて、ポスト本体が切断されないようにするにはどうすればよいですか?

4

1 に答える 1

0

私はそれをテストしませんでしたが、おそらく問題はこれです:

[urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

私はこれを試してみます:

[urlRequest setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];

base 64 でエンコードされた文字列を送信しているためです。

于 2013-03-19T13:52:28.060 に答える