【问题标题】:RESTeasy back-end - Restlet front-end : response entity nullRESTeasy 后端 - Restlet 前端:响应实体 null
【发布时间】:2012-12-30 10:04:18
【问题描述】:

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

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

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

Web 服务(后端):

@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 吗?我错过了什么?

提前谢谢

【问题讨论】:

  • 这应该可以正常工作,Restlet-GWT 可以与任何 HTTP 服务器通信。如果您确实在服务器端使用 Restlet,那么您可以从一些自动 bean 序列化中受益。您使用的是哪个版本的 Restlet? RESTeqsy 返回到 Restlet=GWT 的响应是什么?
  • 感谢您的回答,事实上我遇到了 SOP 问题。它不是由 Restlet 引起的。

标签: http gwt jetty restlet resteasy


【解决方案1】:

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

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

proxy.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

【讨论】:

  • 太好了,顺便说一句,Restlet API 带有一个 Redirector 类,可以帮助您以更简单的方式编写此类反向代理。
猜你喜欢
  • 2018-11-25
  • 1970-01-01
  • 2021-05-25
  • 2018-11-02
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2021-09-28
  • 2020-08-05
相关资源
最近更新 更多