0

我一直在尝试为包含其他对象POSTREST服务 a提供. 我一直在为其他服务执行此操作,但奇怪的是它们都没有包含of ,因此对于其他情况,创建所需的 s 非常简单,但是对于这个新服务,我认为这只是添加of 的问题但显然不是。这就是我创建原始对象以准备发送它的方式:JSON objectNSArrayNSDictionariesNSArrayNSDictionariesJSONNSArrayNSDictionaries

myDict = [NSDictionary dictionaryWithObjectsAndKeys:@"NFS", @"ticket[serie]",@"123",@"ticket[someID]",[NSArray arrayWithObject:[NSDictionary dictionaryWithObjectsAndKeys:@"99SKU1", @"product_id",@"1",@"quantity",nil]],@"lineItems",nil];

然后,我将该字典转换为 NSData 对象,以准备将其发送过来URLConnection

if ([NSJSONSerialization isValidJSONObject:myDict])
{
    myData = [NSJSONSerialization dataWithJSONObject:myDict options:0 error:&theErrorIfAny];
    // Send to webservice (myData)
}

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

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

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

顺便说一句,网络服务是在 Ruby 中完成的,我无法直接访问它。我可以对这样做的人发表评论,但他们只是耸耸肩并争辩说,如果我使用 curl -d 从终端进行相同的调用...我将从服务器获得正确的响应。所以也许是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];
}

任何评论或指向一些经过验证的知识源都会很棒。

4

1 回答 1

0

显然,那条额外的行 (ticket=>{}) 是 Ruby 生成的输出,它显示了它作为ticket key 的字典接收到的内容。因此,我不得不将请求更改为对象字典,其中该字典只有两个键,一个用于票证,另一个用于 lineItems。这么说吧,这就像 Ruby 一开始就期望这个结构一样。

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

{
    ticket:{serie:NFS, someID:123},
    lineItems:[{product_id:99SKU1, quantity:1}]
}
于 2012-12-20T18:19:11.687 回答