2011-11-04 35 views
5

Đang cố gắng đăng thông tin cho các tham số lồng nhau vào ứng dụng đường ray và gặp sự cố.Sử dụng ASIHTTPRequest để POST các tham số lồng nhau bằng cách sử dụng NSDictionary

#pragma mark - Begin Network Operations 
- (void)beginNetworkOperation { 
    NSURL *requestURL = [NSURL URLWithString:[self retrieveURL]]; 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:requestURL]; 

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 
    [request setShouldContinueWhenAppEntersBackground:YES]; 
#endif 

    [request setRequestMethod:@"PUT"]; 

    [request addRequestHeader:@"Content-Type" value:@"application/json"]; 

    [request addPostValue:strClientId forKey:@"client_id"]; 
    [request addPostValue:strAccessToken forKey:@"access_token"]; 

    NSDictionary *assetDictionary = [NSDictionary dictionaryWithObject:self.tags forKey:@"tags"]; 
    [request addPostValue:assetDictionary forKey:@"asset"]; 

    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(requestFinished:)]; 
    [request setDidFailSelector:@selector(requestFailed:)]; 
    [request startSynchronous]; 
} 

self.tags chỉ là một NSString với các giá trị dấu phẩy tách ra, tuy nhiên một lần đến tại máy chủ ray tham số thẻ không thể đọc được (params [: tài sản] [: Thẻ]).

Trả lời

2

Cố gắng chuyển từ điển của bạn dưới dạng chuỗi JSON và không phải là đối tượng từ điển.

Bạn có thể làm điều đó bằng iOS5 JSON thư viện, hoặc một này để tương thích hơn:

https://github.com/stig/json-framework

Những gì tôi làm là sử dụng appendPostData vì tôi khá chắc chắn rằng thiết lập các tiêu đề (addRequestHeader) và sử dụng addPostValue không phải là chức năng tương thích. Dưới đây là một ví dụ về mã của tôi:

ASIFormDataRequest *request; 
[request addRequestHeader:@"Content-Type" value:@"application/json"]; 
[request appendPostData:[[SBJsonWriter new] dataWithObject:myDictionaryToPassAsAnArgument]]; 

Khi bạn sử dụng appendPostData, bạn không thể sử dụng bất kỳ addPostValue. Bạn phải đặt mọi thứ trong từ điển.

+0

Tôi đã thử điều này bằng cách thực hiện [request addPostValue: [assetDictionary JSONRepresentation] forKey: @ "asset"]; và tôi nhận được cùng một lỗi trên máy chủ đường ray "TypeError (không thể chuyển đổi Symbol thành Integer)" mà thực sự có vẻ không có ý nghĩa gì cả ... – Kyle

+0

Có thể đó là vì các hôn mê trong chuỗi của bạn, bởi vì hôn mê là dấu phân cách của JSON. Cố gắng thay thế comas trong sting của bạn bằng cách khác để xem nếu nó hoạt động bằng cách sử dụng - stringByReplacingOccurrencesOfString: withString: – MatLecu

+0

Dữ liệu thử nghiệm của tôi chưa chứa bất kỳ dấu phẩy nào. – Kyle

2

Đây là đoạn mã hoạt động với JSONKit trên iOS.

[request addRequestHeader:@"Content-Type" value:@"application/json"]; 

NSMutableDictionary *requestDict = [[NSMutableDictionary alloc] init]; 
[requestDict setObject:@"iSteve" forKey:@"UserId"]; 
[requestDict setObject:@"1" forKey:@"CompanyCode"]; 
[requestDict setObject:@"IN" forKey:@"LineOfBusiness"]; 
[requestDict setObject:@"M" forKey:@"LineOfBusinessClassification"]; 
[requestDict setObject:pricingVariablesListString forKey:@"CarQuoteString"]; 
[request appendPostData:[requestDict JSONData]]; 
+0

Trong jQuery .appendPostData không hoạt động trong IE. Tôi đang sử dụng IE 10 có cách nào khác không? Lỗi thời gian chạy JavaScript: Đối tượng không hỗ trợ thuộc tính hoặc phương thức 'appendPostData' – JaiSankarN

Các vấn đề liên quan