首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

AFNetworking POST 陣列參數序列化問題及修正

     編輯:程式設計綜合問答

現象

參數 `name` 為陣列,按官方文檔構造請求,服務端報 JSON 格式錯誤。

原因分析

AFNetworking 2.x/3.x 默認將陣列參數序列化為 `name[]=value1&name[]=value2`(PHP 風格),而部分後端(如 Java Spring、.NET)期望 `name=value1&name=value2` 或 JSON 格式。

解決方案

  1. 修改序列化策略(推薦):自定義 `AFHTTPRequestSerializer` 子類,重寫 `requestWithMethod:parameters:error:`,將陣列展平為無中括號鍵值對。
  2. 客戶端手動構造 Body**:將陣列轉為 JSON 字符串,設置 `Content-Type: application/json`,`HTTPBody = [jsonString dataUsingEncoding:NSUTF8StringEncoding]`。
  3. 修改源碼(不推薦):如最佳回答在 `AFURLRequestSerialization.m` 中將 `%@[]` 改為 `%@`,升級困難。

代碼示例(方案 2)

NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"name"] = @[@"v1", @"v2"]; // 陣列
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:0 error:nil];
NSMutableURLRequest *req = [manager.requestSerializer requestWithMethod:@"POST" URLString:url parameters:nil error:nil];
req.HTTPBody = jsonData;
req.setValue(@"application/json", forHTTPHeaderField:@"Content-Type");

建議

與後端協商統一參數格式,文檔化;避免改動三方庫源碼,升級時易遺漏。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved