2015-05-28 3 views
0

Я использую сторонний Java API для получения результатов от Google Search Appliance в моем веб-проекте Spring. URL-адрес построенного API выглядит правильно. Я отправил запрос на веб-браузер с сгенерированным URL-интерфейсом API и работал (результаты поиска вернулись правильно). Более того, я пробовал URL с автономным Java-проектом, который я создал, чтобы получить InputStream, и он тоже работал. Проблема возникает, когда я пытаюсь получить результаты в своем проекте. Он падает на этапе создания InputStream и дает эту ошибку:Http 502 Ошибка при попытке получить InputStream в моем проекте Spring

java.io.IOException: Server returned HTTP response code: 502 for URL: http://myIP:80/search?access=p&output=xml&client=default_frontend&lr=lang_en&num=100&requiredfields=gsaentity_language%3AEnglish&site=default_site 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626) 
    at java.net.URL.openStream(URL.java:1037) 
    at net.sf.gsaapi.GSAClient.search(Unknown Source) 
    at net.sf.gsaapi.GSAClient.getGSAResponse(Unknown Source) 
    at net.sf.gsaapi.GSAClient.getGSAResponse(Unknown Source) 

вещей, которые я пробовал, которые не работали для меня до сих пор:

  • я использовал интерфейс API, (переопределение) для обработки HttpConnection и создания InputStream вручную. Через этот интерфейс некоторые параметры прокси могут быть добавлены в HttpConnection. (Интерфейс с именем GSAClientDelegate с методом getResponseStream)
  • Я проверил коды API в случае обнаружения чего-то, что вызывало проблемы с прокси-сервером и т. Д. Я не мог найти ничего подобного.
  • Как указано в ответе, я проверил имена коллекции, frontend, proxystylesheet, и они в порядке. В противном случае я не смог бы достичь результатов через веб-браузер или автономный проект Java прямо?

Прошло почти 1 неделю. Я продолжаю сталкиваться с этой досадной и загадочной ошибкой, и я начинаю сходить с ума.

Что я могу сделать по этой проблеме?

ответ

0

Я, наконец, понял причину проблемы. Это из-за API java.net.HttpUrlConnection. Он использует фабрику общих подключений, которая может вызвать такие ошибки. Я заменил его Apache HttpClient. И никаких проблем не обнаружились:

import org.apache.http.HttpResponse; 
    import org.apache.http.client.HttpClient; 
    import org.apache.http.client.methods.HttpGet; 
    ......... 
public InputStream getConnectionStream(String fullUrl){ 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(fullUrl); 
     HttpResponse response = client.execute(request); 
     InputStream is = response.getEntity().getContent(); 

     return is; 
} 
0

Во-первых, это 5xx error, поэтому проблема не (вообще) лежит на любой системе, которую вы контролируете. Если вы последовательно получаете эту ошибку, то сторонний поставщик API, с которым вы взаимодействуете, испытывает технические трудности, и вы должны связаться с ними как можно скорее.

Поскольку вы можете пройти через a gateway or proxy, рассмотрите возможность использования прямого подключения к ресурсу, который вам нужен.

+0

Я пришел к выводу, что это не имеет ничего общего с API (я исследовал каждую строку исходного кода API). Теперь у нас есть последнее, что нужно рассмотреть: Spring MVC framework. Причина в том, что я создал InputStream на свой собственный код и отправил его в функцию анализатора SAX XML parser, снова появилась ошибка при создании объекта InputStream. Это действительно логично. – metzelder

+0

Я был бы несколько удивлен, если API создал 502.Я мог видеть 500 (любое исключение выбрано), но 502 - это то, что связано с фактическим сервером (шлюзом или прокси), поддерживающим API. Борьба с исходным кодом не вызовет ничего очевидного. Вы получаете 502 последовательно, не так ли? – Makoto

+0

Невозможно сказать. Я видел 407 (ошибка аутентификации) редко. – metzelder

0

Вы, скорее всего, сделали опечатку в параметре вашего запроса.

Ошибка 502 обычно означает, что вы пытаетесь загрузить интерфейс (так что проверьте параметр client/proxystylesheet) или коллекцию (проверьте параметр site. Default_site? Реальное значение по умолчанию - default_collection, если вы не создали новый) t существует.

+0

default_collection существует в моей системе. Как вы можете видеть, я не указал параметр proxystylesheet в своем URL-адресе. Должен ли я? – metzelder

+0

URL-адрес работает, когда я пытаюсь связаться с ним через мой браузер. Но в проекте не повезло. – metzelder

-1

Я также имел эту проблему, и оказался, что я просто забыл закодировать пробел в URL (который браузер делает для вас молча). Замена пространства на% 20 сделала трюк ... Я не пробовал HttpClient, но он мог правильно закодировать, не спрашивая.

+0

Это точно не отвечает на вопрос. URL-адрес кажется действительным и не содержит специального символа, такого как пробел. Может быть, вы могли бы переместить это в комментарий вместо того, чтобы писать ответ? –

+0

Я согласен с тем, что мой ответ не соответствует точному вопросу, но если вы наберете «HttpURLConnection 502» в google, вы не найдете намного больше ответов на эту тему, и если моя ошибка может избежать других людей, чтобы потерять столько времени как и я, тогда мой ответ не такой бесполезный. И у меня недостаточно репутации, чтобы комментировать :-) Кажется, что этот ответ не поможет мне получить больше репутации ... –