2009-10-05 37 views
5

Tôi biết hầu như không có gì về JSON và tôi cần phải gửi một yêu cầu đến một máy chủ và đọc dữ liệu đến từ nó, chỉ sử dụng iPhone.JSON IPHONE: Cách gửi yêu cầu JSON và kéo dữ liệu từ máy chủ?

Tôi đã cố gắng sử dụng jason-framework để làm điều đó, nhưng sau khi đọc tài liệu tôi không thể tìm ra cách xây dựng đối tượng và gửi nó theo yêu cầu. Vì vậy, tôi đã quyết định điều chỉnh một mã khác mà tôi đã thấy ở đây trên SO.

Các Object tôi cần là thế này:

{ "code": xxx}

Ở đây tôi có một vấn đề. Xxx này là một NSData, vì vậy tôi nghi ngờ rằng tôi phải chuyển đổi dữ liệu này thành một chuỗi, sau đó sử dụng chuỗi này để xây dựng một đối tượng và gửi yêu cầu này.

phản ứng máy chủ cũng là một đối tượng JSON, dưới hình thức

{ "câu trả lời": "yyy"} nơi yyy là một số giữa 10000 và 99999

đây là đoạn code tôi có rất xa.

- (NSString *)checkData:(NSData) theData { 
    NSString *jsonObjectString = [self encode:(uint8_t *)theData length:theData.length];  
    NSString *completeString = [NSString stringWithFormat:@"http://www.server.com/check?myData=%@", jsonObjectString];        
    NSURL *urlForValidation = [NSURL URLWithString:completeString];    
    NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];       
    [validationRequest setHTTPMethod:@"POST"];    
    NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil]; 
    [validationRequest release]; 
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding]; 
    NSInteger response = [responseString integerValue]; 
    NSLog(@"%@", responseString); 
    [responseString release]; 
    return responseString; 
} 


- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length { 
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

    NSMutableData *data = [NSMutableData dataWithLength:((length + 2)/3) * 4]; 
    uint8_t *output = (uint8_t *)data.mutableBytes; 

    for (NSInteger i = 0; i < length; i += 3) { 
     NSInteger value = 0; 
     for (NSInteger j = i; j < (i + 3); j++) { 
      value <<= 8; 

      if (j < length) { 
       value |= (0xFF & input[j]); 
      } 
     } 

     NSInteger index = (i/3) * 4; 
     output[index + 0] = table[(value >> 18) & 0x3F]; 
     output[index + 1] =     table[(value >> 12) & 0x3F]; 
     output[index + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; 
     output[index + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; 
    } 

    ret 

    urn [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; 
} 

tất cả mã này cho tôi là lỗi. Hoặc URL BAD hoặc ngoại lệ java.

Điều gì sai với mã này?

Nếu các bạn thích để đưa ra giải pháp khác sử dụng json-framework xin vui lòng cho tôi biết làm thế nào để mã hóa các đối tượng sử dụng mà cặp ("code", "NSData của tôi ở đây chuyển thành chuỗi") ...

nhờ để được giúp đỡ.

Trả lời

17

Khuôn khổ JSON hỗ trợ chuyển đổi Mảng, Từ điển, Chuỗi, Số và Booleans. Vì vậy, những gì bạn muốn làm là chuyển đổi dữ liệu của bạn thành một trong các định dạng này. Kể từ khi dữ liệu của bạn là NSData dễ nhất Cách thứ nhất là để chuyển đổi nó với:

NSString* stringData = [[NSString alloc] initWithData:yourData 
              encoding:NSUTF8StringEncoding]; 

Tùy thuộc vào những gì trong bộ đệm (và nếu máy chủ của bạn có thể xử lý nó), bạn có thể muốn Base64 mã hóa các kết quả (đánh dấu http://www.cocoadev.com/index.pl?BaseSixtyFour nếu bạn don' t có một công cụ chuyển đổi tiện dụng). Bạn thậm chí có thể đi thẳng từ NSData đến một chuỗi được mã hóa Base64.

Bây giờ tạo ra một từ điển với một mục với phím code và giá trị so stringData (từ bước cuối cùng):

NSDictionary* jsonDictionary = [NSDictionary dictionaryWithObject:stringData 
                  forKey:@"code"]; 

này có thể dễ dàng chuyển đổi sang JSON. Chỉ cần nhập JSON.h trong phần đầu mã của bạn, sau đó sử dụng:

NSString* jsonString = [jsonDictionary JSONRepresentation]; 

Dump nó ra và bạn sẽ thấy chuỗi JSON của bạn - một cái gì đó như: {"code" : "{yourstringdata}"; }. Cách dễ nhất để gửi thông tin này đến máy chủ của bạn là sử dụng thư viện ASIHTTPRequest với phương thức POST.

Một khi bạn nhận được kết quả trở lại từ máy chủ trong khuôn khổ JSON có thể phân tích nó trở lại vào một cuốn từ điển và sau đó bạn có thể nhận ra các dữ liệu bạn cần:

NSDictionary* responseDict = [yourJSONResponseStringFromServer JSONValue]; 
NSNumber* answerNum = (NSNumber *) [responseDict objectForKey:@"answer"]; 
int answer = [answerNum intValue]; 
+0

Cảm ơn !!!!!! đó là nó!tài liệu thư viện ASIHTTPRequest là khá không đầy đủ và bề ngoài (không phải lỗi của bạn), nhưng tôi đã quản lý để làm cho nó hoạt động bằng cách sử dụng các hướng dẫn của bạn. Hoàn hảo! Bạn là người đàn ông D! – SpaceDog

+0

Rất vui khi nó hoạt động cho bạn. Đừng từ bỏ ASIHTTPRequest. Nó khá đơn giản một khi bạn nhận được hang của nó. Chỉ có điều là, đừng quên cung cấp các phương thức setDidFinishSelector/setDidFailSelector và thiết lập ủy nhiệm để bạn nhận được thông báo khi mạng không thành công. Có quá nhiều ô chết ở ngoài kia. – Ramin

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