0

次のコードから予期しない結果が得られます。

- (NSData *)postDataWithDict:(NSDictionary *)postDict
{
    // Assume key is urlValid
    NSUInteger postCount = [postDict count];
    NSMutableArray *buildArray = [[NSMutableArray alloc] initWithCapacity:postCount];
    for (NSString *key in postDict) {
        //post data is key=value&key=value&key=value...

        // start with key
        NSMutableString *arrayLine = [NSMutableString stringWithString:key];

        [arrayLine appendString:@"="];

        // analyze and then append value
        id postValue = [postDict objectForKey:key];
        if ([postValue isKindOfClass:[NSNumber class]]) {
            NSString *valueString = [NSString stringWithFormat:@"%@",postValue];
            [arrayLine appendString:valueString];
        }
        else if ([postValue isKindOfClass:[NSString class]]) {
            NSString *urlEncodedString = [self urlEncodeValue:postValue];
            [arrayLine appendString:urlEncodedString];
        }
        else {

            NSLog(@"postKey: %@, postValue class:%@", key, [postValue class]);
            NSError *jsonError = nil;
            NSData *jsonData = [NSJSONSerialization dataWithJSONObject:postValue
                                                               options:0
                                                                 error:&jsonError];
            if (jsonError != nil) {
                NSLog(@"JSON serialization failed: %@ - %@", [jsonError localizedDescription], [jsonError userInfo]);
                NSLog(@"value: %@", postValue);
            }
            else {
                // need to urlencode
                NSString *stringifyJSON = [NSString stringWithUTF8String:[jsonData bytes]];
                NSString *urlJSONstring = [self urlEncodeValue:stringifyJSON];
                [arrayLine appendString:urlJSONstring];
            }
        }
        [buildArray addObject:arrayLine];
    }
    NSString *postString = [buildArray componentsJoinedByString:@"&"];
    NSData *postData = [postString dataUsingEncoding:NSUTF8StringEncoding];

    //testing
    NSLog(@"Post Dict: %@", postDict);
    NSLog(@"Post Array: %@", buildArray);
    NSLog(@"Post String: %@", postString);
    NSLog(@"Post Data: %@", [NSString stringWithUTF8String:[postData bytes]]);

    return postData;
}

私の//テストログの結果:

 Post Dict: {
    authenticationString = b3210c0bc6d2c47f4c2f7eeea12e063d;
    dataMode = updateSingle;
    dateCreated = "374300293.81108";
    dateModified = "374609294.313093";
    dateSynced = "374610683.588062";
    entityName = CommodityTypes;
    myName = 21;
    sortKey = 21;
    username = iPhoneAdamek;
    usernameString = iPhoneAdamek;
    uuidKey = "53403EAE-DD4F-4226-A979-316EF7F43991";
}

Post Dict は良さそうです。ちょうど私が欲しかったもの。

2012-11-14 13:31:23.640 FoodyU[11393:907] Post Array: (
    "myName=21",
    "dataMode=updateSingle",
    "dateSynced=374610683.588062",
    "uuidKey=53403EAE-DD4F-4226-A979-316EF7F43991",
    "sortKey=21",
    "dateModified=374609294.313093",
    "entityName=CommodityTypes",
    "dateCreated=374300293.81108",
    "authenticationString=b3210c0bc6d2c47f4c2f7eeea12e063d",
    "usernameString=iPhoneAdamek",
    "username=iPhoneAdamek"
)

ポストアレイは良さそうです。文字列はすべて、HTTP POST 文字列に対して連結されるように設定されています。

2012-11-14 13:31:23.641 FoodyU[11393:907] Post String: myName=21&dataMode=updateSingle&dateSynced=374610683.588062&uuidKey=53403EAE-DD4F-4226-A979-316EF7F43991&sortKey=21&dateModified=374609294.313093&entityName=CommodityTypes&dateCreated=374300293.81108&authenticationString=b3210c0bc6d2c47f4c2f7eeea12e063d&usernameString=iPhoneAdamek&username=iPhoneAdamek

ポストストリングは良さそうです。で使用するデータに変換する準備が整いました[NSMutableURLRequest setHTTPBody:postData]

2012-11-14 13:31:23.643 FoodyU[11393:907] Post Data: myName=21&dataMode=updateSingle&dateSynced=374610683.588062&uuidKey=53403EAE-DD4F-4226-A979-316EF7F43991&sortKey=21&dateModified=374609294.313093&entityName=CommodityTypes&dateCreated=374300293.81108&authenticationString=b3210c0bc6d2c47f4c2f7eeea12e063d&usernameString=iPhoneAdamek&username=iPhoneAdamekoneAdamek;
    usernameString = iPhoneAdamek;
    uuidKey = "53403EAE-DD4F-4226-A

なんだ???どのよう&username=iPhoneAdamekになりました&username=iPhoneAdamekoneAdamek; usernameString = iPhoneAdamek; uuidKey = "53403EAE-DD4F-4226-Aか?

私はココアにかなり慣れていません。何か問題がありますか:

NSData *postData = [postString dataUsingEncoding:NSUTF8StringEncoding];

また

NSLog(@"Post Data: %@", [NSString stringWithUTF8String:[postData bytes]]);
4

1 に答える 1

3

asを使用するべきではありませんNSLogNSData

NSLog(@"Post Data: %@", [NSString stringWithUTF8String:[postData bytes]]);

代わりに、

NSLog(@"Post Data: %@", [[NSString alloc] initWithData:postData encoding:NSUTF8StringEncoding]);

[NSString stringWithUTF8String:[postData bytes]]常に予期しない結果を返します。

バイトのドキュメントによると、

bytes: 受信者のコンテンツへのポインタを返します。

そして、AppleのドキュメントにstringWithUTF8Stringよると、

stringWithUTF8String: UTF8でエンコードされたバイトの指定されたC配列からデータをコピーして作成された文字列を返します。 パラメータ:bytes-UTF8エンコーディングのNULLで終了するバイトのC配列。

したがって、を使用している場合はNULLで終了[postData bytes]しません。したがって、withを使用している場合は、NULLで終了するまでメモリに書き込まれたデータを返します。stringWithUTF8String

于 2012-11-14T19:14:57.883 に答える