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

时间:2017-10-24 00:51:25

标签: php wordpress api wordpress-rest-api

我尝试从Woocommerce API创建订单并且它无法正常工作:请求(作为POST发送)返回所有订单(就像它将是GET请求),而不是创建新订单一。 奇怪的是,同样的确切请求正在预生产服务器上运行,但不在生产服务器上运行。

这似乎是API的全局问题,因为其他请求(如从WP API创建帖子)不起作用,除了用于获取访问令牌的POST请求。 < / p>

以下是我发送的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
         }
     ]
 }'

同样的请求同样适用于预生产服务器,所以我不认为问题与请求本身有关。

以下是我在postman中为生产服务器上的此请求获得的回报:

enter image description here

我消除了所有潜在的原因:

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

我已经不知道为什么会这样。任何人都有可能导致这种情况的线索吗?

1 个答案:

答案 0 :(得分:0)

我终于知道这里发生了什么。生产服务器上有一个重定向规则,它在缺少URL时将斜杠添加到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]