【问题标题】:Using ASIHTTPRequest to POST nested params using a NSDictionary使用 ASIHTTPRequest 使用 NSDictionary 发布嵌套参数
【发布时间】:2011-11-04 20:14:55
【问题描述】:

试图将嵌套参数的信息发布到 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];
}

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

【问题讨论】:

    标签: iphone ios post nsdictionary asihttprequest


    【解决方案1】:

    尝试将字典作为 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]];
    

    当您使用 appendPostData 时,您不能使用任何 addPostValue。您必须将所有内容都放入字典中。

    【讨论】:

    • 我已经尝试过这样做 [request addPostValue:[assetDictionary JSONRepresentation] forKey:@"asset"];我在 Rails 服务器上遇到了同样的错误“TypeError (can't convert Symbol to Integer)”,这似乎完全没有意义......
    • 可能是因为你的字符串中有逗号,因为逗号是 JSON 的分隔符。尝试用其他东西替换你的刺痛中的昏迷,看看它是否有效 - stringByReplacingOccurrencesOfString:withString:
    • 我的测试数据还没有包含任何逗号。
    • 应该这样吗?代码示例是正确的实现吗?
    • 很遗憾没有,仍然无法。这似乎应该可以做到。
    【解决方案2】:

    这是在 iOS 上使用 JSONKit 的工作代码的 sn-p。

    [request addRequestHeader:@"Content-Type" value:@"application/json"];
    
    NSMutableDictionary *requestDict = [[NSMutableDictionary alloc] init];
    [requestDict setObject:@"iSteve" forKey:@"UserId"];
    [requestDict setObject:@"1" forKey:@"CompanyCode"];
    [requestDict setObject:@"IN" forKey:@"LineOfBusiness"];
    [requestDict setObject:@"M" forKey:@"LineOfBusinessClassification"];
    [requestDict setObject:pricingVariablesListString forKey:@"CarQuoteString"];
    [request appendPostData:[requestDict JSONData]];
    

    【讨论】:

    • 在 jQuery 中 .appendPostData 在 IE 中不起作用。我正在使用 IE 10 有什么解决方法吗? JavaScript 运行时错误:对象不支持属性或方法“appendPostData”
    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多