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(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント