小编Jam*_*hen的帖子

HTTP标头或响应正文中的休息错误消息?

我有一个暴露给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)

rest http http-error

73
推荐指数
2
解决办法
6万
查看次数

何时使用Actors vs Futures?

我目前正在玩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)

我想知道我们是否应该使用演员来提供我们的服务,或者仅仅使用期货.

  1. 我们没有任何需要在服务参与者中修改的内部状态,无论消息进入函数并吐出结果.这不是演员模特的大力量吗?

  2. 我们正在做很多任务,这些任务似乎与演员模型相差甚远

  3. 我们没有进行繁重的计算和远程处理没有意义,因为大多数工作是针对数据库和对一个远程actor进行往返操作来进行一些db调用是不必要的

  4. 我们确实使用reactivemongo,因此每个db调用都是非阻塞的.我们可以打很多电话

在我看来,删除akka并使用Futures让我们的生活变得更轻松,而且我们并没有真正失去任何东西.

akka playframework-2.2

32
推荐指数
2
解决办法
1万
查看次数

守护进程中的Doctrine2连接超时

我有一个长时间运行的守护程序(Symfony2 Command),可以在Redis中的工作队列中工作,并使用orm执行这些作业并写入数据库.

我注意到,当工人怠速等待工作时,工作人员有死亡的倾向,因为与MySQL的连接超时.

具体来说,我在日志中看到了这一点:MySQL Server已经消失了.

无论如何我可以让学说自动重新连接吗?或者有什么方法可以手动捕获异常并重新连接学说orm?

谢谢

php doctrine symfony doctrine-orm

19
推荐指数
4
解决办法
2万
查看次数

玩JSON组合器

在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中的所有案例会更清晰吗?

scala playframework playframework-2.0 playframework-2.1

9
推荐指数
1
解决办法
2120
查看次数

Play Framework Project推荐的结构

现在我们正在讨论两种构建项目的方法

  1. 将项目分解为模块,每个模块包含所需的模型,异常和控制器.因此,用户模块可能包含用户模型,用户的所有可能的用户异常情况以及用于处理用户的REST端点

  2. 遵循传统方法,我们拥有顶级模型,服务,控制器,异常.然后在服务中将有子包,类似于例外.

结构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)

是否有推荐的项目结构,其中包含例外,服务,模型?

playframework playframework-2.0

8
推荐指数
1
解决办法
4197
查看次数

PDO rowCount未返回正确数量的受影响的行

我遇到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

php pdo

6
推荐指数
1
解决办法
2796
查看次数

如何将提交哈希添加到播放模板?

我想将提交哈希放入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)

sbt playframework playframework-2.1 playframework-2.2

6
推荐指数
1
解决办法
1526
查看次数

如何处理跨不同设备的会话?

我正处于构建 php/mysql 后端的初始阶段,该后端向网站和 iphone/android/等设备公开 REST 接口。

我不太确定处理使用同一帐户的多个设备的会话的“标准”或“最佳实践”是什么。

以下是我目前对其如何运作的想法:

  1. 我现在会使用 MySQL 来存储会话,会话表如下所示:

    id、session_id(哈希)、user_id(int)、创建(时间戳)、过期(时间戳)、设备(枚举)

  2. 当用户通过 iOS 应用程序或 Android 应用程序登录时,我会在 success json 中返回一个会话令牌,以供将来的 api 调用使用。与网站进行 api 调用相同。

  3. 出于安全目的,如果用户重新登录,我应该重新生成并覆盖会话令牌,但仅限于该设备的 session_id。

  4. 我还有一个过期列,它告诉我会话的过期时间,这样,如果我愿意,我可以创建一个可以在两周内过期的会话,并由 CRON 作业定期清理。

这对我来说似乎是一个合理的方法,但如果用户使用 iPhone 和 iPad,或者使用同一帐户的多个 Android 设备,则会出现问题。任何时候用户使用其中一个登录都会导致另一个用户注销。

我注意到即使我从另一部 iPhone 登录,Instagram 也不会使会话无效。

但是,我认为我无法复制该行为,除非我在用户重新登录时从不覆盖会话令牌,或者每当用户从 iphone 登录时不断将会话行添加到我的会话表中?

跨不同设备处理会话的标准方法是什么?

php mysql session ios

5
推荐指数
1
解决办法
6052
查看次数

Composer.phar Symfony清除缓存

每当我做composer.phar安装时,它都会清除Symfony的开发缓存.

有没有什么方法可以说清楚另一个环境缓存,比如生产?我知道我总是可以运行app/console cache:clear --env = prod.但我希望Composer在抓住依赖项后处理它.

symfony

5
推荐指数
1
解决办法
6347
查看次数

播放斯卡拉杰森失踪物业vs Null

我有一个用例,我需要接受空值,但不是缺少属性.这是在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?

scala playframework playframework-2.0 playframework-2.1

5
推荐指数
1
解决办法
2729
查看次数

Play Framework JSON Reader和自定义JSErrors

我正在尝试读取可能具有来自客户端的以下参数的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"一般错误.

scala playframework playframework-2.0 playframework-2.1

2
推荐指数
1
解决办法
1108
查看次数