HTTP Http Client client new Default Http Client

  • Slides: 30
Download presentation

通信(1) • とうぜんアンドロからHTTPを投げる(簡単) Http. Client client = new Default. Http. Client(); Http. Get request

通信(1) • とうぜんアンドロからHTTPを投げる(簡単) Http. Client client = new Default. Http. Client(); Http. Get request = new Http. Get(url); // new Http. Post(uri); request. set. Header("User-Agent", user. Agent); try { Http. Response response = client. execute(request); Status. Line status = response. get. Status. Line(); if (status. get. Status. Code() != HTTP_STATUS_OK) { // えらー } Http. Entity entity = response. get. Entity(); Input. Stream input. Stream = entity. get. Content(); ・・・ } catch (IOException e) { // えらー }

通信(2) • UIスレッドが止まらないよう別スレッドでHTTP – 戻ってきたらHandlerでUIスレッドに紛れ込ませる final Handler handler = new Handler(); final Runnable ui.

通信(2) • UIスレッドが止まらないよう別スレッドでHTTP – 戻ってきたらHandlerでUIスレッドに紛れ込ませる final Handler handler = new Handler(); final Runnable ui. Runnable = new Runnable() { @Override public void run() { ・・・UI部品の書き換えとか } }; final Thread request. Thread = new Thread() { @Override public void run() { ・・・HTTPの要求、応答の処理 handler. post(ui. Runnable); } }; ・・・ request. Thread. start();

通信(3) • 応答がJSONなら (簡単) String response. Body = ・・・・Input. StreamからStringに変えて・・・・ JSONObject response = new JSONObject(response.

通信(3) • 応答がJSONなら (簡単) String response. Body = ・・・・Input. StreamからStringに変えて・・・・ JSONObject response = new JSONObject(response. Body); JSONObject value 1 = response. get. JSONObject("key 1"); ・・・・ 正直これだけでできちゃうんだけど、、、、 違う方法も試してみよう

Protocol Buffers 独自のデータ項目定義( protoファイル) message Person { required int 32 id = 1; required

Protocol Buffers 独自のデータ項目定義( protoファイル) message Person { required int 32 id = 1; required string name = 2; optional int 32 age = 3; } ・・・ protoツールで 生成 Javaのソース Pythonのソース Cppのソース $ protoc --java_out=src --cpp_out=src --python_out=src. /Persons. proto

試す • オブジェクトをSDカードに出力 Person. Builder builder = Person. new. Builder(); Person p = builder.

試す • オブジェクトをSDカードに出力 Person. Builder builder = Person. new. Builder(); Person p = builder. set. Name("えがわ"). set. Id(1). build(); Output. Stream out = new File. Output. Stream("/sdcard/hoge. txt"); p. write. To(out); out. close(); • SDカードから復元 Input. Stream in = new File. Input. Stream("/sdcard/hoge. txt"); Person p = Person. parse. From(in); in. close();

サービス呼び出し部分 • こんなかんじ Http. Rpc. Channel channel = new Htt. Rpc. Channel(uri); Rpc. Controller

サービス呼び出し部分 • こんなかんじ Http. Rpc. Channel channel = new Htt. Rpc. Channel(uri); Rpc. Controller controller = ※ 何か指定する My. Rpc. Service service = My. Rpc. Service. new. Stub(channel); service. do. Something(controller, request, new Rpc. Callback<Response>() { public void run(Response response) {    ・・・応答を受け取ったときの処理 } });

Http. Rpc. Channel側 • こんなかんじ public class Http. Rpc. Channel implements Rpc. Channel {

Http. Rpc. Channel側 • こんなかんじ public class Http. Rpc. Channel implements Rpc. Channel { private final URI uri; public Http. Rpc. Channel(URI uri) { this. uri = uri; } private Response. Handler<Response> handler = new Response. Handler<Response>() { @Override public Response handle. Response(Http. Response response) throws Client. Protocol. Exception, IOException { Http. Entity entity = response. get. Entity(); int length = (int) entity. get. Content. Length(); byte[] buffer = new byte[length]; entity. get. Content(). read(buffer, 0, length); return Response. parse. From(buffer); } }; ・・・・・次のページ

Http. Rpc. Channelの続き ・・・前のページから public void call. Method(Method. Descriptor method, Rpc. Controller controller, Message

Http. Rpc. Channelの続き ・・・前のページから public void call. Method(Method. Descriptor method, Rpc. Controller controller, Message request, Message prototype, Rpc. Callback<Message> done) { try { ・・・ほんとはメソッド名で分岐 Http. Post post = new Http. Post(uri); Http. Client client = new Default. Http. Client(); byte[] data = request. to. Byte. Array(); Http. Entity entity = new Input. Stream. Entity(new Byte. Array. Input. Stream(data), data. length); post. set. Entity(entity); Response response = client. execute(post, handler); done. run(response ); } catch (Exception e) {       // エラー処理 } } } • こんなかんじ

サーバー側は? • サーブレットならこんな感じ(簡単) public class My. Servlet extends Http. Servlet { @Override protected void

サーバー側は? • サーブレットならこんな感じ(簡単) public class My. Servlet extends Http. Servlet { @Override protected void do. Post(Http. Servlet. Request req, Http. Servlet. Response resp) throws Servlet. Exception, IOException { Request request = Request. parse. From(req. get. Input. Stream()); いれもの = request. げっとほげほげ ・・・ Builder builder = Response. new. Builder(); builder. せっとほげほげ ・・・ builder. build(). write. To(resp. get. Output. Stream()); } }

GAEじゃないとダメ? • 勿論、自分でサーバー書いてもいい Server. Socket server. Socket = new Server. Socket(9001); while (true) {

GAEじゃないとダメ? • 勿論、自分でサーバー書いてもいい Server. Socket server. Socket = new Server. Socket(9001); while (true) { Socket socket = server. Socket. accept(); Data. Input. Stream in = new Data. Input. Stream(socket. get. Input. Stream()); Data. Output. Stream out = new Data. Output. Stream(socket. get. Output. Stream()); int length = in. read. Int(); byte[] buffer = new byte[length]; in. read(buffer, 0, length); Request request = Request. parse. From(buffer); ・・・処理 Response response = Response. new. Builder(). setほげほげ. build(); byte[] data = response. to. Byte. Array(); out. write. Int(data. length); response. write. To(out); in. close(); out. close(); }