本文說明三種 PHP 透過 HTTP POST 方法上傳資料與檔案給 RESTful 服務的方法。
包括上傳 JSON 文件給 RESTful 服務的情形。
HTTP Wrapper
PHP5 內建一種它稱為 Wrapper 的機制,讓使用者可以透過一致的檔案串流函數存取不同協定的資源。
這個機制,也可以讓使用者透過 HTTP POST 方法調用 RESTful 服務,只是不好用。
使用範例如下:
這個方法使用時的準備工作太麻煩了。
再者,它也不能得知服務端傳回的 HTTP 狀態碼與文件型態。
當目標的 RESTful 服務所傳回的狀態碼與文件型態具有特定用途時,這個方法派不上用場。
如果你只是要透過 HTTP GET 方法調用 RESTful 服務,那麼 HTTP Wrapper 比較簡便。
但若要透過 HTTP POST 方法調用的話,大多數人還是會選擇使用 curl 。
curl - POST
PHP 最常用的資料上傳方法。curl 內部會處理很多瑣事,使用者只需要填對資料欄位。
使用範例如下:
使用說明:
-
啟用 CURLOPT_POST 。curl 會根據這個設定,在內部自動啟用必要的處理程序。
CURLOPT_POSTFIELDS 陣列的欄位值,如果第一個字元是 @ 的話,就代表這是要上傳的檔案內容。
@ 後面的內容是檔案路徑,實務上應該使用絕對路徑以保安全。
- 由於檔案存取的安全性問題, PHP 5.5 之後的版本關閉了以 @ 標示上傳檔案的途徑。要改用函數
curl_file_create()
。參考 PHP curl post file。
curl - CUSTOMREQUEST
有些 RESTful 服務只接受 JSON 型態的文件。
雖然同樣是透過 HTTP POST 上傳,但是此時 curl 的使用選項不能用 CURLOPT_POST ,而必須改用 CURLOPT_CUSTOMREQUEST 。
curl 若啟用了 CURLOPT_POST 選項,它就一定會把上傳的文件型態設為 multipart/form-data ,
並將 CURLOPT_POSTFIELDS 欄位的內容按 multipart/form-data 的形式編碼。
對於只接受 JSON 文件的 RESTful 服務來說,這就出局了。
但若 curl 使用選項 CURLOPT_CUSTOMREQUEST 並指派其值為 POST 的話,
那麼 curl 就不會在內部自動處理文件編碼與型態,而是完全按照使用者指定的內容上傳。
故可用來上傳 JSON 文件給 RESTful 服務。
使用範例如下:
使用說明:
-
CURLOPT_CUSTOMREQUEST => 'POST'
與 CURLOPT_POST => true
兩者的差別在於 CURLOPT_CUSTOMREQUEST 不會在內部進行文件內容編碼,
而 CURLOPT_POST 內部則一律按 multipart/form-data 的形式編碼。
-
CURLOPT_CUSTOMREQUEST 不會預設上傳文件的型態,故使用者必須明確告知你將上傳什麼文件型態。
在此案例中,要上傳 JSON 文件(application/json)。
-
啟用 CURLOPT_CUSTOMREQUEST 後,CURLOPT_POSTFIELDS 的內容要自己按照文件形態要求的形式格式化。
在此案例要上傳 JSON 文件,故調用 json_encode() 處理資料內容。
-
注意,JSON 文件不接受非 UTF-8 字元的內容。
若要夾帶檔案的話,必須選擇一個編碼結果全為可讀字元的編碼法處理檔案內容。
base64_encode() 是不錯的選擇。
相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/20068918.html