簡體   English   中英

為什么我的響應數據為零?

[英]Why am I getting nil for response data?

使用帶有 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
    }
}

我錯過了什么?

最后我通過添加根對象解決了這個問題,

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!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM