【问题标题】:Android App interaction with Laravel Action methodsAndroid App 与 Laravel Action 方法的交互
【发布时间】:2016-03-16 08:47:04
【问题描述】:

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

现在,我必须将数据库与 Android 应用程序集成。为此,我必须发布并阅读 Json 数据。

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

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

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

但如果是 Android 应用程序,我将不得不请求 Json 数据。

请提出正确的方法。

【问题讨论】:

  • 我不熟悉 laravel,但我构建了 2 个使用 web 服务 (php) 播种的 android 应用程序。我的选择是 webservice,因为 2 个不同的应用程序使用来自同一数据池的 2 个不同的数据类型。 (Web 应用为 Mysql,Android 应用为 xml)
  • 您的应用是只能在线使用还是也可以离线使用?
  • 只能在线使用。

标签: php android laravel laravel-5 laravel-5.2


【解决方案1】:

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

路线

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

身份验证

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

Laravel HTTP Basic Authentication

Laravel Json Web Token Authentication

Laravel OAUTH2

数据访问

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

【讨论】:

  • 你有什么链接可以彻底解释$service = App::make('your_service'); 吗?您是否有任何链接解释了创建和从网站和 Android 向 API 发送令牌的用法?
  • @PankajGarg : $service 是一个通用的高级类,您应该创建它来包装数据检索以执行确定的操作:没有关于它的链接,因为您应该根据您的体系结构创建它。我没有任何用于令牌身份验证的特定链接,但您可以轻松找到在 google 上搜索的信息。或者,一旦您有更具体的问题,请搜索或询问堆栈溢出
  • 我应该在同一个项目还是在不同的项目中开发 API?
  • @PankajGarg :在同一个项目中:构建数据的类应该是相同的。改变的是路由和控制器,因此您可以以相同的方式获取数据,但以不同的格式提供数据
  • 你可以分享任何链接,以便我可以检查推荐的方式。
【解决方案2】:

对于 android 你必须编写一个单独的 web 服务。

【讨论】:

  • 你能用一个例子更详细地描述它吗?它看起来更像是一条评论。
【解决方案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));

}

【讨论】:

  • 这里的问题是我的所有 url 都通过 auth 中间件受到保护,并且它们中的大多数还实现了管理员授权中间件,因此当我使用特定路由发送请求时......我只会获得登录页面。
  • 创建另一个带有前缀和api中间件但指向同一资源的路由组
  • 在每种方法中,我都返回带有数据的视图,但在我的情况下,我只需要返回json。那么,如何才能实现数据的通用性呢?
猜你喜欢
  • 2011-11-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多