2016-05-15 3 views
1

Я пытаюсь подключить приложение Java к внешнему api для GuildWars2.Как отлаживать HttpURLConnection?

Ссылка Я пытаюсь проверить это: http://api.guildwars2.com/v2/commerce/listings

Список идентификаторов Int возвращаются при переходе на эту страницу в браузере.

Как практика обучения, я пытаюсь получить этот список идентификаторов при запуске приложения Java.

Я использую следующий код (надеюсь, он форматирует правильно, в настоящее время на телефоне, пытаясь программировать удаленно на рабочий стол):

public class GuildWarsAPI 
{ 
    public static void main(String[] args) 
    { 
     GuildWarsAPI api = new GuildWarsAPI(); 
     api.getAPIResponse("http://api.guildwars2.com/v2/commerce/listings"); 
    } 

    public void getAPIResponse(String URLString) 
    { 
      URL url = null; 
      try { 
       url = new URL(URLString); 
      } catch (MalformedURLException e1) { 
       e1.printStackTrace(); 
      } 
      HttpURLConnection connection = null; 
      try { 
       connection = (HttpURLConnection) url.openConnection(); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      if (connection != null) 
      { 
       System.out.println("connection success"); 
      connection.setRequestProperty("Accept", "application/json"); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 
      connection.setReadTimeout(10000); 
      connection.setConnectTimeout(10000); 
       try { 
       /*BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
       StringBuilder input = new StringBuilder(); 
        String nextLine = null; 
        while ((nextLine = in.readLine()) != null) 
        { 
         System.out.println("adding output"); 
         input.append(nextLine); 
        }*/ 
        InputStream in = new BufferedInputStream(connection.getInputStream()); 
        int b = 0; 
        while ((b = in.read()) != -1) 
        { 
         System.out.println("byte:" + b); 
        } 
        System.out.println("done"); 
       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 
       finally { 
       connection.disconnect(); 
       System.out.println("closed"); 
       } 
      } 
    } 
} 

После запуска моего класса, он сразу печатает connection success, done, closed , Это определенно не ждет тайм-аутов, и я пытался играть с этим, заголовком запроса и DoInput/DoOutput. Я прошел через него, и кажется, что он подключается и просто не получает никаких байтов информации. (не входит в петлю while)

Итак, в то время как мой последний вопрос: как мне вернуть идентификатор так, как я ожидаю?, мой другой вопрос: как я могу понять, как получить обратно другой идентификатор Я жду?

ответ

1
  1. Ваш код получает код ответа 302 Found. Он должен следовать за заголовком Location: в новое место, так как по умолчанию значение followRedirects истинно, но это не так. Однако сервер возвращает Location: заголовок https://api.guildwars2.com/v2/commerce/listings. Я не знаю, почему HttpURLConnection не следует этому, но простое исправление заключается в использовании https: в исходном URL-адресе.

  2. Вы устанавливаете doOutput(true), но вы не отправляете какой-либо результат.

  3. Ваш код плохо структурирован. Код, который зависит от успеха кода в предыдущем блоке try, должен находиться внутри этого же блока try. У меня был бы метод throwMalformedURLException и IOException и вообще не имеют внутренних try/catch блоков.

+0

спасибо! Если вы не возражаете - как вы определили код ответа и заголовок, ведущий в другое место? – DoubleDouble

+1

Через 'connection.getResponseCode()', а затем 'connection.getHeaderField (" Location ")' после того, как я увидел 302. – EJP

-1

По моему опыту, борьба с HttpUrlConnection больше проблем, чем это стоит.

Трудно отлаживать, трудно использовать и обеспечивает очень небольшую поддержку сложных операций HTTP.

Есть куча лучших вариантов. (http://hc.apache.org/). Это не обязательно лучше, чем все другие варианты, но он достаточно хорошо документирован и широко используется.

+0

Это не «сложная HTTP-операция». «HttpURLConnection» работает для меня уже 20 лет.Единственный раз, когда мне приходилось переходить к клиенту Apache, было то, что я хотел отправить глаголы WEBDAV – EJP

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