如何使用PHP的file_get_contents()发起Shopify REST API POST请求
问题原因&修复方案
你代码里有三处核心错误,全部修改后即可正常请求:
- 请求体格式与声明的Content-Type不匹配:你设置了
Content-Type: application/json,但却用http_build_query()将参数转为表单格式,Shopify API无法识别该格式,需要替换为json_encode()序列化参数。
- 请求体格式与声明的Content-Type不匹配:你设置了
- 请求头换行符书写错误:
Content-Length行末尾的换行符你写成了rn,缺失转义符,正确格式为\r\n,畸形请求头会直接被服务端拦截。
- 请求头换行符书写错误:
- 流上下文配置键错误:PHP中无论发送HTTP还是HTTPS请求,流上下文的配置根键都是
http而非https,你之前写的https配置完全没有生效,相当于还是发送了默认的GET请求。
- 流上下文配置键错误:PHP中无论发送HTTP还是HTTPS请求,流上下文的配置根键都是
修复后的完整代码如下:
// 正确序列化为JSON格式参数 $postdata = json_encode( array( 'location_id' => $locationID, 'inventory_item_id' => $itemID, 'inventory_adjustment' => 99 ) ); $opts = array('http' => // 配置根键改为http array( 'method' => 'POST', 'header' => "Content-Type: application/json\r\n" . "Accept: application/json\r\n" . "Content-Length: " . strlen($postdata) . "\r\n", // 修复换行符 'content' => $postdata, 'ignore_errors' => true // 可选配置:开启后即使接口返回4xx/5xx错误也能拿到响应内容,方便排查问题 ) ); $context = stream_context_create($opts); $result = file_get_contents('https://' . API_key() . ':' . API_password() . '@' . $store . '.myshopify.com/admin/api/2021-04/inventory_levels/adjust.json', false, $context); $resData = json_decode($result, true); if ($result) { var_dump($resData); } else { // 调试阶段可以打印具体错误信息定位问题 var_dump(error_get_last()); echo "post failed<br>"; }
如果修改后仍然报错,可先保留ignore_errors配置,打印完整的接口返回内容,就能看到Shopify返回的具体错误原因,比如权限不足、参数值非法等。
内容的提问来源于stack exchange,提问作者Alex Pinson
相关产品推荐
相关产品推荐

