我想知道如何更改gwt-rpc调用的响应代码。在成功甚至失败期间(当抛出
Exception
时),服务器端的响应代码始终为 200。例如,请参见下面的代码。
这是我的客户端代码
private void doSomething(String something) {
service.doSomething(something, new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(Boolean result) {
}
}
});
}
我的服务器端代码如下所示
public class ServiceImpl extends AbstractXsrfProtectedServiceServlet implements Service {
public boolean doSomething(String something) throws Exception {
if(!something.isEmpty()) {
try {
log("Something done");
return true
} catch (UnAuthorizedException uae) {
//....Do Something so that the response from server is 401 instead of 200.
}
}
return false;
}
}
在这种情况下,从服务器端到客户端的响应始终具有状态代码 200。即,期间
如果抛出异常,从服务器到客户端的示例响应如下所示,
HTTP/1.1 200 200
Server: Apache
Content-Disposition: attachment
Content-Length: 288
X-XSS-Protection: 0
X-Content-Type-Options: nosniff
Connection: close
Content-Type: application/json;charset=utf-8
> //EX[0,5,67,4,3,["UnAuthorizedException/2807456106","UnAuthorizedException$ErrorCode/634580222","You are unauthorized to perform this action"],2,8]
所以我想知道是否有一种方法可以捕获我评论过的相关异常,并将当前 rpc 调用的响应设置为我们想要的内容,例如 400、401 等而不是 200。
虽然您可以执行此操作,但如果状态代码不是 200,客户端 AsyncCallback 将收到带有
onFailure
的 StatusCodeException
调用。这是因为非 200 代码意味着“对服务器的 network 调用 出现问题”,而不是“在服务器上的 method 调用 出现问题”。您必须确定您想以这种方式处理失败。
相反,GWT-RPC 将 200 OK 响应中的失败编码为异常。成功的响应以 //OK[...
开头,失败的响应以
//EX[...
开头。然后,有效负载中的序列化对象将表示 RemoteService 子类型的方法声明的异常对象。如果故障应该是客户端应用程序与服务器应用程序通信方式的一部分,则可能应该将其声明为 RemoteService 类型的一部分。
如果您有一个代理或过滤器试图干预并说“等待这个调用不会发生,因为 XYZ”,那么发送不同的状态代码可能是有意义的 - 并且客户端应用程序必须通过测试来处理该问题
StatusCodeException
s.