簡體   English   中英

對 WP API 的 POST 請求被解釋為 GET 請求

[英]POST requests to WP API are interpreted as GET requests

我正在嘗試從 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)。

我不知道為什么會發生這種情況。 任何人都知道可能導致這種情況的原因?

我終於知道這里發生了什么。 生產服務器上有一個重定向規則,當它丟失時,將尾部斜杠添加到 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] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM