読者です 読者をやめる 読者になる 読者になる

竹林のゆとりブログ

山奥で生活し、日々の思いをつらつらと書くブログ。 IT、数学、アニメなど。

Androidアプリ(Java)でHttpアクセスしてみた。

AndroidアプリでHTTPを使ってウェブページにアクセスしたい時に使う情報 を少しまとめてみた。

  • HTTP接続
  • (接続によって得られた)データの取得

HTTP接続

今回はHttpURLConnectionクラスを利用。

1. 接続先の指定

URLConnectionクラスをキャストすることに注意

con = (HTTpURLConncetion) url.openConncetion();

2. リクエストの種別等を設定

con = setRequestMethod("GET");

3 接続

con =connect()

4.本文の取得

con = getInputStream();

5.接続の終了

con.close():

ストリーム

Javaではよくデータの取得の際に『ストリーム』という用語出てくる。

概念などとのたまっているが、 別ファイル、別プログラムにデータを授与する時に統一的なインターフェースを与えているに過ぎない。 概念といえば、本質的な説明が省略されるという文化は本当にやめてもらいたいものだが。

読み込む場合

  1. ファイルなどに対し、データ全体を取得する。
  2. そこからJavaのString等の情報に変換する。

書き込む場合

  1. JavaからファイルなどをJava側のアプリケーション変換する。
  2. JavaのString等のデータを書き込む

ただ、それだけ。 変にストリームという用語を使うせいで当たり前のことをより難しくしてると思うのは俺だけなんだろうか…

もちろん、昔データをやり取りする時に、ファイルでぃスクリプタを用いて、ファイルをopenさせてとか、もっと低レイヤの話で、 ストリームという状態を作るために様々な作業が必要であれば、許せるんだが…。

例) ファイルの読み込み

File f = new File("fille_name");      
FileReader fr = new FileReader(f); 
BufferedReader br = new BufferedReader(fr);  

String line;
while ((line = br.readLine()) != null) { 
    System.out.println(line);
    }
br.close();

2つを組み合わせた例。

実際にHTTpURLConncetionクラスからデータを取る場合のサンプルソースを記載する。

WebAPIを叩いて緯度、経度から人口密度を取得するソースです。

import java.net.HttpURLConnection;
import java.net.URL;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;



public class Http {
    public String test = "abc";
    //HTTP通信
    public static byte[] http2data(String path) throws Exception {
        byte[] w=new byte[1024]; 
        HttpURLConnection c=null;
        InputStream in=null;
        ByteArrayOutputStream out=null;
        try {
            //HTTP接続のオープン(2)
            URL url=new URL(path);
            c=(HttpURLConnection)url.openConnection();
            c.setRequestMethod("GET");
            c.connect();
            in=c.getInputStream();
            
            //バイト配列の読み込み
            out=new ByteArrayOutputStream();
            while (true) {
                int size=in.read(w);
                if (size<=0) break;
                out.write(w,0,size);
            }
            out.close();

            //HTTP接続のクローズ(3)
            in.close();
            c.disconnect();
            return out.toByteArray();
        } catch (Exception e) {
            try {
                if (c!=null) c.disconnect();
                if (in!=null) in.close();
                if (out!=null) out.close();
            } catch (Exception e2) {
            }
            throw e;
        }
    }     
}
public class Sample {

public static void main(String[] args) throws Exception {
    System.out.println("Hwllo World!");
    Http con = new Http();
    System.out.println(con.test);
    String URL= "http://gaze.mysociety.org/gaze-rest?f=get_population_density;lat=34.73348;lon=135.500109";
    String text;      
    text=new String(con.http2data(URL));
}

}