Android App 与 Laravel Action 方法的交互


Android App interaction with Laravel Action methods

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

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

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

我的意思是,当我将数据返回到网页时。我将不得不编写以下代码。

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

但在安卓应用程序的情况下,我将不得不请求 Json 数据。

请提出正确的方法。

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

路线

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

认证

API 的路由应该以不同的方式处理身份验证,具体取决于您现在正在执行的操作:您不能使用经典的基于会话的方法。相反,您必须使用基本或基于令牌的方法。您有不同的选择,这些是最常用的一些(从最简单的到最复杂的)

Laravel HTTP 基本身份验证

Laravel Json Web Token Authentication

拉维尔·奥特斯2

数据处理

设置路由和身份验证后,必须通过 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 );
}

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