2015-10-09 13 views
9

Tôi đang sử dụng AFNetworking 2.0.AFNetworking serializes dấu gạch chéo về phía trước làm cho tải trọng JSON không hợp lệ

Trong AFNetworking, AFHTTPRequestOperationManager đối tượng có một API:

(AFHTTPRequestOperation *)POST:(NSString *)URLString 
        parameters:(id)parameters 
         success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure 

Nó chấp nhận NSDictionary như params cho Payload JSON mà chúng tôi muốn 'POST' lên máy chủ. Trong tải trọng của tôi, tôi đã sau cặp khóa-giá trị:

"buttonActionParam":"/catalog/special/international-calling"

gửi bài máy chủ tải trọng này trả về JSON không hợp lệ. Nhìn vào tải trọng trên máy chủ bên tôi nhận ra rằng AFNetworking đang thực sự gửi:

"buttonActionParam":"\/catalog\/special\/international-calling".

Tôi biết rằng AFNetworking thư viện sử dụng lớp phương pháp NSJSONSerialization 's -dataWithJSONObject:, mà nguyên nhân này. Câu hỏi của tôi là:

Q. Cách khắc phục sự cố này?

+0

Không chắc chắn tôi hiểu câu hỏi: bạn đang nói rằng bạn đang cố gắng gửi "buttonActionParam": "/ catalog/special/international-calling" và đây chính xác là những gì đang được gửi bởi AFNetworking, vì vậy, vấn đề? –

+0

Đã chỉnh sửa câu hỏi của tôi. Đã phải đặt nhân vật thoát. :) –

+0

'NSData' xuất phát từ' NSJSONSerialization' không hoàn toàn giống với những gì bạn thấy ở phía máy chủ - nó hiển thị '{" buttonActionParam ":" \/catalog \/special \/international- gọi "}" trong trình soạn thảo hex của tôi. Tôi tự hỏi nếu đó là một vấn đề mã hóa ký tự - trông giống như máy chủ được gắn bó trong một thoát thêm \ vì lý do nào đó. –

Trả lời

1

Đây là vấn đề. Nó thực sự hoạt động như thiết kế (xem https://stackoverflow.com/a/20448342/669586).

Có 3 giải pháp khả thi:

  1. Make máy chủ của bạn nhận thức được khả năng rằng chuỗi có thể được thoát. Nói chung, đây là giải pháp tốt nhất.

  2. Sử dụng bộ mã hóa JSON khác (ví dụ: SBJson) và mã hóa đối tượng thành NSData thay vì sử dụng bộ nối tiếp mặc định AFNetworking.

  3. Mã hóa sử dụng NSJSONSerialization và sau đó chuyển đổi các dữ liệu dẫn đến một NSString (sử dụng NSUTF8StringEncoding), khử trùng nó và chuyển nó trở lại NSData. Một lần nữa, bạn phải làm điều đó trước khi đưa đối tượng cho AFNetworking.

Cách tốt nhất để thực hiện 2 hoặc 3 là thiết lập một tùy chỉnh requestSerializer trên AFHTTPSessionManager dụ. Ví dụ: xem this answer để biết ví dụ về triển khai 3 (lưu ý trong Swift).

+0

# 2 sẽ hoạt động chỉ khi SBJson được sử dụng sau khi AFNetworking. # 3 Tôi đã thử trước khi đăng. Không hoạt động. Tôi sẽ cố gắng # 1. –

+0

@DeborshiSaha Không, nó chủ yếu là về cách bạn thiết lập bộ nối tiếp.Nếu bạn không cho phép AFNetworking sử dụng serializer yêu cầu mặc định của nó (sử dụng 'NSJSONSerialization'), thì bạn không có vấn đề gì. – Sulthan

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