2011-10-30 43 views
16

Tôi đang cố tìm cách, sử dụng AFNetworking, để đặt tiêu đề Kiểu nội dung là ứng dụng/json và POST với JSON trong phần thân. Các phương thức mà tôi thấy trong tài liệu (postPath và requestWithMethod) đều lấy một từ điển các tham số, mà tôi giả sử được mã hóa theo cú pháp biểu mẫu chuẩn. Có ai biết cách hướng dẫn AFHTTPClient sử dụng JSON cho cơ thể không, hoặc tôi có cần viết yêu cầu của riêng mình không?Đăng JSON làm cơ thể của yêu cầu POST bằng cách sử dụng AFHTTPClient

Trả lời

23

Tôi đã tiếp tục và kiểm tra AFNetworking mới nhất từ ​​master branch. Ra khỏi hộp tôi đã có thể có được những hành vi mong muốn. Tôi nhìn và nó có vẻ như một sự thay đổi gần đây (6 tháng 10), do đó bạn có thể chỉ cần kéo mới nhất.

tôi đã viết đoạn mã sau để thực hiện một yêu cầu:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost:8080/"]]; 
[client postPath:@"hello123" parameters:[NSDictionary dictionaryWithObjectsAndKeys:@"v1", @"k1", @"v2", @"k2", nil] 
     success:^(id object) { 
      NSLog(@"%@", object); 
     } failure:^(NSHTTPURLResponse *response, NSError *error) { 
      NSLog(@"%@", error); 
     }]; 
[client release]; 

Theo ủy quyền của tôi, tôi có thể thấy yêu cầu liệu:

POST /hello123 HTTP/1.1 
Host: localhost:8080 
Accept-Language: en, fr, de, ja, nl, it, es, pt, pt-PT, da, fi, nb, sv, ko, zh-Hans, zh-Hant, ru, pl, tr, uk, ar, hr, cs, el, he, ro, sk, th, id, ms, en-GB, ca, hu, vi, en-us;q=0.8 
User-Agent: info.evanlong.apps.TestSample/1.0 (unknown, iPhone OS 4.3.2, iPhone Simulator, Scale/1.000000) 
Accept-Encoding: gzip 
Content-Type: application/json; charset=utf-8 
Accept: */* 
Content-Length: 21 
Connection: keep-alive 

{"k2":"v2","k1":"v1"} 

Từ nguồn AFHTTPClient bạn có thể thấy rằng JSON mã hóa là mặc định dựa trên line 170line 268.

+11

Huh, tôi đã không nhận ra JSON được thiết lập để được mã hóa mặc định. Đây là một sai lầm (mã hóa biểu mẫu URL luôn luôn là ý định của tôi là mặc định; Tôi không chắc chắn làm thế nào mà trượt vào). @EricAndres: Hãy lưu ý điều này và đặt mã hóa tham số thành JSON theo cách thủ công, với 'self.parameterEncoding = AFJSONParameterEncoding;' trong mã của bạn. – mattt

+0

Tuyệt vời, cảm ơn bạn đã phản hồi. Tôi sẽ thử cài đặt self.parameterEncoding sau khi tôi có cơ hội. –

+0

hmm ... json không phải là mã hóa mặc định, nhưng NVP là (vào đầu năm 2013) – stackOverFlew

13

Đối với tôi, json KHÔNG phải là mã hóa mặc định. Bạn có thể tự thiết lập nó như là mã hóa mặc định như thế này:

(sử dụng mã Evan)

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost:8080/"]]; 

[client setParameterEncoding:AFJSONParameterEncoding]; 

[client postPath:@"hello123" parameters:[NSDictionary dictionaryWithObjectsAndKeys:@"v1", @"k1", @"v2", @"k2", nil] 
     success:^(id object) { 
      NSLog(@"%@", object); 
     } failure:^(NSHTTPURLResponse *response, NSError *error) { 
      NSLog(@"%@", error); 
     }]; 
[client release]; 

phần quan trọng:

[client setParameterEncoding:AFJSONParameterEncoding]; 
+1

Cảm ơn bạn rất nhiều! Bạn đã đúng, '[client setParameterEncoding: AFJSONParameterEncoding];' bị thiếu. Nhưng ngoài ra có vẻ như điều này cũng được yêu cầu cho nó thực sự làm việc với NSDictionary: '[client registerHTTPOperationClass: [lớp AFJSONRequestOperation]];' – thedp

+0

Cảm ơn bạn rất nhiều. Bạn tiết kiệm ngày của tôi !! – kb920

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