AFNetworking 2.0 : Request API with Content-Type = text/html

afnetworking-logo

AFNetworking เป็น framework สำหรับ iOS ที่ดีมากๆตัวหนึ่ง เอาไว้ใช้สำหรับการติดต่อกับ API ทั้งหมด หรือการจัดการเกี่ยวกับการใช้ network หรือ internet มีการเก็บ cache ให้เราด้วย ทำให้ไม่ต้องทำอะไรยุ่งยากมากนักในการใช้งาน

ปัญหาของวันนี้นั่นก็คือ AFNetworking 2.0 มันมาแล้วครับ support iOS 6 ขึ้นไป ซึ่งมีวิธีการเรียกใช้งานที่เปลี่ยนไปหน่อยนั่นเอง ซึ่งตอนนี้จะมาพูดถึงการ request ครับ ตาม document ของ AFNetworking มีการเรียกใช้ดังนี้

AFNetworking Request

หากใน code ของ PHP  มีการ response ออกมาตาม code ด้านล่าง

PHP echo reponse

จะพบว่า error ออกมาใน Xcode ครับ นั่นคือเราไม่สามารถเรียกข้อมูลออกมาได้

Error Domain=AFNetworkingErrorDomain Code=-1016 “Request failed: unacceptable content-type: text/html” UserInfo=0x8cac2d0 {NSErrorFailingURLKey=http://localhost/test.php, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x8cab4d0> { URL: http://localhost/test.php } { status code: 200, headers {
Connection = “Keep-Alive”;
“Content-Length” = 19;
“Content-Type” = “text/html”;
Date = “Mon, 17 Feb 2014 08:19:56 GMT”;
“Keep-Alive” = “timeout=5, max=100″;
Server = “Apache/2.2.25 (Unix) mod_ssl/2.2.25 OpenSSL/0.9.8y DAV/2 PHP/5.5.3″;
“X-Pad” = “avoid browser bug”;
“X-Powered-By” = “PHP/5.5.3″;
} }, NSLocalizedDescription=Request failed: unacceptable content-type: text/html}

ที่เราผิดจริงๆแล้วคือ Content-Type ครับ ควรจะเป็น application/json

วิธีแก้มี 2 วิธี
วิธีที่ 1. ให้ผู้ส่ง (PHP) เป็นคนกำหนด content-type ใหม่ให้ตรงใจ AFNetworking 2.0 ครับ นั่นคือใน PHP ให้ใส่ code นี้ลงไป

header(‘Content-type: application/json’);

วิธีที่ 2. ให้ผู้รับ (Xcode) เป็นคนกำหนดว่า ไม่ว่าอะไรฉันก็รับได้นะ จะเห็นว่าในส่วนของการรับ response มีการแก้ไขการ print ค่าออกมาด้วยครับ

AFNetworking Request any content-type

ลองดูนะครับ มีอะไรก็ถามกันมาได้เลย :)