วิธีอ่านสตริงอย่างง่ายจากคำขอ POST ใน AFNetworking (ไม่มี JSON)

ฉันใช้ AFNetworking เพื่อสื่อสารกับเซิร์ฟเวอร์ผ่าน POST ซึ่งตอบสนองด้วยสตริงธรรมดาที่มีข้อมูลที่ฉันต้องการ ฉันใช้รหัสต่อไปนี้:

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST: MY_URL
   parameters: MY_PARAMETERS
      success:^(AFHTTPRequestOperation *operation, id responseObject) {
        //do something
      }
      failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //etc.
      }];

อย่างไรก็ตาม ดูเหมือนว่า AFNetworking คาดว่าทุกการตอบสนองจะอยู่ในรูปแบบ JSON เพราะฉันได้รับข้อผิดพลาดนี้เมื่อดำเนินการตามคำขอ:

Error Domain=NSCocoaErrorDomain Code=3840 "การดำเนินการไม่เสร็จสมบูรณ์ (ข้อผิดพลาด Cocoa 3840)" (ข้อความ JSON ไม่ได้ขึ้นต้นด้วยอาร์เรย์หรือวัตถุและตัวเลือกในการอนุญาตส่วนย่อยที่ไม่ได้ตั้งค่า) UserInfo=0x1566eb00 {NSDebugDescription=ข้อความ JSON ไม่ได้ขึ้นต้นด้วยอาร์เรย์หรือวัตถุและตัวเลือกในการอนุญาตให้ไม่ได้ตั้งค่าส่วนย่อย}

ฉันจะบอก AFNetworking ได้อย่างไรว่าเป็นเรื่องปกติที่การตอบสนองไม่ใช่วัตถุ JSON ฉันเคยเห็นบางอย่างที่เกี่ยวข้องกับ AFHTTPClient แต่ดูเหมือนว่าจะไม่ได้เป็นส่วนหนึ่งของ AFNetworking อีกต่อไป


person Haiku Oezu    schedule 09.01.2014    source แหล่งที่มา


คำตอบ (3)


คุณสามารถบอก AFHTTPRequestOperationManager หรือ AFHTTPSessionManager วิธีจัดการกับคำตอบได้ เช่น ก่อนที่จะโทร POST คุณสามารถทำสิ่งต่อไปนี้:

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

จากนั้นในบล็อก success ของคุณ คุณสามารถแปลง NSData เป็นสตริงได้:

NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

ต้องบอกว่าคุณอาจต้องการพิจารณาแปลงบริการเว็บของคุณเพื่อส่งคืนการตอบกลับ JSON เนื่องจากแยกวิเคราะห์ได้ง่ายกว่ามาก (และแยกความแตกต่างระหว่างการตอบกลับที่ถูกต้องและข้อผิดพลาดของเซิร์ฟเวอร์บางอย่าง)

person Rob    schedule 09.01.2014
comment
วิเศษมาก นี่คือสิ่งที่ฉันต้องการ - person Haiku Oezu; 09.01.2014

  NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);

คุณสามารถรับรายละเอียดคำอธิบายการตอบกลับได้ดังนี้

 NSLog(@"JSON: %@", [responseObject description]);
person codercat    schedule 09.01.2014

วิธีที่ดีกว่ามากคือการจัดคลาสย่อย AFHTTPResponseSerializer และแทนที่ที่นั่น

func responseObject (สำหรับการตอบกลับ: URLResponse?, ข้อมูล: ข้อมูล?, ข้อผิดพลาด: NSErrorPointer) -> มีหรือไม่?

ที่นั่นคุณสามารถแยกวิเคราะห์คำตอบ แคสต์เพื่อพิมพ์ที่คุณต้องการและส่งคืนได้

person Timur Suleimanov    schedule 15.06.2018