我已经看到了几个GWT代码摘录,开发人员扩展了DefaultRequestTransport
并为其提供了自定义功能。其中一个例子是this SO question regarding authentication/login filters。但除了这个例子,我还看到了其他几个。
我的问题:什么时候&为什么有人需要扩展这个类并覆盖它的方法?(换句话说,这个类做什么,它的方法执行什么服务,为什么我需要自定义它们?)
在这个例子中,覆盖了createRequestCallback
方法。根据该方法的Javadocs,它的目的是:
创建一个RequestCallback,将HTTP响应映射到TransportReceiver接口。
这对我来说仍然是一个神秘的解释。有人可以给我一个外行解释,说明扩展这个类并覆盖其中一个以上的方法会有什么好处吗?提前谢谢!
答案 0 :(得分:2)
RequestFactory不依赖于特定的“传输”机制;它处理请求和响应的JSON表示,但它们交换和传输的方式是超出范围,并且延迟到RequestTransport
。
DefaultRequestTransport
使用RequestBuilder
给定(但可配置)的网址;因为它使用RequestBuilder
,所以它只能在GWT客户端中使用(要编译为JavaScript)。还有UrlRequestTransport
使用java.net.HttpURLConnection
并且可以在JVM中运行的任何客户端上使用(服务器调用另一个服务器,Android应用程序,桌面Java应用程序等)< / p>
理论上(因为我从未尝试过而且从未听过其他人尝试过它),你可以制作一个使用Comet或WebSockets的RequestTransport
,或者你想要的任何一种传输方式。当然,服务器端也必须进行调整(SimpleRequestProcessor
可以在RequestFactoryServlet
之外轻松重用;这是类似的关注点分离)
返回DefaultRequestTransport
:它使用RequestBuilder
并提供一些可以覆盖的挂钩来自定义它的工作方式。最常见的用例是在解码JSON编码的RequestFactory响应之前拦截添加一些请求头(例如凭证)和/或所有响应以处理特定HTTP响应的所有请求(例如,拦截“未授权”响应以询问用户登录)
DefaultRequestTransport
作为RequestFactory API与RequestBuilder
之间的适配器,createRequestCallback
是负责调整响应的一半。
答案 1 :(得分:1)
在显示的示例中,他们需要扩展DefaultRequestTransport以检查所有RF服务器响应并捕获401状态(SC_UNAUTHORIZED),这意味着请求在服务器端被拒绝,因为用户没有有效会话,然后重定向用户到应用程序登录页面。
我也使用DefaultRequestTransport更改requestUrl(默认设置为gwtRequest
),因此我可以根据url模式设置过滤器:例如,经过身份验证的RF服务转到{{1} }或未经过身份验证的RF服务转到/myapp/gwtRequest
等。
我还有一个自定义的RequestTransport,它使用RequestBuilder和XMLHttpRequest的修改版本来监控onprogress事件,对大量请求非常有帮助。
您可以扩展它以发送用于执行CORS身份验证的自定义标头。
总之/myapp/anonymousRequest
是修改RF的客户端传输层的方法。