将NSDictionary的NSArray发布到Ruby Web服务

时间:2012-12-20 05:30:43

标签: ios web-services nsjsonserialization

我一直在尝试POST REST一个JSON object服务NSArray,其中包含NSDictionaries NSArrayNSDictionaries。 我一直在为其他服务做这个,但奇怪的是,其中没有一个包括JSON NSArray,所以对于其他情况,它非常直接创建所需的NSDictionaries,但是对于这个新的我认为这只是添加myDict = [NSDictionary dictionaryWithObjectsAndKeys:@"NFS", @"ticket[serie]",@"123",@"ticket[someID]",[NSArray arrayWithObject:[NSDictionary dictionaryWithObjectsAndKeys:@"99SKU1", @"product_id",@"1",@"quantity",nil]],@"lineItems",nil]; 的{​​{1}},但显然不是。{这就是我如何创建原始对象以准备发送它:

URLConnection

然后,我将该字典转换为NSData对象,准备将其发送到if ([NSJSONSerialization isValidJSONObject:myDict]) { myData = [NSJSONSerialization dataWithJSONObject:myDict options:0 error:&theErrorIfAny]; // Send to webservice (myData) }

{"ticket[serie]"=>"NFS"
    "ticket[someID]"=>"123"
    "lineItems"=>[{"product_id"=>"99SKU1","quantity"=>"1"}]
    "ticket"=>{}}

我无权访问Ruby代码,但我可以访问服务器吐出到文件的日志文件,这就是我得到的:

"ticket"=>{}

除了额外的行之外,一切似乎都很好:NSArray就像我用一个额外的空字典填充请求一样。我已经通过删除myDict中除了一个项目以外的所有项目来尝试此请求,甚至删除其中包含NSDictionaries的嵌套"ticket"=>{},我仍然看到JSONSerialization行的结尾处请求。

顺便说一句,网络服务是用Ruby完成的,我没有直接访问它。我可以对这样做的人发表评论,但是他们只是耸耸肩,争辩说如果我使用curl -d从终端做同样的呼叫......我会从服务器得到正确的响应。那么可能是+ (NSURLConnection *)postRequest:(NSData *)dataRequest toServerURL:(NSString *)serverURL onPort:(int)port withTimeOut:(NSTimeInterval)timeOut charSet:(char *)charset withDelegate:(id<NSURLConnectionDelegate>)myDelegate toServiceNamed:(NSString *)serviceName { NSString *postDataLength = [NSString stringWithFormat:@"%d", [dataRequest length]]; DebugLog(@"bytes to send:%@", postDataLength); NSMutableURLRequest *postRequest; if (port == 0) { postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", serverURL, serviceName]] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:timeOut]; } else { postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@:%d/%@", serverURL, port, serviceName]] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:timeOut]; } [postRequest setHTTPMethod:@"POST"]; [postRequest setValue:postDataLength forHTTPHeaderField:@"Content-Length"]; if (charset == nil || strcmp(charset, "")) { charset = "utf-8"; } [postRequest setValue:[NSString stringWithFormat:@"application/json; charset=%s", charset] forHTTPHeaderField:@"Content-Type"]; [postRequest setHTTPBody:dataRequest]; return [[NSURLConnection alloc] initWithRequest:postRequest delegate:myDelegate]; } 对象或者我正在创建呼叫的方式?:

{{1}}

对某些经过验证的知识来源的任何评论或观点都会很棒。

1 个答案:

答案 0 :(得分:0)

显然,额外的行(ticket =&gt; {})是由Ruby生成的输出,它显示它作为票证密钥的字典接收的内容。所以我不得不将请求更改为对象字典,其中该字典只有两个键,一个用于票证,另一个用于lineItems。就这样说,就像Ruby首先期待结构一样。

为了澄清,这是请求的预期方式(JSON格式):

{
    ticket:{serie:NFS, someID:123},
    lineItems:[{product_id:99SKU1, quantity:1}]
}