0

如果有任何错误,请原谅我 - 我对 Java 完全陌生。我的任务是为即将推出的 Facebook 游戏设置客户端/服务器架构。在服务器端,我有:

  • 爪哇
  • 雄猫
  • 高枕无忧
  • BlazeDS
  • 发音

所有这些都与 Maven 结合在一起。我可以用 @Path() 注释 RESTful 端点,当我在浏览器中点击它们时,它们会吐出在 AMF 中序列化的对象。到现在为止还挺好。现在我需要在客户端/Flex 端使用这些端点。Enunciate 已经为我在 Java 中使用 @XmlRootElement 注释的类型生成了 AS 文件,我可以在我的 AS3 代码中使用这些类型。问题是在 AS3 中访问 REST 端点非常难看。它看起来像这样:

function resourceRetrieved(event:Event):void {
  var stream:URLStream = URLStream( event.target );
  var resource:SomeJavaClass = ( stream.readObject() as SomeJavaClass );
  lblResult.text = resource.message; 
}

var request:URLRequest = new URLRequest("http://localhost:8080/rest/somefunc");
request.method = URLRequestMethod.GET;

var variables:URLVariables = new URLVariables();
variables.message = "This is my test string!";
request.data = variables;

var resourceStream:URLStream = new URLStream();
resourceStream.addEventListener("complete", resourceRetrieved)
resourceStream.load(request);

丑陋 - 我必须手写这个才能获得强类型的好处。然而!我在挖掘源代码时注意到,如果使用@WebService 和@WebMethod 标签而不是@Path,我的服务类的精彩强类型AS3 包装器将由Enunciate 生成,以及相应的AS3 事件。它还会生成正确的 services-config.xml!然后用法变成这样:

function onSomeFuncEvent(event:SomeJavaServiceEvent):void {
  lblResult.text = event.result;
}

var service:SomeJavaService = new SomeJavaService();
service.addEventListener( SomeJavaServiceEvent.SomeFuncEvent, onSomeFuncEvent );
service.someFunc("This is my test string!");

如您所见,生成代码的使用者不需要知道端点在哪里,从事件返回什么类型等。我想走这条路线,因为我相信它会更容易维护。这让我想到了我的问题:

  1. 为什么只为@WebService 和@WebMethod(互联网告诉我是JAX-WS)而不是@Path 生成美妙的Service 和ServiceEvent 对象?是尚未完成的工作,还是鉴于 JAX-RS 和 JAX-WS 之间的规范差异而无法完成的工作?(我看到 as3-endpoint.fmt 专门只适用于代码中的@WebService)
  2. 我想在这里使用 REST 有错吗?我的 CTO 推荐了 Java/Tomcat/RestEasy/BlazeDS 堆栈,但在我看来(在摆弄了一两天之后)BlazeDS/Flex 与 REST 相处得不太好。
  3. 是否有我应该考虑的 Java->AMF->Flex 堆栈?

感谢您抽出宝贵时间,如果这些是明显的问题,我再次感到抱歉。我的背景是游戏开发,而不是网络开发。

4

1 回答 1

0

为什么只为@WebService 和@WebMethod(互联网告诉我是JAX-WS)而不是@Path 生成美妙的Service 和ServiceEvent 对象?是尚未完成的工作,还是鉴于 JAX-RS 和 JAX-WS 之间的规范差异而无法完成的工作?(我看到 as3-endpoint.fmt 专门只适用于代码中的@WebService)

这是可以完成但尚未完成的工作是否应该这样做还有一个悬而未决的问题。

REST 很难。面向服务的 API(例如 SOAP、AMF)对开发人员来说更加直观。JAX-RS 使创建 REST API 变得很容易,但代价是给开发人员更多的绳索让自己上吊。更具体地说,JAX-RS 使创建基于 HTTP 的 API 变得容易,但仅仅因为它使用 HTTP 并不能使其成为 REST。为了更好地理解我在说什么,我建议 Martin Fowler 关于理查森成熟度模型的文章:

http://martinfowler.com/articles/richardsonMaturityModel.html

因此,REST 不仅仅是发出 HTTP 请求并解析响应。通过扩展,创建调用 JAX-RS 资源(即@Path)的客户端服务不仅仅是将 HTTP 调用包装在方便的 AMF 服务类中。缓存、分层、HATEOAS 等等等等,都会发挥作用,并且必须“隐藏”在 Enunciate 生成的客户端服务中。

我想在这里使用 REST 有错吗?

您没有,但您似乎低估了“使用 REST”的含义。所以IMO,你有两个选择:

  1. 只需使用 JAX-WS 创建一个面向服务的 API。
  2. 去了解 REST 到底是什么,以及如何将它真正应用到您的问题空间中。并且不要低估其中的复杂性。REST 很难。

我的 CTO 推荐了 Java/Tomcat/RestEasy/BlazeDS 堆栈,但在我看来(在摆弄了一两天之后)BlazeDS/Flex 与 REST 相处得不太好。

也许。至少有一件事是肯定的:BlazeDS/AMF 的设计者在设计他们的堆栈时并没有考虑 REST。

是否有我应该考虑的 Java->AMF->Flex 堆栈?

BlazeDS 和 GraniteDS 是我能想到的仅有的两个。他们都是很好的 IMO,所以请选择。

于 2011-11-14T17:34:06.217 回答