2016-05-15 4 views
1

私はJavaアプリケーションをGuildWars2の外部APIに接続しようとしています。HttpURLConnectionのデバッグ方法

私がテストしようとしているリンクは次のとおりです。ブラウザ内でそのページに移動するとき http://api.guildwars2.com/v2/commerce/listings

int型IDのリストが返されます。

私は、Javaアプリケーションを実行する際に、そのIDのリストを取得しようとしています。私は次のコードを使用

は(うまくいけば、それは私のデスクトップにリモートでプログラミングしようとしている、私の携帯電話上で、現在、正しいフォーマット):私のクラスを実行する際に

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 successdoneclosedをプリントアウト。それは間違いなくタイムアウトを待っているわけではありません。私はそのリクエストヘッダーとDoInput/DoOutputで試そうとしています。私はそれを踏んで、それが接続しているかのように見え、ちょうど情報のバイトを受け取っていません。どのように私のような他のIDの背中を取得する方法を見つけ出すことができます私は?私の他の質問は期待のようにどのように私は、IDの背中を得るのです。私の究極の質問がある一方で、だから、

を(doesntのwhileループに入ります)私が期待する?

答えて

1
  1. あなたのコードは応答コード302 Foundを取得しています。新しい場所へのLocation:ヘッダーの後にある必要があります。followRedirectsはデフォルトでtrueですが、そうではありません。しかし、サーバはLocation:ヘッダをhttps://api.guildwars2.com/v2/commerce/listingsに戻しています。私はなぜHttpURLConnectionがそれに従っていないのか分かりませんが、簡単な修正は元のURLにhttps:を使用することです。

  2. doOutput(true)を設定していますが、出力は送信されません。

  3. あなたのコードは構造が貧弱です。先行するtryブロック内のコードの成功に依存するコードは、同じtryブロック内になければなりません。私は方法MalformedURLExceptionIOExceptionを投げ、内部にはtry/catchブロックを全く持っていないでしょう。

+0

ありがとうございます!あなたが気にしない場合 - 別の場所につながるレスポンスコードとヘッダをどうやって決めましたか? – DoubleDouble

+1

'connection.getResponseCode()'を経由し、次に 'connection.getHeaderField(" Location ")'を見ました。 – EJP

-1

私の経験では、HttpUrlConnectionとの対戦は価値があります。

デバッグは難しく、使いにくく、複雑なhttp操作をほとんどサポートしていません。

さらに優れたオプションがあります。

デフォルトではApache HttpConponents Client(http://hc.apache.org/)です。他のすべてのオプションより必ずしも優れているわけではありませんが、かなりよく文書化され広く使用されています。

+0

これは '複雑なHTTP操作'ではありません。 'HttpURLConnection'は20年間私のために働いています。私がApacheクライアントに移行しなければならなかったのは、WEBDAV動詞 – EJP