Heg*_*mon 6 java web-services playframework-2.1
我对这个问题中使用的许多概念和技术都相当新,所以我希望对社区初学者有一点了解和帮助.我正在使用Play Framework 2.1.3版,我需要将数据POST到RESTful Web服务,以便可以将其插入远程数据库.将返回XML响应,指示成功或失败.
我相信您知道Play Framework的文档非常缺乏,对初学者没有任何帮助,因此我不确定如何在考虑最佳实践的情况下完成此任务.我正在寻找这个问题的Java解决方案,我目前没有时间学习Scala语言.我对Web服务的经验相当有限,通常我会在我的应用程序中实现DAO设计模式(或根据需要使用许多可用的ORM库之一)并使用JDBC直接连接到数据库.这不是一个选择.
我的第一个问题是,是否有推荐的访问Web服务的设计模式?然后,考虑到Play MVC框架,如何最好地实现这样的设计模式,打包数据(假设应用程序已经捕获并验证了用户的数据),将其发送出去并将响应处理回用户?
我知道这是一个相当冗长的问题,但我的目的是为初学者创建一个知识库,他们可以轻松地获得有限的经验,阅读,理解和复制他们在这里找到的东西,以产生一个有效的解决方案.在广泛搜索网页后,我发现了一些脱节的片段,但没有具体涉及这些技术,也没有最新的教程.感谢您的时间.
kap*_*pex 11
创建请求很简单.首先,您提供一个URL.有多种方法可以向请求添加内容类型,查询参数,超时等.然后,您选择一个请求类型,并可选择添加一些要发送的内容.例子:
WSRequestHolder request = WS.url("http://example.com");
request.setQueryParameter("page", "1");
Promise<Response> promise = request.get();
Run Code Online (Sandbox Code Playgroud)
Promise<Response> promise = WS.url("http://example.com").post(content);
Run Code Online (Sandbox Code Playgroud)
复杂的部分是发送它并使用请求的响应.我假设您有一个控制器应该Result根据Web服务的响应返回给用户.结果通常是渲染模板或可能只是状态代码.
播放通过使用期货和承诺避免阻止.控制器的async方法采用a Promise<Result>并在稍后的某个时刻返回结果(未来值).上面显示的get和post方法提供了一个简单易用的承诺.您不需要关心它们的实现,您只需要知道它们承诺Response在请求完成后提供.
注意这里的问题:用WS.url("...").get()它创建一个请求会给你一个Promise<Response>尽管async需要一个Promise<Result>.在这里,您必须自己实现另一个承诺,它将使用该map方法将响应转换为结果.如果您遵循Play文档,这看起来会有点令人困惑,因为Java没有闭包(但是)并且所有内容都必须包含在类中.您不必在方法调用中使用匿名类.如果您更喜欢更干净的代码,您也可以这样做:
return async(
request
.get() // returns a `Promise<Response>`
.map(resultFromResponse) // map takes a `Function<Response, Result>` and
// returns the `Promise<Result>` we need
);
Run Code Online (Sandbox Code Playgroud)
该对象resultFromResponse可能如下所示.它实际上就像某种回调方法的繁琐定义,它采用一个Response唯一的参数并返回一个Result.
Function<Response, List<T>> resultFromResponse =
new Function<Response /* 1st parameter type */, Result /* return type */>() {
@Override
public Result apply(Response response) {
// example: read some json from the response
String message = response.asJson().get("message");
Result result = ok(message);
return result;
}
};
Run Code Online (Sandbox Code Playgroud)
正如@itsjeyd在评论中指出的那样,在Play 2.2.x中调用webservices时,你不再需要打电话async了.你只需返回Promise<Result>:
public static Promise<Result> index() {
return request.get().map(resultFromResponse);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9627 次 |
| 最近记录: |