AWS Lambda(node.js v16)からphpのwebapiにaxiosでpostする
Lambdaからphpのwebapiを呼び出す処理があったのですが、少しハマったのでメモです。
具体的にはリクエストボディのJSONデータがphpのwebapiでは空配列になります。
node.jsソースの一部です。
const url = 'https://xxxx.co.jp/hoge.php' const data = {} // 何かしらのJSONデータ await axios.post(url, data)
これだとphp側では、$_POSTでは空配列となってしまいます。
file_get_contents(‘php://input’);
$_POSTで受け取らず、file_get_contents(‘php://input’);
とすればリクエストボディのJSONを受け取ることが可能です。
ただこれはwebapiであるphpを修正してもよい場合のみ可能な対応です。
URLSearchParams
webapiのphpを修正することができない場合、どうしても$_POSTに値を入れないといけません。
$_POSTはContent-Type:application/json
に対応していないようなので、URLSearchParamsを使用してContent-type: application/x-www-form-urlencoded
で渡します。
ヘッダはContent-Type: application/json
にせずに未指定のデフォルトでOKです。(Content-type: application/x-www-form-urlencoded)
const url = 'https://xxxx.co.jp/hoge.php' const data = {} // 何かしらのJSONデータ const param = new URLSearchParams(data) await axios.post(url, param)
これで、$_POSTにJSONデータが渡ります。
ネストされたJSONデータを渡す場合はqsモジュールを使用する
ネストされたJSONオブジェクトをPOSTする場合はqsモジュールを使用します。
その際ヘッダはapplication/x-www-form-urlencoded
を指定します。※未指定でもOK
import qs from 'qs' const data = { // ネストされたJSON key1:[{ nestdata:1 }], } const options = { method: 'POST', headers: { 'content-type': 'application/x-www-form-urlencoded' }, data: qs.stringify(data), url: 'https://xxx.co.jp/hoge.php' }
ネストされたJSONオブジェクトの場合は、URLSearchParamsよりqsが推奨されているようです。
Note The qs library is preferable if you need to stringify nested objects, as the querystring method has known issues with that use case.
curl
curlコマンドの例です。
$ curl -H "Content-Type: application/x-www-form-urlencoded" \ https://xxxx.co.jp/hoge.php -d @-<<EOF name=takahashi&age=20 EOF
参考サイト
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント