JSONFunctions というライブラリプロジェクト
こんどのソレでも使われている事を失念しておりました。ので自分メモ。
DefaultHttpClient#execute の使いかたというか関連リソースの解放などの都合が良いのは以下の方法、って記述をどこかで確認してたのですが元記事失念。
public static String getHTTPResponseBodyString(HttpRequestBase request, DefaultHttpClient httpclient) throws IOException, ClientProtocolException, RuntimeException { return httpclient.execute(request, new ResponseHandler<String>() { @Override public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException { switch (response.getStatusLine().getStatusCode()) { case HttpStatus.SC_OK: return EntityUtils.toString(response.getEntity(), "UTF-8"); default: throw new RuntimeException("HTTP Status is " + response.getStatusLine().getStatusCode()); } } }); }
基本的にはレスポンスボディというやつを文字列にして戻してます。HttpResponse なオブジェクトの解放云々、だったのかな。
こちら、HttpGet とか HttpPost などのスーパークラスである HttpRequestBase 型で引数を受け取ることで REST な四つのリクエストメソドに対応させてます。
で、例えば POST の場合は以下な記述になっていて
public static String POSTfromURL(String url, DefaultHttpClient httpclient, List<NameValuePair> params) throws IOException, ClientProtocolException, RuntimeException { HttpPost request = new HttpPost(url); request.setEntity(new UrlEncodedFormEntity(params)); return getHTTPResponseBodyString(request, httpclient); }
パラメータが汎用的になっているかどうか、ってのは色々な意味で不明です (を
例えば POST な実装例ってあたりでクライアント側は以下な記述になってて
mParams.add(new BasicNameValuePair("[task][name]", str)); mProgressDialog.show(); if (mode.equals(Intent.ACTION_INSERT)) { new Thread(new Runnable() { @Override public void run() { try { JSONFunctions.POSTfromURL(URL + POST, mDefaultHttpClient, mParams); setResult(RESULT_OK, new Intent()); mProgressDialog.dismiss(); finish(); } catch (Exception e) {
これ、Rails 用なパラメータになっているのかどうか。おそらく他のミドルで試した実績は無いと思います。Rails 側の controller な実装は以下。
# POST /tasks # POST /tasks.json def create @task = Task.new(params[:task]) respond_to do |format| if @task.save format.html { redirect_to @task, notice: 'Task was successfully created.' } format.json { render json: @task, status: :created, location: @task } else format.html { render action: "new" } format.json { render json: @task.errors, status: :unprocessable_entity } end end end
これ、scaffold で吐きだしただけ、なナニです。model なソレも以下に。
$ cat app/models/task.rb class Task < ActiveRecord::Base attr_accessible :name end
ちょっとがっつり復習必要かな。あるいは一緒に調べながら、ってのも (を