debugする時に追加している記述の備忘録(3)
はじめに
前回までの記事
テスト用に通信鯖をandroid内部に立てたい(2)
画像等のバイナリを返すレスポンス
- MockResponse::setBody(okio.Buffer body)
の関数で、okio.Buffer は OutputStreamと同じイメージで置き換え出来るので、レスポンスはそのまま返却できる
あとはaddHeaderで適切なContent-Typeを返却してやるだけ
public class DebugHogeApplication extends HogeApplication { private MockWebServer server; //〜中略〜 // 詳細は debugする時に追加している記述の備忘録(2) 参照 private void initServer(){ server = new MockWebServer(); Dispatcher dispatcher = new Dispatcher() { @Override public MockResponse dispatch(final RecordedRequest request) throws InterruptedException { if (request == null || request.getPath() == null) { return new MockResponse().setResponseCode(400); } MockResponse res = new MockResponse() .addHeader("Content-Type", "application/json") .addHeader("charset", "utf-8") .setResponseCode(200); MockResponse resB = new MockResponse() .addHeader("Content-Type", "image/png") .setResponseCode(200); String path = request.getPath(); switch(path){ case RestUtil.BASE_MAIN_URL + "/hoge": return res.setBody(readJson("hoge.json")); case RestUtil.BASE_MAIN_URL + "/fuga": return res.setBody(readJson("fuga.json")); case RestUtil.BASE_MAIN_URL + "/maiu": //★ 今回追加 return resB.setBody(readJson("sample.png")); break; default: return new MockResponse().setResponseCode(404); } } }; server.setDispatcher(dispatcher); try{ server.start(); RestUtil.BASE_SCHEME = RestUtil.SCHEME_HTTP; RestUtil.BASE_HOST = server.getHostName(); RestUtil.BASE_PORT = server.getPort(); }catch(Exception ex){ shutdown(); server = null; } } private Buffer readBinary(String filename){ InputStream is = null; BufferedInputStream br = null; Buffer buffer = new Buffer(); try { AssetManager as = getApplicationContext().getResources().getAssets(); is = as.open(filename); br = new BufferedInputStream(is); byte[] data = new byte[1024]; int count = 0; while ((count = br.read(data)) != -1) { buffer.write(data, 0, count); } buffer.flush(); } catch (Exception e) { return buffer; } finally { if (is != null){ try { is.close(); } catch (IOException e) { } } if (br != null){ try { br.close(); } catch (IOException e) { } } } return buffer; }
考えてみたら
switchだと後ろにパラメータ付けた時引っかかりませんね(苦笑
サンプルそのまま使うほうが確かに悪いんだろうな・・・
ベキ論から言うと正規表現
private void initServer(){ server = new MockWebServer(); Dispatcher dispatcher = new Dispatcher() { @Override public MockResponse dispatch(final RecordedRequest request) throws InterruptedException { if (request == null || request.getPath() == null) { return new MockResponse().setResponseCode(400); } MockResponse res = new MockResponse() .addHeader("Content-Type", "application/json") .addHeader("charset", "utf-8") .setResponseCode(200); String path = request.getPath(); //★=== 修正箇所 ==== if(path.indexOf("/hoge") != -1){ return res.setBody(readJson("hoge.json")); } if(path.indexOf("/fuga") != -1){ return res.setBody(readJson("fuga.json")); } if(path.indexOf("/maiu") != -1){ MockResponse resB = new MockResponse() .addHeader("Content-Type", "image/png") .setResponseCode(200); return resB.setBody(readBinary("sample.png")); } return new MockResponse().setResponseCode(404); } }; server.setDispatcher(dispatcher); try{ server.start(); RestUtil.BASE_SCHEME = RestUtil.SCHEME_HTTP; RestUtil.BASE_HOST = server.getHostName(); RestUtil.BASE_PORT = server.getPort(); }catch(Exception ex){ shutdown(); server = null; } }
参考
公式のgithubのwiki だと okhttpのjavadocしかないのでなにげに探した。。
非公式なjavadocしかないのかな?
皆さん直にコード見てるんだろうか・・