我一直在尝试POST
REST
一个JSON object
服务NSArray
,其中包含NSDictionaries
NSArray
个NSDictionaries
。
我一直在为其他服务做这个,但奇怪的是,其中没有一个包括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
行的结尾处请求。
+ (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}}
对某些经过验证的知识来源的任何评论或观点都会很棒。
答案 0 :(得分:0)
显然,额外的行(ticket =&gt; {})是由Ruby生成的输出,它显示它作为票证密钥的字典接收的内容。所以我不得不将请求更改为对象字典,其中该字典只有两个键,一个用于票证,另一个用于lineItems。就这样说,就像Ruby首先期待结构一样。
为了澄清,这是请求的预期方式(JSON格式):
{
ticket:{serie:NFS, someID:123},
lineItems:[{product_id:99SKU1, quantity:1}]
}