Как отправить POST запрос с Android клиента ? Spring security, Rest template mapping converter

288
27 марта 2017, 07:21

Здравствуйте, прошу вас помочь с корректным написанием POST запроса. В Spring я новичок и хотелось бы узнать правильное решение.

В общем на стороне клиента я получаю данные для регистрации о пользователе. Его userName, userPassword, confirmationPassword. После чего создаю на основе этого объект и пытаюсь отправить его на сервер. Но есть у меня ощущение, что я делаю это не так.

Вот код клиентской стороны:

public class CreateAccountPresenter implements CreateAccountContract.Presenter {
    private CreateAccountContract.View view;
    private String userName;
    private String userPassword;
    private String confirmUserPassword;

    public CreateAccountPresenter(CreateAccountContract.View view) {
        this.view = view;
    }
    @Override
    public void onCreateAccountClick() {
        userName = view.getUserName();
        userPassword = view.getPassword();
        confirmUserPassword = view.getPasswordConfirmation();
        new CreateAccountTask().execute();
    }
    private class CreateAccountTask extends AsyncTask<Void, Void, User>{
        // How do I properly pass the post request with my User object ?
        @Override
        protected User doInBackground(Void... voids) {
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
            User user = new User(userName, userPassword, confirmUserPassword);
            return restTemplate.postForObject(URL.getUserRegistration(), user, User.class);
        }
        @Override
        protected void onPostExecute(User user) {
            view.makeToast("User registration complited " + user.getUserName());
        }
    }
}

Вот код серверной стороны: Так же в коде есть закомментированнные вопросы. Если кто-то сможет и с ними помочь будет вообще здорово. Но главная проблема сейчас, я не знаю как отправить запрос на сервак.

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private SecurityService securityService;
    @Autowired
    private UserValidator userValidator;

    @RequestMapping(value = "/registration", method = RequestMethod.POST)
    @ResponseBody
    @ResponseStatus(value = HttpStatus.CREATED)
    public User registration(@RequestBody User user, BindingResult bindingResult, Model model) {
        userValidator.validate(user, bindingResult);// here is validate logic
        if (bindingResult.hasErrors()) {
            //What should i return here to my Android client ?
        }
        userService.save(user);
        securityService.autoLogin(user.getUserName(), user.getConfirmPassword());
        return user;
    }
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login(Model model, String error, String logout) {
        if (error != null) {
            model.addAttribute("error", "Username or password is incorrect.");
        }
        if (logout != null) {
            model.addAttribute("message", "Logged out successfully.");
        }
        return "login";// what should I return to the client ???
        //How my android client will understand that user is loged in ?
    }
}

После "отправки данных" приложение валится со следующей ошибкой:

D/OpenGLRenderer: endAllStagingAnimators on 0xeb8cb200 (RippleDrawable) with handle 0xeb8b9270
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
                  Process: com.example.user.userauthorisation, PID: 4341
                  java.lang.RuntimeException: An error occured while executing doInBackground()
                      at android.os.AsyncTask$3.done(AsyncTask.java:300)
                      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                      at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                      at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                      at java.lang.Thread.run(Thread.java:818)
                   Caused by: java.lang.NoSuchMethodError: No virtual method getFactory()Lcom/fasterxml/jackson/core/JsonFactory; in class Lcom/fasterxml/jackson/databind/ObjectMapper; or its super classes (declaration of 'com.fasterxml.jackson.databind.ObjectMapper' appears in /data/data/com.example.user.userauthorisation/files/instant-run/dex/slice-jackson-databind-2.0.1_e7cd4f8c166b769aa0dc7b93e1d951a875a0bd1f-classes.dex)
                      at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.writeInternal(MappingJackson2HttpMessageConverter.java:192)
                      at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:174)
                      at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:705)
                      at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:534)
                      at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:499)
                      at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:348)
                      at com.example.user.userauthorisation.createaccount.CreateAccountPresenter$CreateAccountTask.doInBackground(CreateAccountPresenter.java:42)
                      at com.example.user.userauthorisation.createaccount.CreateAccountPresenter$CreateAccountTask.doInBackground(CreateAccountPresenter.java:35)
                      at android.os.AsyncTask$2.call(AsyncTask.java:288)
                      at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587at java.lang.Thread.run(Thread.java:818W/EGL_emulation: eglSurfaceAttrib not implemented
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xeb8a5460, error=EGL_SUCCESS

Прошу знатоков помочь. UPDATE Добавил дополнительную зависимость в проект, теперь следующая ошибка:

W/RestTemplate: POST request for "http://192.168.0.80:8080/user/registration" resulted in 400 (Bad Request); invoking error handler
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
                  Process: com.example.user.userauthorisation, PID: 4547
                  java.lang.RuntimeException: An error occured while executing doInBackground()
                      at android.os.AsyncTask$3.done(AsyncTask.java:300)
                      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                      at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                      at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                      at java.lang.Thread.run(Thread.java:818)
                   Caused by: org.springframework.web.client.HttpClientErrorException: 400 Bad Request
                      at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:88)
                      at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:585)
                      at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:541)
                      at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:499)
                      at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:348)
                      at com.example.user.userauthorisation.createaccount.CreateAccountPresenter$CreateAccountTask.doInBackground(CreateAccountPresenter.java:42)
                      at com.example.user.userauthorisation.createaccount.CreateAccountPresenter$CreateAccountTask.doInBackground(CreateAccountPresenter.java:35)
                      at android.os.AsyncTask$2.call(AsyncTask.java:288)
                      at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587at java.lang.Thread.run(Thread.java:818W/EGL_emulation: eglSurfaceAttrib not implemented
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xeb897ea0, error=EGL_SUCCESS
I/Process: Sending signal. PID: 4547 SIG: 9
Disconnected from the target VM, address: 'localhost:8627', transport: 'socket'
READ ALSO
Сортировать элементы с помощью jquery

Сортировать элементы с помощью jquery

Есть элементы со значениями

213
Косая или скрученная форма границы

Косая или скрученная форма границы

Мне интересно, можно ли создать завернутую или, лучше сказать, скрученную границу с помощью CSS

393
Bootstrap как разместить объкты друг за другом

Bootstrap как разместить объкты друг за другом

Нужно сделать вот так ПРИ ПОМОЩИ BOOTSTRAP

326