ios - 为什么我的响应数据为零?
问题描述
使用 Spring Boot 应用程序使用 iOS Alamofire。
客户端应用
模型
class User: Codable {
var name: String
var email: String
var token: String
var password: String
var loginStatus: Int
}
class UserResponseData: Codable {
let body: User?
}
呼叫请求
private func makeRequest(_ path: String, method: HTTPMethod, params: Parameters?, headers: HTTPHeaders?, completion: @escaping(User?) -> Void) {
let enc = JSONEncoding.default
let url = AppConstants.ENDPOINT + path //path = signup
Alamofire.request(url, method: .post, parameters: params, encoding: enc, headers: headers)
.validate()
.responseJSON { response in
switch (response.result) {
case .success( _):
do {
// issue userData becomes nil but no parsing error
let userData = try JSONDecoder().decode(UserResponseData.self, from: response.data!)
} catch let error as NSError {
print("Failed to load: \(error.debugDescription)")
}
case .failure(let error):
print("Request error: \(error.localizedDescription)")
}
}
}
服务器应用
楷模
public class RestResponse {
private String status = "failed";
private String errorMessage = "Error";
private ResponseEntity<?> data = null;
public RestResponse() {}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public ResponseEntity<?> getData() {
return data;
}
public void setData(ResponseEntity<?> data) {
this.data = data;
}
}
控制器
@RestController
@RequestMapping("/signup")
public class SignupController {
@Autowired
public UserDao userDao;
@PostMapping()
ResponseEntity<RestResponse> signup(@RequestBody User newUser) {
User user = userDao.addUser(newUser);
user.setPassword("******");
RestResponse response = new RestResponse();
response.setStatus("success");
response.setErrorMessage(null);
response.setData(ResponseEntity.ok().body(user));
return ResponseEntity.ok().body(response);
}
}
userData
在没有任何解析错误的情况下,我在 Alamofire 响应中得到了 nil 值。
let userData = try JSONDecoder().decode(UserResponseData.self, from: response.data!)
虽然我得到了邮递员的有效回应,
{
"status": "success",
"errorMessage": null,
"data": {
"headers": {},
"body": {
"name": "Elon",
"email": "elon@s.c",
"password": "******",
"token": "Elon Token",
"loginStatus": 0
},
"statusCode": "OK",
"statusCodeValue": 200
}
}
我错过了什么?
解决方案
最后我通过添加根对象解决了这个问题,
class User: Codable {
var name: String
var email: String
var token: String
var password: String
var loginStatus: Int
}
class UserResponseData: Codable {
let body: User?
}
class UserResponseRoot: Codable {
let data: UserResponseData
}
称呼,
let userData = try JSONDecoder().decode(UserResponseRoot.self, from: response.data!)
推荐阅读
- javascript - React useEffect 仅在批处理请求上调用一次
- java - 无法为 AspectJ 添加 javaagent
- matrix - 如何根据drools决策表中的数据矩阵确定规则动作中要考虑的结果
- ckan - 使用 docker-compose 安装 CKAN
- swiftui - SwiftUI 从 ForEach 中删除绑定数组元素
- vue.js - 将关键事件添加到 v-for 的最后一项
- c++ - 获得通过 'const std::map
' as 'this' 参数丢弃 lambda 函数中的限定符 [-fpermissive] - swift - Swiftui函数更改变量
- javascript - TypeScript 泛型和联合函数类型
- excel - Excel VBA - 查找功能的类型不匹配