Почему я получаю ноль за данные ответа? - PullRequest
0 голосов
/ 19 марта 2020

Работа с iOS Alamofire с приложением Spring Boot.

Клиентское приложение


Модель

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 без какой-либо ошибки синтаксического анализа .

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

Чего мне не хватает?

1 Ответ

0 голосов
/ 19 марта 2020

Наконец, я решил проблему, добавив объект root,

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