What have you found for these years?

2008-06-04

request.query_parameters

updated:
原來 request.query_parameters 是 get variable,
而 request.request_parameters 才是 post variable...
兩個都要用,就要寫:request.request_parameters.merge(request.query_parameters)
這樣是優先 get 其次 post...

因為 rails 的 params 會對 input 做額外處理,
例如 user[account] 會變成 params[:user][:account],
還有 params 裡面被額外加入 params[:controller] 和 params[:action].
為了避免這個狀況,想要直接抓出最早 post 過來的資料,
在文件裡 AbstractRequest 中的 parameters 的 source 中看到:

     # File vendor/rails/actionpack/lib/action_controller/request.rb, line 286
286: def parameters
287: @parameters ||= request_parameters.merge(query_parameters).update(path_parameters).with_indifferent_access
288: end


發現在 ActionController::Base 中可以用 request.query_parameters
取得該我所要的資料。(i.e. no :controller and no :action)
不過相較於 params, 最主要的差異就是 params 用 symbol 當 key,
但 request.query_parameters 卻是用 string!

我想這是因為我從 request 中抓值的關係?一開始我想乾脆 map 一次,
不過 map 的結果會是 array, 可能只能 fold 如:

request.query_parameters.inject({}){|r,i|r[i.first.to_sym]=i.last; r}

只是忽然想到幾件事:

1. 本來 post 過來的就是 string, 最後也要轉成 string 輸出,
那需要多此一舉做轉換嗎?除非經常需要 lookup?

2. 之前想模擬 request, 直接複製 server log,
就會看到 "api_key"="abcdefg", "sig"="hijklmn", ...
這樣我要模擬,還要把 = 左邊的 string 改寫成 symbol,
如果我原本就是要 string, 不就不需要轉換了?

...firefox 3 rc1 顯示問題還是不少。這方面,最穩的還是 safari...
opera 有時候也會出這種問題... 字型亂跑。可惡的是我猜只有 mac 版
firefox 和 opera 有這些問題。

anyway, 總之,那我乾脆全面改成 string 當 key 算了。
初步測試結果,似乎沒問題!之前 test case 和獨立 server 都正常,
上線 server 卻總是怪掉的問題,看來永遠也不會有答案了.....

*

另一方面,這能算是 undocumented api 嗎?
我對於所謂如果沒用到 undocumented api, 表示程式沒什麼的這個說法,
實在有點不能接受。一來許多程式的價值完全不在使用 api 上,
最簡單的例子就是提供 api 本身的程式,東西當然要自己寫。

二來總覺得這是 document 撰寫失敗的問題,或是更嚴重的,
library 本身就設計失敗,使得 programmer 需要用到
本來就不是給 client 用的 function.

感覺,最容易碰到這種問題的是 end-user 用的 desktop application.
因為如果要做得很華麗,就必須大量使用 os dependent api,
如 win32 api, cocoa, 等等。而這種超級龐大的 api 架構,
因為過於複雜,本來文件就很難寫,而且設計本身也很容易不夠完美。
想要做一些比較特別的東西,例如入侵其他 desktop 上的 process,
像是 dr.eye 之類的東西... 應該有很多 dirty hack 在裡面?

再加上,這種程式的困難度往往都在 dependent on os api 的部份,
例如要怎麼 animate dock, 要怎麼修改 registry (windows),
等等,其實根本就不是難在程式本身上,全部是難在跟 os 溝通,也就是 api
有沒有查到、有沒有正確使用等等問題...
(還有,怎麼 workaround with the buggy/badly-designed api?)

我是覺得,其實絕大多數的程式,都跟以上無關就是了。
而且我真的覺得 api 的問題真的是很無趣,別人一改就 break 掉了,
還不如自己設計 api, 去 break 別人的程式 XD

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0