2012-04-23 2 views
4

Проблема:App Engine в: HTTP GET работает локально, но не при развертывании на GAE на конкретный URL

Локально мое приложение работает отлично. Мой 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=

Мой вопрос: Есть ли проблема с переадресовывает? Являются ли серверы приложений Google как-то занесены в черный список? Что я здесь делаю неправильно? Кто-нибудь сталкивался с этим раньше?

Ближайший вопрос, который я нашел, был следующим: Http GET from GAE Java Я реализовал это предложение, но пока это не сработало.

Спасибо вам заранее!

Дополнительная информация -> ниже - заголовки HTTPResponse из одного и того же точного запроса GET, один из локального развертывания, а другой из развертывания GAE.

Локальный HTTP Response Headers

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 Response Headers

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(); 
} 

Наконец я также пытался использовать Google в 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(" ", " "); 
} 

ответ

5

У нас было что-то подобное здесь несколько месяцев назад. В конце концов, тайна заключалась в том, что сайт перенаправлялся к себе и ожидал увидеть какой-нибудь куки-файл, который он установил. Но обработка перенаправления urlfetch не отправляет куки-файлы, которые он получает. Возможно, эмуляция urlfetch при запуске локально делает что-то другое с файлами cookie.

Если вы не можете заставить это работать, вы можете отключить перенаправление, следуя в urlfetch, а также управлять перенаправлениями и файлами cookie.

+0

Это отличный совет, я собираюсь попробовать его сегодня вечером. Посмотрите, что я могу придумать. – eak12913

+0

** update ** @ guido-van-rossum Я попытался отключить переадресацию и сам управлять кукисами, но после 4 переадресаций и настройки двух файлов cookie сервер, наконец, перенаправляет меня на страницу входа! Я здесь немного потерял. Я пробовал всевозможные комбинации настройки двух файлов cookie, которые я получал с сервера, но каждый раз - никакой радости. Есть ли другой способ обойти это? – eak12913

+0

Спасибо за эту информацию. Это абсолютно ужасный дизайн. Я потратил много времени на то, чтобы понять, почему мой код работает локально, но не работает на AppEngine. – Chris

0

сервис вы пытаетесь для доступа требуется аутентификация. Попробуйте посетить первый URL-адрес, который вы разместили в новом браузере или окне инкогнито - вы будете перенаправлены на второй URL-адрес. Вам необходимо выполнить шаги входа с помощью вашего приложения, а затем взять файлы cookie, которые вы выпустили, и отправить их по всем последующим запросам.

+0

Требуется правильная проверка подлинности, но этот веб-сайт mls позволяет просто ввести идентификатор пользователя и пароль прямо в запрос GET. Когда я создаю свой первоначальный запрос GET, я добавляю идентификатор и пароль пользователя mls. Вот как выглядит строка url: final String baseMLSURL = "http://vow.mlspin.com/?cid="+mlsUID+"&pass="+mlsPass+" "; – eak12913

+0

@ eak0703 Ну, очевидно, что вам не нравятся ваши учетные данные - он отправляет вам перенаправление на страницу входа. Почему это полностью зависит от того, для чего его логика для этого. –

+0

Странно то, что я жестко закодировал идентификатор пользователя и пароль, и когда я развертываю локально работающий Jetty (или любой другой сервер, использующий плагин eclipse Google), у меня нет проблем. Я выдаю свой GET, и я вернул страницу портала «вошел в систему». Как только я развертываю серверы GAE, я выдаю тот же самый точный запрос GET, но вернусь к другой странице. – eak12913

Смежные вопросы