Забудьте о залпе, используйте Retrofit. Retrofit автоматически преобразует ответ json в объекты Java, используя Volley, для этого вам потребуется дополнительная работа. И я объясню часть rest-api тоже. Если вы построите свою структуру так, как я объясняю ниже, вы будете обрабатывать масштабирование и добавлять дополнительные конечные точки в свое приложение, как профи :)
---------------------------- ANDROID --------------- ----------------
Модифицированные
Добавить эти зависимости в android
implementation 'com.squareup.okhttp:okhttp:2.7.2'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
Теперь нам нужен интерфейс, который будет имитировать наш rest-apis в клиенте Android
public interface APIUser {
@POST("/registr")
Call<GenericResponse<User>> register(@Body User user);
}
Это для регистрации. Здесь у нас есть 2 класса, GenericResponse и User.
GenericResponse является универсальным типом класса, и мы используем его как для данных ответа, так и для ошибок (если они происходят). Это универсальный тип, потому что мы хотим использовать его для всех наших ответов, которые могут быть разных типов.
Пользователь просто java-класс содержит пользовательские поля.
CustomError содержит ответное сообщение и код.
GenericResponse
public class GenericResponse<T> {
public CustomError error;
public T data;
}
Пользователь
public class User {
public String email;
}
CustomError
public class CustomError implements Serializable {
private Integer code;
private String message;
}
Как использовать его для отправки запроса
Вы вводите этот регистрационный код там, где хотите, чтобы он был.
User user = new User();
user.setEmail(email);
OkHttpClient client = getOkHttpClient(context);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://yourDomainOrIpAddress/endpoint")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
apiDicts = retrofit.create(APIDicts.class);
apiDicts.register()
.enqueue(new Callback<GenericResponse<User>>() {
@Override
public void onResponse(Call<GenericResponse<User>> call, retrofit2.Response<GenericResponse<User>> response) {
if(response.body().error==null){
// you can do someting with response.body().error.code and response.body().error.message. Or simple show them with toast
} else if(response.body().data!=null){
User user = response.body().data;
// you got your user object back after successfull registration
} else {
/// log something went really bad
}
}
@Override
public void onFailure(Call<GenericResponse<User>> call, Throwable t) {
//something is wrong with server/api
}
});
}
------------------------------------------- API -----------------------------------------
GenericResponse , CustomError и Пользователь - это тот же класс, который мы используем как в клиенте Android, так и в веб-сервисе.
PS. GenericResponse здесь не является универсальным. Простой класс.
public class GenericResponse {
private CustomError error;
private Object data;
}
Класс RestController
@PostMapping("/register")
public GenericResponse registerNewUser(@RequestBody User user) {
return registrationService.checkIfUserAlreadyExists(user);
}
В классе обслуживания
public GenericResponse checkIfUserAlreadyExists(User user) {
GenericResponse genRes = new GenericResponse();
if (usersRepository.existsByEmailAddress(user.getEmail())) {
genRes.setError(new CustomError(1001, "User email already exists"))
return genRes;
} else {
user = dao.registerUser(user);
genRes.setUser(user);
return genRes;
}
}
Последние слова.
Несмотря на сообщение об ошибке, которое вы отправляете, используйте пользовательские коды ошибок, такие как 1001 для пользователя не найден, 1002 для уже зарегистрированного