我有一个暴露给iPhone和Android客户端的REST服务.目前我遵循HTTP代码200,400,401,403,404,409,500等.
我的问题是建议放置错误的原因/描述/原因的地方在哪里?REST API是否更有意义在标题中始终具有自定义Reason?
< HTTP/1.1 400 Bad Request - Missing Required Parameters.
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked
Run Code Online (Sandbox Code Playgroud)
或者通过JSON将它放在Response Body中更好?
< HTTP/1.1 400 Bad Request
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: application/json
{ "error" : "Missing Required Parameters" }
Run Code Online (Sandbox Code Playgroud) 我目前正在玩Play!具有以下体系结构的项目:
控制器 - >服务(演员) - >模型(常规案例类)
对于每个请求,我们将发出对服务层的调用,如下所示:
Service ? DoSomething(request, context)
Run Code Online (Sandbox Code Playgroud)
我们在应用程序初始化期间创建的akka路由器后面有一定数量的这些服务参与者,并且可以按需扩展.
在服务中,我们主要进行适度的数据操作或数据库调用:
receive = {
case DoSomething(x, y) => {
...
Model.doSometing(...)
sender ! result
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道我们是否应该使用演员来提供我们的服务,或者仅仅使用期货.
我们没有任何需要在服务参与者中修改的内部状态,无论消息进入函数并吐出结果.这不是演员模特的大力量吗?
我们正在做很多任务,这些任务似乎与演员模型相差甚远
我们没有进行繁重的计算和远程处理没有意义,因为大多数工作是针对数据库和对一个远程actor进行往返操作来进行一些db调用是不必要的
我们确实使用reactivemongo,因此每个db调用都是非阻塞的.我们可以打很多电话
在我看来,删除akka并使用Futures让我们的生活变得更轻松,而且我们并没有真正失去任何东西.
我有一个长时间运行的守护程序(Symfony2 Command),可以在Redis中的工作队列中工作,并使用orm执行这些作业并写入数据库.
我注意到,当工人怠速等待工作时,工作人员有死亡的倾向,因为与MySQL的连接超时.
具体来说,我在日志中看到了这一点:MySQL Server已经消失了.
无论如何我可以让学说自动重新连接吗?或者有什么方法可以手动捕获异常并重新连接学说orm?
谢谢
在Play 2.1中,我们使用类似下面的内容通过读取从JSON中获取生物对象.
implicit val creatureReads = (
(__ \ "name").read[String] and
(__ \ "isDead").read[Boolean] and
(__ \ "weight").read[Float]
)(Creature.apply _)
Run Code Online (Sandbox Code Playgroud)
在Scala中相对较新,我试图了解是否有其他方法来构建Creature对象而不使用Apply方法?是否可以使用匿名函数来创建对象而不是依赖于apply?
我有一些用例,其中我的对象中的大多数字段都可能丢失,但我仍然想要构建我的对象.为对象定义一个READ并为每个字段使用readnullable是否更好?
我也可能有复杂的条件,所以只是定义自定义函数来构建它而不是试图捕获一个Reader中的所有案例会更清晰吗?
现在我们正在讨论两种构建项目的方法
将项目分解为模块,每个模块包含所需的模型,异常和控制器.因此,用户模块可能包含用户模型,用户的所有可能的用户异常情况以及用于处理用户的REST端点
遵循传统方法,我们拥有顶级模型,服务,控制器,异常.然后在服务中将有子包,类似于例外.
结构1:
app/
/serviceA
/models
Foo.scala
/controllers
/exceptions
serviceA.scala
/serviceB
/models
Bar.scala
/controllers
/exceptions
serviceB.scala
Run Code Online (Sandbox Code Playgroud)
结构2:
app/
/controllers
/models
Foo.scala
Bar.scala
/exceptions
/serviceA
/serviceB
/services
/serviceA
/serviceB
Run Code Online (Sandbox Code Playgroud)
是否有推荐的项目结构,其中包含例外,服务,模型?
我遇到PDO预处理语句和rowCount的问题,返回错误的受影响行数.
我有一个简单的测试数据库:
create table test (
boolean var1;
);
Run Code Online (Sandbox Code Playgroud)
然后我有以下测试代码:
$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)");
$sth->execute(array(':val' => true));
echo $sth->rowCount();
Run Code Online (Sandbox Code Playgroud)
哪个按预期返回:受影响的一行
当我插入无效类型并且插入失败时:
$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)");
$sth->execute(array(':val' => 20));
echo $sth->rowCount();
Run Code Online (Sandbox Code Playgroud)
哪个按预期返回:0行受影响
但是,当我有多个插入 -
$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)");
$sth->execute(array(':val' => true));
echo $sth->rowCount() . ", ";
$sth->execute(array(':val' => 20));
echo $sth->rowCount();
Run Code Online (Sandbox Code Playgroud)
结果:1,1
如果我翻转执行顺序,我得到:0,1
为什么rowCount() - 在成功语句后的失败语句中未将受影响的行设置为零?
我正在运行php 5.3.6-13和Postgresql 9.1
我想将提交哈希放入Play Framework模板文件中,以便我可以通过REST GET调用查看构建信息.
在sbt我可以得到一个git commit hash和git branch name,无论如何在构建过程中将这些信息放入模板文件中?
build.sbt
name := "my-project"
val branch = "git rev-parse --abbrev-ref HEAD".!!.trim
val commit = "git rev-parse HEAD".!!.trim
val buildTime = (new java.text.SimpleDateFormat("yyyyMMdd-HHmmss")).format(new java.util.Date())
version := "%s-%s-%s".format(branch, commit, buildTime)
Run Code Online (Sandbox Code Playgroud) 我正处于构建 php/mysql 后端的初始阶段,该后端向网站和 iphone/android/等设备公开 REST 接口。
我不太确定处理使用同一帐户的多个设备的会话的“标准”或“最佳实践”是什么。
以下是我目前对其如何运作的想法:
我现在会使用 MySQL 来存储会话,会话表如下所示:
id、session_id(哈希)、user_id(int)、创建(时间戳)、过期(时间戳)、设备(枚举)
当用户通过 iOS 应用程序或 Android 应用程序登录时,我会在 success json 中返回一个会话令牌,以供将来的 api 调用使用。与网站进行 api 调用相同。
出于安全目的,如果用户重新登录,我应该重新生成并覆盖会话令牌,但仅限于该设备的 session_id。
我还有一个过期列,它告诉我会话的过期时间,这样,如果我愿意,我可以创建一个可以在两周内过期的会话,并由 CRON 作业定期清理。
这对我来说似乎是一个合理的方法,但如果用户使用 iPhone 和 iPad,或者使用同一帐户的多个 Android 设备,则会出现问题。任何时候用户使用其中一个登录都会导致另一个用户注销。
我注意到即使我从另一部 iPhone 登录,Instagram 也不会使会话无效。
但是,我认为我无法复制该行为,除非我在用户重新登录时从不覆盖会话令牌,或者每当用户从 iphone 登录时不断将会话行添加到我的会话表中?
跨不同设备处理会话的标准方法是什么?
每当我做composer.phar安装时,它都会清除Symfony的开发缓存.
有没有什么方法可以说清楚另一个环境缓存,比如生产?我知道我总是可以运行app/console cache:clear --env = prod.但我希望Composer在抓住依赖项后处理它.
我有一个用例,我需要接受空值,但不是缺少属性.这是在Play Framework 2.1.3上
例如:
case class Foo(a: Option[String], b: Option[String], c: Option[String])
Run Code Online (Sandbox Code Playgroud)
此案例类可以是更大案例类的一部分
我想接受以下内容并生成foo对象:
{
"foo" : {
"a" : "blah",
"b" : null,
"c" : "blah"
}
}
Run Code Online (Sandbox Code Playgroud)
但不是这个:
{
"foo" : {
"a" : "blah",
"c" : "blah"
}
}
Run Code Online (Sandbox Code Playgroud)
目前我有以下内容将JSON读入案例类:
val FooReader = (
(__ \ "a").readNullable[Setting] and
(__ \ "b").readNullable[String] and
(__ \ "c").readNullable[String])(Foo)
Run Code Online (Sandbox Code Playgroud)
如何使FooReader在缺少的属性上生成JsError但允许null?
我正在尝试读取可能具有来自客户端的以下参数的JSON
{
"email" : "foobar@gmail.com",
"password" : "XXXX",
"facebookToken": "XXXXXXXXXXX"
}
Run Code Online (Sandbox Code Playgroud)
该facebookToken可能是空或不存在,在这种情况下,电子邮件/密码应填,反之亦然.
我在构建这个阅读器时遇到了麻烦,这是我到目前为止所做的:
val loginEmail = (
( __ \ "email").read[String] and
( __ \ "password").read[String]
)((email: String, password: String) => new User(email, password))
val loginFacebook = (
( __ \ "facebookToken").read[String]
)((facebookToken : String) => new User(facebookToken))
val loginReader(RequestBodyJson) = (
(RequestBodyJson).read[User](loginEmail) or
(RequestBodyJson).read[User](loginFacebook)
)
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我如何正确地做到这一点?
我还希望它返回带有自定义消息的JSError.例如,如果FacebookToken不存在,并且电子邮件出现问题("电子邮件无效")而不是"/ facebookToken path not found"一般错误.