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

ちょっとがっつり復習必要かな。あるいは一緒に調べながら、ってのも (を