GWT请求生成器问题(相同的站点策略问题?)

时间:2010-03-05 21:17:58

标签: python json gwt same-origin-policy

我在这个'配置'中尝试GWT:

1)我在python中编写了一个服务器后端,它将产生json输出(运行在localhot:8094)

2)我编写了一个非常简单的GWT应用程序,它将使用RequestBuilder将GET设置为python服务器(在GWT eclipse插件的开发模式下,可通过http://127.0.0.1:8888/test.html访问)

代码只是

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class Test implements EntryPoint {
    /**
     * The message displayed to the user when the server cannot be reached or
     * returns an error.
     */

    private static final String SERVER_URL = "http://localhost:8094";
    private static final String SERVER_ERROR = "An error occurred while "
            + "attempting to contact the server. Please check your network "
            + "connection and try again.";

    /**
     * This is the entry point method.
     */
    public void onModuleLoad() {

        RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, SERVER_URL);
        try {
            requestBuilder.sendRequest(null, new Jazz10RequestCallback());
        } catch (RequestException e) {
            Window.alert("Failed to send the message: " 
                    + e.getMessage());
        }

    }

    class Jazz10RequestCallback implements RequestCallback{

        public void onError(Request request, Throwable exception) {
                // never reach here
        Window.alert("Failed to send the message: "
                    + exception.getMessage());

        }

        public void onResponseReceived(Request request, Response response) {
            // render output
            Window.alert(response.getText());

        }


    }
}

然而警报总是来自onResponseReceived并且什么也没显示(我想是空字符串)

我可以直接访问我的python服务器并通过浏览器下载json。但我看不到任何从GWT到服务器的请求。

我已确保“inherits name ='com.google.gwt.http.HTTP”位于gwt.xml文件中

问题是:

1)这里的网站政策限制是否相同?我希望Exception(因此失败消息),但它没有发生

2)如果它确实是同一个站点策略问题,那么从python后端部署GWT脚本的最简单方法是什么? eclipse gwt插件在war子目录中产生一些工件。是否足以将这些文件复制到我的python后端的某个静态目录中?

3 个答案:

答案 0 :(得分:2)

1)是的,虽然主机是相同的,但您正在尝试访问其他端口 - SOP不允许这样做。您可能正在获得JavaScript异常 - 请查看Firebug的控制台或类似内容。

2)关注官方文档中的guide。您不需要Java服务器 - 只需一个可以提供HTTP内容的服务器(例如,Apache就可以了)。我没有Python作为后端的经验,但我确信有一个服务Python和HTTP的解决方案。

  

使用-noserver标志时,你的   GWT使用外部服务器   托管模式浏览器为两者提供服务   你的动态内容,以及所有静态内容   内容(例如GWT应用程序)   主页,其他HTML文件,图像,   CSS,依此类推。)

在这种情况下,动态内容将是您的Python脚本。

答案 1 :(得分:1)

是的,由于SOP,这将失败。你得到什么HTTP响应代码?通常在这种情况下,返回为0而不是200(OK)。一个解决方案可能是使用JSONP方法,我在JSONP上用GWT写了一些文章,作为本文的一部分:http://www.bristol-gtug.org/?p=76

答案 2 :(得分:1)

这可能为时已晚。如果您没有使用相对路径等访问本地资源,那么您是对的,它需要SOP(相同的原始策略)。 -no-server标志对解决此问题没有多大帮助。要绕过此问题,请阅读http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/FAQ_JSONFeedsFromOtherDomain。一个更好的解决方案是使用com.google.gwt.jsonp.client.JsonpRequestBuilder,(记得继承继承name ='com.google.gwt.jsonp.Jsonp'\),这是由gdata api使用的(“更好“从某种意义上说,你不必自己写。”希望这可以帮助。干杯〜