2012-12-20 2 views
0

POST에서 REST으로 의 NSArrayNSDictionaries 인 서비스를 시도했습니다. 다른 서비스를 위해이 작업을 해왔지만 이상하게도 NSArrayNSDictionaries입니다. 따라서 다른 경우에는 필요한 바로 가기를 작성하는 것이 매우 편리합니다. 그러나이 새로운 작업에 대해서는 단지 문제 일 뿐이라고 생각했습니다. 에 NSDictionaries을 추가했지만 분명히 그렇지 않습니다. 'NSDictionaries의 NSArray를 Ruby 웹 서비스에 게시하기

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

내가 돈 :

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

, 나는 준비에있는 NSData 객체로 변환하는 사전 URLConnection overa을 보내 : 이것은 내가 그것을 보낼 준비에 원래의 객체를 생성하는 방법이다 t 루비 코드에 액세스 할 수 있지만 서버가 파일에 뱉어 로그 파일에 액세스 할 이것은 내가 무엇을 얻을 수 있습니다 :

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

모든 것이 그 여분의 리터를 제외하고 좋은 것 같다 ine : "ticket"=>{} 내가 여분의 빈 사전으로 요청을 채우는 것 같습니다. 난 이미 myDict에있는 하나의 항목을 제거하여이 요청을 시도했으며 중첩 된 NSArray을 제거하고 그 중 NSDictionaries은 여전히 ​​요청의 끝에 "ticket"=>{} 줄을 볼 수 있습니다.

현재, webservice는 Ruby에서 수행되고 있으며 직접 액세스 할 수 없습니다. 나는 사람들에게 이렇게 말할 수는 있지만, 어깨를 으 sh하고 같은 전화를하지만 터미널에서 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]; 
} 

어떤 의견이나 지점을 만드는거야 뭔가입니다.

+0

당신이 "dataRequest"로그온 할 수 없습니다 : 명확히하기 위해

,이 요청이 (JSON 형식) 예상 어떻게? NSLog (@ "json :: % @ 요청", [NSString 할당] initWithBytes : dataRequest.bytes 길이 : dataRequest.length 인코딩 : NSUTF8StringEncoding]), – user1885297

+0

확실히 ... 여기 있습니다 : 2012-12-20 09 : 47 : 47.942 JSONConfetti [92083 : c07] + [BMPOSTMessages postRequest : toServerURL : onPort : withTimeOut : charSet : withDelegate : toServiceNamed :] LINEA : 75 요청 json :: { "티켓 [serie]": "NFS", "lineItems ": [{"product_id ":"99SKU1 ","수량 ":"1 "}],"티켓 [someID] ":"123 "}> –

답변

0

분명히 그 여분의 줄 (ticket => {{})은 루비가 생산하는 출력물이며 티켓 키 사전으로받은 것을 표시합니다. 그래서 요청은 표제와 lineItem을위한 두 개의 키만있는 객체의 사전이되도록 변경해야했습니다. 그렇게하면 Ruby가 처음에 구조를 기대했던 것과 같습니다.

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