4

问题:

在本地,我的应用程序运行良好。我的 HTTP GET 返回代码 200 和最终 URL:http://vow.mlspin.com/clients/index.aspx

我的应用程序的其余部分也很好用。

当我将代码部署到 GAE 服务器(我使用 Eclipse 插件进行部署)时,我的应用程序停止工作,因为返回了错误的 html 页面!返回码仍然是 200,但 URL 现在是(最终 URL):http: //vow.mlspin.com/clients/signin.aspx ?id=

我的问题是:重定向有问题吗?谷歌应用引擎服务器是否以某种方式被列入黑名单?我在这里做错了什么?有没有人遇到过这个?

我发现的最接近的问题是这个:来自 GAE Java 的 Http GET我已经实现了这个建议,但到目前为止它对我没有用。

谢谢大家!

Additional Info -> 下面是来自相同 GET 请求的 HTTPResponse 标头,一个来自本地部署,另一个来自 GAE 部署。

本地 HTTP 响应标头

Date :: Tue, 24 Apr 2012 04:12:32 GMT
Server :: Microsoft-IIS/6.0
X-Powered-By :: ASP.NET
X-AspNet-Version :: 2.0.50727
P3P :: CP="NOI DSP COR NID ADMa OPTa OUR NOR"
Cache-Control :: no-cache
Pragma :: no-cache
Expires :: -1
Content-Type :: text/html; charset=utf-8
Content-Length :: 133704

部署的 HTTP 响应标头

date :: Tue, 24 Apr 2012 04:11:19 GMT
server :: Microsoft-IIS/6.0
x-powered-by :: ASP.NET
x-aspnet-version :: 2.0.50727
p3p :: CP="NOI DSP COR NID ADMa OPTa OUR NOR"
cache-control :: private
content-type :: text/html; charset=utf-8
content-length :: 4991
x-google-cache-control :: remote-fetch
via :: HTTP/1.1 GWA

我如何制定我的要求:

首先我尝试了简单的方法

Document doc = Jsoup.connect(baseMLSURL).get();

然后我试着去低级,只使用 java.net

private String getHttpFromServer(String url) throws IOException
    log.severe("getting http from: "+ url);
    StringBuilder sb = new StringBuilder();
    URL yahoo = new URL(url);
    URLConnection yc = yahoo.openConnection();
    yc.setRequestProperty("Host", "vow.mlspin.com");
    yc.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1");
    BufferedReader in = new BufferedReader(
                            new InputStreamReader(
                            yc.getInputStream()));
    String inputLine;

    while ((inputLine = in.readLine()) != null) {
        sb.append(inputLine.replaceAll("&nbsp", " ")+"\r\n");
    }
    in.close();

    return sb.toString();
}

最后我也尝试使用谷歌的 URLFetcher

private String getHttpUsingFetchService(String url) throws MalformedURLException, IOException {
    URLFetchService fetchService = URLFetchServiceFactory.getURLFetchService();
    HTTPResponse targetResponse = fetchService.fetch(new URL(url)); // Error
    log.severe("Code returned from request: "+targetResponse.getResponseCode());
    log.severe("final URL: "+targetResponse.getFinalUrl());
    String result = new String(targetResponse.getContent());
    return result.replaceAll(" ", " ");
}
4

2 回答 2

5

几个月前我们在这里也遇到过类似的事情。最后,谜团在于该网站重定向到自己并期望看到它设置的一些cookie。但是 urlfetch 重定向处理不会发送它收到的任何 cookie。本地运行时的 urlfetch 仿真可能与 cookie 不同。

如果你不能让它工作,你可能想在 urlfetch 中关闭重定向跟踪并自己管理重定向和 cookie。

于 2012-04-24T05:15:40.783 回答
0

您尝试访问的服务需要身份验证。尝试访问您在新浏览器或隐身窗口中发布的第一个 URL - 您将被重定向到第二个 URL。您需要使用您的应用程序执行登录步骤,然后获取您发出的 cookie 并在所有后续请求中发送它们。

于 2012-04-24T00:38:20.403 回答