对 WP API 的 POST 请求被解释为 GET 请求

Posted

技术标签:

【中文标题】对 WP API 的 POST 请求被解释为 GET 请求【英文标题】:POST requests to WP API are interpreted as GET requests 【发布时间】:2018-04-04 15:55:10 【问题描述】:

我正在尝试从 Woocommerce API 创建一个订单,但它没有按预期工作:请求(作为 POST 发送)正在返回所有订单(就像它是一个 GET 请求),而不是创建一个新订单。 真正奇怪的是,同样的请求正在预生产服务器上运行,但在生产服务器上却没有。

这似乎是 API 的一个全球性问题,因为除了用于获取访问令牌的 POST 请求之外,其他请求(例如从 WP API 创建帖子)不起作用。

这是我作为 POST 发送的请求:

curl -X POST https://www.domain.tld/wp-json/wc/v2/orders?access_token=... \
-H "Content-Type: application/json" \
-d '
     "customer_id": "1",
     "payment_method": "app",
     "payment_method_title": "Test payment",
     "set_paid": false,
     "billing": 
         "first_name": "test",
         "last_name": "test",
         "address_1": "test",
         "address_2": "test",
         "city": "test",
         "postcode": "00000",
         "country": "FR",
         "phone": "0123456789",
         "email": "test@test.tld"
     ,
     "shipping": 
         "first_name": "test",
         "last_name": "test",
         "address_1": "test",
         "address_2": "test",
         "city": "test",
         "postcode": "00000",
         "country": "FR",
         "phone": "0123456789",
         "email": "test@test.tld"
     ,
     "shipping_lines": [
         
             "method_id": "livraison_gratuite",
             "method_title": "Livraison gratuite",
             "total": 0
         
     ],
     "line_items": [
         
             "product_id": 302,
             "variation_id": 589,
             "quantity": 1
         ,
         
             "product_id": 798,
             "quantity": 1
         
     ]
 '

同样的请求再次在预生产服务器上运行,所以我认为问题与请求本身无关。

这是我在邮递员中收到的生产服务器上此请求的返回:

我消除了所有可能的原因:

两个网站都使用相同的插件,Wordpress 版本和插件都是最新的, 两个网站都使用 https, 缓存插件已停用, Woocommerce 和 WP Oauth Server 中的 API 设置是相同的, 用于发送请求的用户(使用 WP Oauth Server 提供的访问令牌标识)是 admin, 据我所知,服务器配置是相同的 (php7)。

我不知道为什么会发生这种情况。任何人都知道可能导致这种情况的原因吗?

【问题讨论】:

【参考方案1】:

我终于知道这里发生了什么。生产服务器上有一个重定向规则,当 URL 缺少尾部斜杠时,它会添加它。这导致请求被识别为 GET 而不是 POST(重定向 HTTP 请求时不发送 POST 数据)。

添加尾部斜杠解决了这个问题:

curl -X POST https://www.domain.tld/wp-json/wc/v2/orders/?access_token=...

请注意,这也可以在不使用任何此类重定向规则的预生产服务器上使用,因此始终在 POST API 请求中添加尾部斜杠可能是一个好主意,以免绊倒这种问题。

另一种解决方案是添加这种 RewriteCond 来防止 POST 请求的重定向:

RewriteCond %REQUEST_URI !(/$|\.) 
RewriteCond %THE_REQUEST !POST
RewriteRule (.*) %REQUEST_URI/ [R=301,L] 

【讨论】:

以上是关于对 WP API 的 POST 请求被解释为 GET 请求的主要内容,如果未能解决你的问题,请参考以下文章

向 wp api 类别请求添加字段

PHP-WP-WordPress-Get-Featured-Image-The-Post缩略图

通过 WP API v2 添加 Post Meta 字段

如何使用 WP Rest API v2 创建评论?

WP Rest API 自定义端点在 GET 和 POST 上返回 false

python总结-post请求