0

我的服务器上有一些 REST 服务(Jetty、RESTeasy)和一个 GWT 客户端。我选择在前端使用 Restlet-GWT 模块。

我创建了一个 JSE 客户端(RESTeasy 客户端)并且我的服务被很好地调用(我在 Jetty 服务器的日志中看到了 SQL 跟踪)并且我得到了一个 xml 响应。

然后我尝试从 GWT 和 Restlet。该网络服务被称为(码头日志),但我有一个空响应。

网络服务(后端):

@GET
@Path("/getArt/{id}")
@Produces("application/xml")
public Art getArt(@PathParam("id")int id){
    Art art= artDAO.findById(id);
    return art;
}

前端 GWT:

public class Front_End implements EntryPoint {

/**
 * This is the entry point method.
 */
public void onModuleLoad() {    
final Client client = new Client(Protocol.HTTP);
client.get("http://localhost:8080/rest/service/getArt/1", new Callback() {
    @Override
    public void onEvent(Request request, Response response) {

        System.out.println("Reponse : " + response.getEntity().getText());
    }
});
}

RESTeasy客户端工作:

public Object test(int id){
    try {

        ClientRequest request = new ClientRequest("http://localhost:8080/rest/service/getArt/"+id);

        request.accept("application/xml");
        ClientResponse<String> response = request.get(String.class);

        if (response.getStatus() == 200) 
        {
            Unmarshaller un = jc.createUnmarshaller();
            Object o = un.unmarshal(new StringReader(response.getEntity()));
            return o;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

RESTeasy 和 Restlet “兼容”吗?我应该在后端使用 Restlet 而不是 RESTeasy 吗?我错过了什么?

提前谢谢

4

1 回答 1

0

这是一个 SOP 问题。我的服务器在 8080 端口上运行,GWT 在 8888 端口上运行。

我使用了一个代理(把它放在客户端的 /war 中):

代理.jsp

<%@page import="javax.naming.Context"%>
<%@page import="javax.naming.InitialContext"%><%@page session="false"%>
<%@page import="java.net.*,java.io.*" %>

<%
try {
String reqUrl = request.getQueryString();
URL url = new URL(reqUrl.substring(4));

HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setDoOutput(true);
con.setRequestMethod(request.getMethod());
int clength = request.getContentLength();
if (clength > 0) {
    con.setDoInput(true);
    byte[] idata = new byte[clength];
    request.getInputStream().read(idata,0,clength);
    con.getOutputStream().write(idata,0,clength);
}
response.setContentType(con.getContentType());
BufferedReader rd = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
    out.println(line);
}
rd.close();
} catch (Exception e) {
    e.printStackTrace();
    response.setStatus(500);
}
%>

然后在您拨打电话的班级中,您的网址变为:

String url ="proxy.jsp?url=" + URL.encode("http://localhost:8080/rest/service/getArt/1");

还有另一种解决方法,请查看https://developers.google.com/web-toolkit/doc/1.6/tutorial/Xsite

于 2013-01-03T10:21:35.597 回答