【发布时间】:2020-06-30 15:23:31
【问题描述】:
使用带有 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);
}
}
我在 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
}
}
我错过了什么?
【问题讨论】:
标签: ios json spring-boot parsing alamofire