Взаимодействие приложений Android с методами Laravel Action

У меня уже есть веб-страницы Laravel, где я могу добавлять/обновлять/удалять/читать записи из базы данных MySQL. Версия Laravel - 5.2.15

Теперь мне нужно интегрировать базу данных с Android-приложением. Для этого я должен опубликовать и прочитать Json Data.

Здесь вопрос: должен ли я иметь 2 общедоступных метода действий? Сначала для веб-страницы, которая будет отображать записи на веб-странице, а вторая вернет данные json на Android.

Я имел в виду, когда я возвращаю данные в webpage. Мне нужно будет написать приведенный ниже код.

return View("View-Path", array("Data" => $Data));

но в случае Android-приложения мне придется запросить Json Data.

Пожалуйста, предложите правильный подход.

Ответ 1

Вам следует разработать простой API для доступа к вашим данным APP от клиента android:

Маршруты

Прежде всего вам нужно создать определенные маршруты для API, через которые вы будете обслуживать свои данные в формате JSON

Аутентификация

Маршруты API должны обрабатывать аутентификацию по-другому в отношении того, что вы сейчас делаете: вы не можете использовать классический подход, основанный на сеансах. Вместо этого вы должны использовать базовый или символический подход. У вас разные альтернативы, это одни из самых используемых (от самых простых до самых сложных)

Базовая аутентификация HTTP Laravel

Аутентификация веб-маркера Laravel Json

Laravel OAUTH2

Data Acess

После того, как вы настроите маршруты и аутентификацию, вы должны обслуживать свои данные через маршруты API. Поскольку вы используете одни и те же данные в маршрутах APP и маршрутах API, вы можете обернуть логику построения и получения данных в службах и использовать службы для получения данных как на маршрутах APP, так и на маршрутах API.

Используя разные контроллеры для маршрутов API и APP, вы:

//APP Controller method for route: www.app.com/app-route/users
public function getUsers()
{
    //wrap the logic to build the data inside the service
    $service = App::make('your_service');

    //once is ready, get the built data from the service
    $data = $service->getData(); 

    return View("View-Path", array("Data" => $data)); 
}

//API Controller method for route: www.app.com/api/users
public function getUsers()
{
    //use the same service to build and get the data you need
    $service = App::make('your_service');

    $data = $service->getData(); 

    return response()->json( $data );
}

Таким образом вы можете:

  • Инкапсулировать сбор данных и их поиск в службах, чтобы у вас не было необходимости дублировать код для извлечения данных между маршрутами APP и API.

  • Имейте разные контроллеры для доступа к маршрутам APP или API; поэтому вы можете получать данные, преобразовывать их по мере необходимости и обслуживать их как в виде, так и в клиентах api.

О классе службы

Что касается класса обслуживания, о котором я упоминал, это может быть просто один или несколько классов-оболочек, которые вы используете как в API, так и в контроллерах APP для создания и получения данных без повторного кода. Структура таких классов зависит от того, как работает ваше приложение.

Например, предположим, что вам нужно вычислить некоторые данные для каждого пользовательского проекта, сохранить его в переменной и затем отправить в viev:

public function getUsers($request)
{
    $user = Users::with('projects')->find( $request->user_id )->get();

    $data = [];
    foreach ( $user->projects as $p )
    {
         //compute some data you need and store it in $data;
    }

    return View("View-Path", array("Data" => $data)); 
}

Теперь, если вы хотите сделать то же самое в контроллере API, вам нужно будет повторить этот код, чтобы получить проекты и создать данные. Чтобы этого избежать, вы можете "обернуть" доступ к данным в классе обслуживания и использовать один и тот же класс в контроллерах boh:

Класс обслуживания

public class UserDataBuilder
{
    protected $user;

    public function setUser( Authenticatable $user )
    {
        $this->user = $user;
    }

    public function getData()
    {

        $user = Users::with('projects')->find( $this-user->id )->get();

        $data = [];
        foreach ( $user->projects as $p )
        {
             //compute some data you need and store it in $data;
        }

        return $data;
    }

}

и использовать тот же класс как в API, так и в APP-контроллерах:

//APP controller: get the data and pass to the view
public function getUsers($request)
{        
    $service = App::make( UserDataBuilder::class );
    $service->setUser( User::find( $request->user_id )->get() );

    return View("View-Path", array("Data" => $service->getData() ); 
}

//API controller: get the data and convert to JSON
public function getUsers($request)
{    
    $service = App::make( UserDataBuilder::class );
    $service->setUser( User::find(1)->get() );

    return response()->json( $data );
}

Ответ 2

Для android вам нужно написать отдельный веб-сервис.

Ответ 3

Для этого вы можете использовать один метод. Пример

public function someMethod(Request $request){

    $Data = ['laravel','is','awesome'];

    // If the request has the content type is json return a json response
    // So you android request will be true for this request 
    // else return data to webpage
    if($request->isJson()){
        return response()->json($Data);
    }

    return View("View-Path", array("Data" => $Data));

}