0

私は、他のオブジェクトの中に含まれるサービス a を試みPOSTRESTきました。私は他のサービスに対してこれを行ってきましたが、不思議なことにそれらのどれにも 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 の 1 つを除くすべてのアイテムを削除し、ネストされたNSArraywithも削除して、このリクエストを既に試しましたが、リクエストの最後NSDictionariesにまだその"ticket"=>{}行が表示されます。

ところで、Web サービスは 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 によって生成された出力であり、受け取ったものをチケット キーの辞書として表示しています。そのため、リクエストをオブジェクトのディクショナリに変更する必要がありました。そのディクショナリには、チケット用と lineItems 用の 2 つのキーしかありません。そういう意味ではRubyが最初から期待していた構造と同じでした。

明確にするために、これは要求が予想される方法です (JSON 形式):

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