PlayFramework 1 输出所有 WS.url() 访问的 URL

本文介绍如何在Play 1.x框架中自定义WebService,通过继承WSAsync并覆盖newRequest方法来记录所有通过WS.url访问的URL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录下这个其实没有多大的意义,新入手 Play 框架的应该直接就是用版本 2 了,只因我们还要系统工作在 Play1 下,所以记下来,估计在 Play2 中已无借鉴作用了。

我们在 Play1 中访问外部 WebService 资源都是用 WS.url(url),然后调用它的 get(), post(), delete() 等相对应的 HTTP 请求方法。我们可以系统中所有通过 WS.url() 访问的 URL, 需找到切面,Play 是在哪里为访问的 URL 创建请求的。

看 WS 类的实现,它是一个 PlayPlugin 插件,其中定义了

private static WSImpl wsImpl = null;

来看 Play 是如何获得 WSImple 实现的,WS 插件的初始化方法中:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
     private synchronized static void init() {
         if (wsImpl != null ) return ;
         String implementation = Play.configuration.getProperty( "webservice" , "async" );
         if (implementation.equals( "urlfetch" )) {
             wsImpl = new WSUrlFetch();
             if (Logger.isTraceEnabled()) {
                 Logger.trace( "Using URLFetch for web service" );
             }
         } else if (implementation.equals( "async" )) {
             if (Logger.isTraceEnabled()) {
                 Logger.trace( "Using Async for web service" );
             }
             wsImpl = new WSAsync();
         } else {
             try {
                 wsImpl = (WSImpl)Play.classloader.loadClass(implementation).newInstance();
                 if (Logger.isTraceEnabled()) {
                     Logger.trace( "Using the class:" + implementation + " for web service" );
                 }
             } catch (Exception e) {
                 throw new RuntimeException( "Unable to load the class: " + implementation + " for web service" );
             }
         }
     }

也就是 WSImpl 实现类优先从配置文件中,以 webservice key 获得,默认为 async, 也可设置为 urlfetch

基于此我们可以在 application.conf 中定义自己的 webservice,如

webservice=utilities.MyAsync

为了保持与默认行为一致,我们让 MyAsync 继承自 WSAsync,然后重写方法

public WSRequest newRequest(String url, String encoding)

这里就是每次访问的 URL,最后调用 super.newRequest(url, encoding) 返回即可。

完整的 MyWSAsync 代码如下:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
package utilities;
 
import play.Logger;
import play.libs.WS.WSRequest;
import play.libs.ws.WSAsync;
 
public class MyWSAsync extends WSAsync {
 
     public WSRequest newRequest(String url, String encoding) {
 
        Logger.trace( "Access URL: %s" , url); //这里输出了所有通过 WS.url() 访问的 URL
       
         return super .newRequest(url, encoding);
     }
}

这样既保持了系统的默认行为,又输出了每次通过 WS.url() 访问的 URL,以便于观察数据。

不总结不知道,一总结吓一跳,在写本文之前我在 MyWSAsync 还使用了返射构造函数来创建要返回的 WSRequest 实例,不知当初怎么想的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值