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

iOS 與 Spring MVC 數據交互踩坑記:從 AFNetworking 遷移至 Swift 解決方案

     編輯:程式設計綜合問答

問題現象

iOS 端使用 AFNetworking 發送請求,Spring MVC 後端無法接收參數(@RequestParam 綁定失敗、@RequestBody 為空)。

根本原因分析

  • Content-Type 不匹配:AFNetworking 預設以 application/x-www-form-urlencoded 或 multipart/form-data 發送,而 Spring MVC REST 風格預期 application/json。
  • 參數序列化差異:AFNetworking 將字典序列化為表單鍵值對,Spring MVC 若無 @ModelAttribute 或表單轉換器,無法自動映射至 POJO。
  • HTTP 方法語意:RESTful API 常用 PUT/DELETE,AFNetworking 需額外設定 HTTPMethod 並處理 _method 參數。

解決方案對比

方案修改成本相容性推薦度
Spring MVC 增加 FormHttpMessageConverter、@ModelAttribute低良好⭐⭐⭐
iOS 改用 JSONSerialization + 設定 Content-Type: application/json中最佳⭐⭐⭐⭐⭐
遷移至 Alamofire / URLSession 原生 + Codable (Swift)高(重寫網路層)現代標準⭐⭐⭐⭐

最佳實踐:iOS 端改用 JSON 請求

// Swift 5 + URLSession + Codable
struct LoginRequest: Codable { let username: String; let password: String }
struct LoginResponse: Codable { let token: String; let userId: Int }

func login(username: String, password: String, completion: @escaping (Result<LoginResponse, Error>) -> Void) {
    let url = URL(string: \"https://api.example.com/auth/login\")!
    var request = URLRequest(url: url)
    request.httpMethod = \"POST\"
    request.setValue(\"application/json\", forHTTPHeaderField: \"Content-Type\")
    request.httpBody = try? JSONEncoder().encode(LoginRequest(username: username, password: password))

    URLSession.shared.dataTask(with: request) { data, resp, err in
        if let err = err { completion(.failure(err)); return }
        guard let data = data,
              let httpResp = resp as? HTTPURLResponse,
              (200..<300).contains(httpResp.statusCode) else {
            completion(.failure(NSError(domain: \"\", code: -1, userInfo: [NSLocalizedDescriptionKey: \"Invalid response\"])))
            return
        }
        do { completion(.success(try JSONDecoder().decode(LoginResponse.self, from: data))) }
        catch { completion(.failure(error)) }
    }.resume()
}

後端 Spring MVC 對應調整

@PostMapping(\"/auth/login\")
public ResponseEntity<LoginResponse> login(@RequestBody LoginRequest request) {
    // 驗證邏輯
    return ResponseEntity.ok(new LoginResponse(token, userId));
}

總結

AFNetworking 適合傳統表單型 API,對於 RESTful JSON API,iOS 原生 URLSession + Codable 或 Alamofire 5+ 是更現代、穩健的選擇,避免序列化與 Content-Type 不匹配的坑。

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