首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android应用程序与Laravel动作方法的交互

Android应用程序与Laravel动作方法的交互
EN

Stack Overflow用户
提问于 2016-03-16 08:47:04
回答 3查看 2.8K关注 0票数 12

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

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

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

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

代码语言:javascript
复制
return View("View-Path", array("Data" => $Data));

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

请建议正确的方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-19 11:08:06

您应该开发一个简单的API来访问来自android客户端的应用程序数据:

路由

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

Authentication

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

Laravel基本身份验证

Laravel Json Web令牌认证

Laravel OAUTH2

数据访问

一旦设置了路由和身份验证,就必须通过API路由为数据提供服务。由于您在应用程序路由和API路由中使用相同的数据,所以可以在服务中封装数据构建和检索的逻辑,并使用这些服务获取应用程序路由和API路由中的数据。

对于API和APP路由使用不同的控制器,您可以:

代码语言:javascript
复制
//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路由之间复制数据检索代码。
  • 拥有不同的控制器来访问应用程序或API路由;因此您可以获取数据,根据需要转换数据,并将其提供给视图或api客户端。

关于服务类

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

例如,假设您需要为每个用户的项目计算一些数据,将其存储在一个变量中,然后将其发送到viev:

代码语言:javascript
复制
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控制器中使用相同的类:

服务类

代码语言:javascript
复制
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控制器中使用相同的类:

代码语言:javascript
复制
//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 );
}
票数 3
EN

Stack Overflow用户

发布于 2016-03-18 09:35:31

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

票数 0
EN

Stack Overflow用户

发布于 2016-03-18 17:55:16

你可以用一种方法来做到这一点。示例

代码语言:javascript
复制
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));

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36030607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档