Android App与Laravel Action方法的互动

我已经有Laravel网页,我可以在其中添加/更新/删除/读取MySQL数据库中的记录。 Laravel版本是5.2.15

现在,我必须将数据库与Android App集成。 为了做到这一点,我必须发布和阅读Json数据。

这里的问题是:我应该有2种公共行动方法吗? 首先是用于在网页上显示记录的网页,第二个用于在Android中返回json数据。

我的意思是,当我将数据返回给webPage ..我将不得不编写下面的代码。

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

但是在Android App的情况下,我将不得不请求Json Data。

请建议正确的方法。

您应该开发一个简单的API来从Android客户端访问您的APP数据:

路线

首先,您需要为API创建一些特定的路由,您将通过它们以JSON格式提供数据

认证

API的路由应该以与您现在正在做的事情不同的方式处理身份validation:您不能使用经典的基于会话的方法。 相反,您必须使用基本或基于令牌的方法。 你有不同的选择,这些是最常用的(从最简单到最复杂)

Laravel HTTP基本身份validation

Laravel Json Web令牌认证

Laravel OAUTH2

数据访问

设置路由和身份validation后,您必须通过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客户端

关于Service类

关于我提到的服务类,它可以是一个或多个包装类,您可以在API和APP控制器中使用它们来构建和获取数据而无需重复代码。 此类的结构取决于您的应用程序的工作方式。

例如,假设您需要为每个用户的项目计算一些数据,将其存储在variables中,然后将其发送到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 ); } 

对于Android,你必须编写一个单独的Web服务。

您可以使用一种方法来执行此操作。 例

 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)); }