简体   繁体   中英

Why am I getting nil for response data?

Working with iOS Alamofire with Spring Boot app.

Client App


Model

class User: Codable {
    var name: String
    var email: String
    var token: String
    var password: String
    var loginStatus: Int
}

class UserResponseData: Codable {
    let body: User?
}

Call request

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)")
         }
     }
}

Server App


Models

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;
    }
}

Controller

@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);
    }
}

I am getting nil value for userData in the Alamofire response without any parsing error.

let userData = try JSONDecoder().decode(UserResponseData.self, from: response.data!)

Although I am getting valid response with Postman,

{
    "status": "success",
    "errorMessage": null,
    "data": {
        "headers": {},
        "body": {
            "name": "Elon",
            "email": "elon@s.c",
            "password": "******",
            "token": "Elon Token",
            "loginStatus": 0
        },
        "statusCode": "OK",
        "statusCodeValue": 200
    }
}

What am I missing?

Finally I have resolved the issue by adding the root object,

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
}

Call,

let userData = try JSONDecoder().decode(UserResponseRoot.self, from: response.data!)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM