为什么我得到的响应数据为零?
Why am I getting nil for response data?
使用 iOS Alamofire 和 Spring 启动应用程序。
客户端应用程序
型号
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);
}
}
我在 Alamofire 响应中得到 userData
的 nil 值,没有任何解析错误。
let userData = try JSONDecoder().decode(UserResponseData.self, from: response.data!)
虽然我收到了 Postman 的有效回复,
{
"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!)
使用 iOS Alamofire 和 Spring 启动应用程序。
客户端应用程序
型号
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);
}
}
我在 Alamofire 响应中得到 userData
的 nil 值,没有任何解析错误。
let userData = try JSONDecoder().decode(UserResponseData.self, from: response.data!)
虽然我收到了 Postman 的有效回复,
{
"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!)