我有以下型号:CardBoard,User,UserPricingPlans,PricingPlanLimits
注意:不要介意模型代码是否有问题.它们工作正常.
纸板
class CardBoard extends Model{
public function user(){
return $this->belongsTo('Models\User','id_user');
}
}
Run Code Online (Sandbox Code Playgroud)
用户
class User extends Model{
public function pricingPlans(){
return $this->hasMany('Models\UserPricingPlan','id_user');
}
}
Run Code Online (Sandbox Code Playgroud)
PricingPlan
class PricingPlan extends Model{
public function limits(){
return $this->hasOne('Models\PricingPlanLimits','id_pricing_plan','id_pricing_plan');
}
}
Run Code Online (Sandbox Code Playgroud)
PricingPlanLimits
我不会描述那个模型,它不是问题所必需的.但请记住,有一个名为maxBoards的属性.
问题是我只有CardBoard模型实例可以使用,我想从PricingPlanLImits 获取maxBoard属性.所以我这样做了:
注意:我已经有了CardBoard模型实例!
$maxBoard = $cardBoard->user->pricingPlans->last()->limits->maxBoard;
return $maxBoard;
Run Code Online (Sandbox Code Playgroud)
上面的代码运行得很好,但是这个操作生成的查询数量对我来说是个开销.Eloquent 为每个调用的关系做一个SELECT,我不想要所有这些数据和操作.
{
"query": "select * from `users` where `users`.`id_user` = ? limit 1",
"bindings": [ …Run Code Online (Sandbox Code Playgroud) 我知道Stack Overflow上有足够的内容可以解决这个问题,但我的主题与其他主题不同.(有点相同但不相等)
我想听听社区对我所做的事情的看法,看看我是否可以在某处改进.
我目前正在为我的登录EndPoint使用BASIC授权,因为它不需要复杂性,而且它的https非常好,所以它很好.
例:
GET - /api/login
授权:基本BASE64String(用户名:密码)
我的一些EndPoints要求令牌被授予对资源的访问权限.这些令牌我通过Headers和Https-Secured发送.
问题是我没有使用传统方法来执行这些授权.以下是一些例子:
例1:
GET - /api/hardware/{PUBLIC_TOKEN}/getMe
授权 - 硬件:PRIVATE_TOKEN
此EndPoint不需要授权 - 硬件标头,但如果包含更多内容则由API完成.(这里不相关)
例2:
GET - /api/login/{id}
授权人:USER_TOKEN
否则,此EndPoint是必需的,包括具有用户令牌的授权人头,以访问资源.(请注意,生成令牌的方式与此无关)
要访问API EndPoints,必须提供HTTPS请求.
我给上面的自定义标题和EndPoints提供了任意名称,只是为了说明我的授权模式是什么,名称与原始名称不匹配.所以不要打扰模式上的foccus名称.
我的问题是:不遵循对流方式是一件坏事吗?创建自定义授权标题是不好的(如果这是为什么?).
我发现这种方式更简单,可以提供授权和传递令牌的安全方式,所有这些令牌都可以再次在平台中重新生成.
许多设备和移动应用程序已经在使用这个Schema,但它全部都在开发环境下,而且还没有生产.我担心这种非传统的方式可能会影响API的用户.希望社区的想法可以帮助我改善这一点.
编辑:26/03/2017
我想知道它是否会更好以及为什么以协议中描述的方式实现,因为当需要多个授权时比在有自定义标头并且想要检索其值时更难从Headers获取.
遵循协议,您应该使用授权标头,如下所示:
Authorization: <type> <value>
Run Code Online (Sandbox Code Playgroud)
例:
GET - /api/login/{id}
授权:用户USER_TOKEN
但是我无法看到我在这之后得到的东西,因为当获取它的值时会出现一个String或者在示例中它会返回User Token.
使用自定义标头更容易验证令牌.多种授权也会在协议方式下令人头疼.
我无法将Jackson Parser依赖项添加到我的项目中.
目前我在build.gradle上使用这些代码行:
compile 'com.fasterxml.jackson.core:jackson-core:2.7.2'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.2'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.2'
Run Code Online (Sandbox Code Playgroud)
我唯一需要的是ObjectMapper,我知道它在databind包中.当我在gradle中添加这些行时,我按下同步,一切都正确.
问题是在模拟器上运行项目,此错误出现在Android Studio上的消息中:
错误:任务':app:transformResourcesWithMergeJavaResForDebug'的执行失败.
com.android.build.api.transform.TransformException:com.android.builder.packaging.DuplicateFileException:在APK META-INF/NOTICE File1中复制的重复文件:C:\ Users\Igor.gradle\caches\modules-2\files -2.1\com.fasterxml.jackson.core\jackson-databind\2.7.2\84ffa765dd258dbab8695963c41308b054f3a1cb\jackson-databind-2.7.2.jar File2:C:\ Users\Igor.gradle\_caches\modules-2\files-2.1\com.fasterxml.jackson.core \杰克逊核心\ 2.7.2\8b8310381b690e317f5f0574e9b2dd7034778b4c \杰克逊核心-2.7.2.jar
我试图只留下数据库库,但我没有幸运.同样的错误.
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.2'
Run Code Online (Sandbox Code Playgroud)
我Build -> Clean Project试着删除了.gradle/cache,也没有幸运.
我不知道这可能是什么.有什么建议 ?
下面的操作只检索请求中的所有书籍。这显然是一个GET操作。
从你的角度来看,做下面这两个更好(赞成/反对):
获取 - api/library/2/books/
从图书馆 2 中检索所有书籍。
GET - api/library/2/books/3/5/10/33/...../pages
POST - api/library/2/books/pages
身体:
{
"books_id": [
2,
30,
40,
20,
30
]
}
Run Code Online (Sandbox Code Playgroud)
我真的很怀疑使用POST或GET方法来实现它。如果要检索 100-200 本书,URL 上的书籍 ID 会变得非常混乱。我想在这里得到一些启示。
我正在使用 PHP 来处理 Rest 应用程序,上面的所有这些方法都是有效的。
http ×2
android ×1
api ×1
api-design ×1
eloquent ×1
http-headers ×1
jackson ×1
laravel ×1
laravel-5 ×1
rest ×1