使用ASDHTTPRequest使用NSDictionary对嵌套的params进行POST

Kyl*_*yle 5 iphone post nsdictionary asihttprequest ios

试图将嵌套参数的信息发布到rails应用程序并遇到一些麻烦.

#pragma mark - Begin Network Operations
- (void)beginNetworkOperation {
    NSURL *requestURL = [NSURL URLWithString:[self retrieveURL]];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:requestURL];

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0
    [request setShouldContinueWhenAppEntersBackground:YES];
#endif

    [request setRequestMethod:@"PUT"];

    [request addRequestHeader:@"Content-Type" value:@"application/json"];

    [request addPostValue:strClientId forKey:@"client_id"];
    [request addPostValue:strAccessToken forKey:@"access_token"];

    NSDictionary *assetDictionary = [NSDictionary dictionaryWithObject:self.tags forKey:@"tags"];
    [request addPostValue:assetDictionary forKey:@"asset"];

    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestFinished:)];
    [request setDidFailSelector:@selector(requestFailed:)];
    [request startSynchronous];
}
Run Code Online (Sandbox Code Playgroud)

self.tags只是一个带有逗号分隔值的NSString,但是一旦到达rails服务器,就无法读取tags参数(params [:asset] [:tags]).

Mat*_*ecu 2

尝试将字典作为 JSON 字符串而不是字典对象传递。

您可以使用 iOS5 JSON 库来做到这一点,或者使用这个库来获得更高的兼容性:

https://github.com/stig/json-framework

我所做的是使用appendPostData,因为我非常确定设置标头(addRequestHeader)和使用addPostValue 不是兼容的函数。这是我的代码的示例:

ASIFormDataRequest *request;
[request addRequestHeader:@"Content-Type" value:@"application/json"];
[request appendPostData:[[SBJsonWriter new] dataWithObject:myDictionaryToPassAsAnArgument]];
Run Code Online (Sandbox Code Playgroud)

当您使用appendPostData时,您不能使用任何addPostValue。你必须把所有的东西都放进字典里。