Android 应用与 Laravel 操作方法的交互
Android App interaction with Laravel Action methods
我已经有 Laravel 个网页,我可以在其中从 MySQL 数据库中 add/update/delete/Read 记录。 Laravel 版本是 5.2.15
现在,我必须将数据库与 Android 应用程序集成。为此,我必须 post 并阅读 Json 数据。
这里的问题是:我应该有2个public动作方法吗?第一个用于将在网页上显示记录的网页,第二个用于 return json Android.
中的数据
我的意思是,当我 return 数据到网页时..我将不得不编写下面的代码。
return View("View-Path", array("Data" => $Data));
但如果是 Android 应用程序,我将不得不请求 Json 数据。
请提出正确的方法。
对于android,您必须编写一个单独的网络服务。
您可以使用一种方法来做到这一点。例子
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));
}
您应该开发一个简单的 API 来从 android 客户端访问您的 APP 数据:
路线
首先,您需要为 API 创建一些特定的路由,您将通过这些路由以 JSON 格式提供数据
身份验证
API 的路由应该根据您现在正在做的事情以不同的方式处理身份验证:您不能使用 classic 基于会话的方法。相反,您必须使用基本或基于令牌的方法。你有不同的选择,这些是一些最常用的(从最简单到最复杂)
Laravel HTTP Basic Authentication
Laravel Json Web Token Authentication
数据访问
设置好路由和身份验证后,您必须通过 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 客户端
关于服务class
关于我提到的服务 class,它可能只是一个或多个包装器 class,您可以在 API 和 APP 控制器中使用它来构建和获取没有重复代码的数据。此类 classes 的结构取决于您的应用程序的工作方式。
例如,假设您需要为每个用户的项目计算一些数据,将其存储在一个变量中,然后将其发送到 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 控制器中做同样的事情,您需要重复这段代码来获取项目并创建数据。为避免这种情况,您可以 'wrap' 服务 class 中的数据访问,并在 boh 控制器中使用相同的 class:
服务class
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 控制器中使用相同的 class:
//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 );
}
我已经有 Laravel 个网页,我可以在其中从 MySQL 数据库中 add/update/delete/Read 记录。 Laravel 版本是 5.2.15
现在,我必须将数据库与 Android 应用程序集成。为此,我必须 post 并阅读 Json 数据。
这里的问题是:我应该有2个public动作方法吗?第一个用于将在网页上显示记录的网页,第二个用于 return json Android.
中的数据我的意思是,当我 return 数据到网页时..我将不得不编写下面的代码。
return View("View-Path", array("Data" => $Data));
但如果是 Android 应用程序,我将不得不请求 Json 数据。
请提出正确的方法。
对于android,您必须编写一个单独的网络服务。
您可以使用一种方法来做到这一点。例子
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));
}
您应该开发一个简单的 API 来从 android 客户端访问您的 APP 数据:
路线
首先,您需要为 API 创建一些特定的路由,您将通过这些路由以 JSON 格式提供数据
身份验证
API 的路由应该根据您现在正在做的事情以不同的方式处理身份验证:您不能使用 classic 基于会话的方法。相反,您必须使用基本或基于令牌的方法。你有不同的选择,这些是一些最常用的(从最简单到最复杂)
Laravel HTTP Basic Authentication
Laravel Json Web Token Authentication
数据访问
设置好路由和身份验证后,您必须通过 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 客户端
关于服务class
关于我提到的服务 class,它可能只是一个或多个包装器 class,您可以在 API 和 APP 控制器中使用它来构建和获取没有重复代码的数据。此类 classes 的结构取决于您的应用程序的工作方式。
例如,假设您需要为每个用户的项目计算一些数据,将其存储在一个变量中,然后将其发送到 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 控制器中做同样的事情,您需要重复这段代码来获取项目并创建数据。为避免这种情况,您可以 'wrap' 服务 class 中的数据访问,并在 boh 控制器中使用相同的 class:
服务class
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 控制器中使用相同的 class:
//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 );
}