preloader
軟體工程

Grape 0.12 with Rails 4.1

原本以為自己使用Grape gem撰寫的API,一直收不到參數值,也查不到資料庫的內容。嘗試了很多次,幾乎放棄了,今天終於找出為什麼無法顯示查到的資料庫內容。

  1. 首先GET verb要用網址列傳參數,格式如xxx?param1=abcabc&param2=cbacba&param3=%E4%B8%89%E9%87%8D%E5%B8%82,(%開頭的是中文字轉URL後的代碼);POST則用JSON格式傳參數進去,格式如
{
  "param1": "abcabc",
  "param2": "cbacba",
  "param3": "%E4%B8%89%E9%87%8D%E5%B8%82"
}
  1. 由CURL發出request,指令如:
curl -H 'Content-Type: application/json -H 'Accept-Version: v1' http://localhost:3000/specified_vegetables/query -X POST -d '{"transaction_date": "20131031", "name": "金針筍", "trade_location": "三重市"}' -v

。 附帶一提:specified_vegetables 是此API範例的名稱,query是request的目標API method。 而這則是GET verb的指令範例:

curl -H 'Content-Type: application/json-H 'Accept-Version: v1' http://localhost:3000/specified_vegetables/query?transaction_date=20131031&trade_location=%E4%B8%89%E9%87%8D%E5%B8%82&name=%E9%87%91%E9%87%9D%E7%AD%8D -X GET -v
  1. 目標API method表示,應該如何呈現response。如果要呈現純文字,在目標API method內直接秀出ActiveRecord的查詢結果,如:
SpecifiedVegetable.where(transaction_date: params[:transaction_date], name: params[:name], trade_location: params[:trade_location])

;且在目標API method的class開始處,寫出這行內容content_type :txt, 'text/plain'。如果要呈現JSON格式的response,則使用

{
  'response' => SpecifiedVegetable.where(transaction_date: params[:transaction_date], name: params[:name], trade_location: params[:trade_location]) 
}

,且在目標API method的class開始處,建議寫出這行內容 format :json,我覺得這行可有可無。

 

找好久,終於找到解決的方式,希望之後可以解決得更漂亮。