Вызов службы Android и REST - обзор кода - PullRequest
0 голосов
/ 30 декабря 2018

Я задавал похожий вопрос, но ответ мне не помог.Я пытаюсь вызвать службу отдыха из моего приложения для Android.Служба отдыха выглядит следующим образом:

@RestController
@RequestMapping("/login")
public class LoginController {
@ResponseBody
@RequestMapping(value = "/user", method = RequestMethod.GET)
public boolean getUser(@RequestParam(value = "name", required = true) String  userName, @RequestParam(value = "password", required = true) String password) {
        if (userName.equals("MMM") && password.equals("mmm")) {
            return true;
        } else {
            return false;
        }
    }
}

Я запускаю службу REST и пытаюсь вызвать ее из приложения для Android следующим образом:

public void invokeWS(RequestParams params){

    AsyncHttpClient client = new AsyncHttpClient();
    client.setConnectTimeout(7000);
    client.get("https://ipaddress:8080/login/user/",params ,new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            // Hide Progress Dialog
            prgDialog.hide();
            try {

                JSONObject obj = new JSONObject(responseBody.toString());

                if(obj.getBoolean("status")){
                    Toast.makeText(getApplicationContext(), "You are successfully logged in!", Toast.LENGTH_LONG).show();
                    // Navigate to Home screen
                    navigatetoHomeActivity();
                }
                // Else display error message
                else{
                    errorMsg.setText(obj.getString("error_msg"));
                    Toast.makeText(getApplicationContext(), obj.getString("error_msg"), Toast.LENGTH_LONG).show();
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                Toast.makeText(getApplicationContext(), "Error Occured [Server's JSON response might be invalid]!", Toast.LENGTH_LONG).show();
                e.printStackTrace();

            }
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

            prgDialog.hide();

            if(statusCode == 404){
                Toast.makeText(getApplicationContext(), "Requested resource not found", Toast.LENGTH_LONG).show();
            }
            else if(statusCode == 500){
                Toast.makeText(getApplicationContext(), "Something went wrong at server end", Toast.LENGTH_LONG).show();
            }
            // When Http response code other than 404, 500
            else{
                Toast.makeText(getApplicationContext(), statusCode + "Unexpected Error occcured! [Most common Error: Device might not be connected to Internet or remote server is not up and running]", Toast.LENGTH_LONG).show();
               // Toast.makeText(getApplicationContext(), "Unexpected Error occcured! [Most common Error: Device might not be connected to Internet or remote server is not up and running]", Toast.LENGTH_LONG).show();
            }
        }

    });
}

Код статуса, который я получаю, -0. Когда я использую API для тестирования службы REST, все в порядке.Я не получаю никаких ошибок.Я нахожусь в той же сети, и брандмауэр выключен.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Я вижу, что вы делаете пару "плохих практик" здесь.

Задача 1

Я вижу, что ваш Spring Controller хочет ввести имя пользователя и парольв качестве параметров URL.Это нет.Сервер может регистрировать запросы URL / конечной точки, которые теперь будут содержать ваши учетные данные в виде простого текста.

Параметр исправления

  1. Очень часто -> Использовать заголовок авторизации (наиболее часто: см. Basic Auth) через HTTPS.
  2. Менее часто -> Передать имя пользователя ипароль в теле сообщения POST.

Проблема 2

Не используется фреймворк, как предполагалось

Я бы предложил использовать Spring Security.Это сделает ваши вещи намного более безопасными и стоит делать в долгосрочной перспективе.Он позаботится об аутентификации, ролях и хэшировании паролей.

0 голосов
/ 30 декабря 2018

Чтобы понять, что происходит не так, вам нужно исследовать объект «ошибка» в методе onFailure

 @Override
    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
        Log.i("ws", "---->>onFailure : " + error);
    }
    });

ПРЕДЛОЖЕНИЯ:

1) Не отправлять пароль в GET!

Пароль не должен быть частью URL, пожалуйста, используйте POST и отправьте пароль в теле запроса

2) Ваш код Android выглядит хорошо, но существует собственная структура для вызова служб REST, которая называетсяVolley "Volley" предлагает следующие преимущества:

  • Автоматическое планирование сетевых запросов.
  • Несколько одновременных сетевых подключений.
  • Прозрачное кэширование ответов диска и памяти со стандартным HTTPсогласованность кэша.
  • Поддержка приоритезации запросов.
  • API запроса отмены.Вы можете отменить один запрос или установить блоки или объемы запросов для отмены.
  • Простота настройки, например, для повторных попыток и отката.
  • Сильный порядок, который облегчаетправильно заполняйте свой пользовательский интерфейс данными, извлекаемыми из сети асинхронно.
  • Инструменты отладки и трассировки.

код не сложнее вашего ...

ПРИМЕР:

String url = "http://my-json-feed";

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {
        mTextView.setText("Response: " + response.toString());
    }
}, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        // TODO: Handle error

    }
});

https://developer.android.com/training/volley/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...