2017年5月10日水曜日

JavaでHttpのGETとかPOSTをさくっと実装したい

こんにちは。中3(執筆時)のどこにでもいそうなプログラミングバカです。 今回は最近個人的にPOSTとかしまくったアプリを作っててその時に作った何かの残骸っぽいもの。 簡単に言うとGET/POSTがさくっと使えるクラス。

ソース


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLConnection;

public class HttpConnector {

    String host = "";//ここにドメインとか書いておくとコンストラクタのhostにファイル名を指定することができる
    String message = "";
    String contentType = "";//ContentTypeをここに指定しておく。

    private OnHttpResponseListener resLis = null;
    private OnHttpErrorListener errLis = null;

    public HttpConnector(){}
    public HttpConnector(String host){
        this.host += host;
    }
    public HttpConnector(String host, String message){
        this.host += host;
        this.message = message;
    }

    public void get(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL(host);
                    URLConnection uc = url.openConnection();

                    InputStream is = uc.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                    StringBuffer sb = new StringBuffer();
                    String s;
                    while ((s = reader.readLine()) != null) {
                        sb.append(s);
                    }
                    if (resLis != null)
                        resLis.onResponse(sb.toString());
                    reader.close();

                } catch (IOException e) {
                    if (errLis != null)
                        errLis.onError(0);
                }
            }
        }).start();
    }

    //ポスト用コマンド
    public void post(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL(host);
                    URLConnection uc = url.openConnection();
                    uc.setDoOutput(true);
                    uc.setRequestProperty("Content-type", "application/json");
                    OutputStream os = uc.getOutputStream();

                    PrintStream ps = new PrintStream(os);
                    ps.print(message);
                    ps.close();

                    InputStream is = uc.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                    StringBuffer sb = new StringBuffer();
                    String s;
                    while ((s = reader.readLine()) != null) {
                        sb.append(s);
                    }
                    if (resLis != null)
                        resLis.onResponse(sb.toString());
                    reader.close();

                } catch (IOException e) {
                    if (errLis != null)
                        errLis.onError(0);
                }
            }
        }).start();
    }

    public void setHost(String host){
        this.host = host;
    }

    public String getHost(){
        return host;
    }

    public void setContentType(String contentType){
        this.contentType = contentType;
    }

    public String getContentType(){
        return contentType;
    }

    public void setMessage(String message){
        this.message = message;
    }

    public String getMessage(){
        return message;
    }

    public void setOnHttpResponseListener(OnHttpResponseListener listener){
        this.resLis = listener;
    }

    public void setOnHttpErrorListener(OnHttpErrorListener listener){
        this.errLis = listener;
    }

    public void removeResponseListener(){
        this.resLis = null;
    }

    public void removeErrorListener(){
        this.errLis = null;
    }

}

import java.util.EventListener;

public interface OnHttpResponseListener extends EventListener {
    void onResponse(String response);
}

import java.util.EventListener;

public interface OnHttpErrorListener extends EventListener {
    void onError(int error);
}

説明

適当に作ってるんでエラー番号の処理とかは書いてません。すみません。 Androidで使う場合はHandlerをかませる必要があることが有ります。コメントしていただければそれ用のソースも公開します。 ほとんど例外書いてないんであまり変なことはしないほうがいいかも。

使い方

GET


HttpConnector httpConnector = new HttpConnector("http://example.com/");
httpConnector.setOnHttpResponseListener(new OnHttpResponseListener() {
    @Override
    public void onResponse(String response) {
        System.out.println("Response:" + response);
    }
});
httpConnector.setOnHttpErrorListener(new OnHttpErrorListener() {
    @Override
    public void onError(int error) {
        System.out.println("Error:" + error);//現状0しかない
    }
});
httpConnector.get();

HttpConnector httpConnector = new HttpConnector("http://example.com/"); でホスト指定。 変更する際はsetHostとかでできます。 setOnHttpResponseListenerで成功時のリスナ、setOnHttpErrorListenerで失敗時のリスナを指定。(強制ではないのでエラーのみ未実装とかでもOK。) OnHttpResponseListenerのresponseに受信した文字列が入ります。 そして、最後のhttpConnector.get()で受信を開始します。処理はスレッドで行うようにしてます。

###POST

HttpConnector httpConnector = new HttpConnector("http://example.com/","POSTするメッセージ");
//HttpConnector httpConnector = new HttpConnector("http://example.com/");
//httpConnector.setMeesage("POSTするメッセージ");//この2行でも可
httpConnector.setOnHttpResponseListener(new OnHttpResponseListener() {
    @Override
    public void onResponse(String response) {
        System.out.println("Response:" + response);
    }
});
httpConnector.setOnHttpErrorListener(new OnHttpErrorListener() {
    @Override
    public void onError(int error) {
        System.out.println("Error:" + error);//現状0しかない
    }
});
httpConnector.post();//ここ重要

Getとの違いは、POSTするメッセージを指定すること(コンストラクタでも指定できるしsetMessage()メソッドでも指定可)と、最後のhttpConnector.post()でポストをすることです。

どうでもいい応用

例えば、同じドメインで複数の場所にアクセスするとき

HttpConnector httpConnector = new HttpConnector("get");//実質http://example.com/getと同じ
HttpConnector httpConnector = new HttpConnector("post");//実質http://example.com/postと同じ

っていう使い方ができます。

最後に

読みにくい文章を最後まで読んでいただいてありがとうございました! 誤字やソースのミスがあればバシバシ言ってもらえると嬉しいです! 一人でも役に立てれば幸いです!

0 件のコメント:

コメントを投稿