簡體   English   中英

如何通過POST方法使用XMLHttpRequest?

[英]How do you use XMLHttpRequest with POST method?

我有一個中央PHP腳本,用於處理頁面中的許多請求,使用JavaScript的XMLHttpRequest()調用以及GET方法。 我的服務器PHP當前為5.6,是的,我正在避免同步調用。

一切正常,但是在某些情況下,我不希望該請求不保留在瀏覽器歷史記錄中,甚至不顯示在URL中。 因此,基於此調用的MDN參考 ,我認為我可以簡單地切換到POST方法,並保留現有請求(例如“ http://myscript.php?cmd = dothis&data = somedata ”)。 然后我要做的就是將一些代碼添加到我的PHP腳本中,這樣我就可以以任何一種方式收集傳遞的數據...

if  ($_SERVER['REQUEST_METHOD'] === 'GET') {
    if(isset($_GET['cmd'])) $cmd = $_GET['cmd'];
    if(isset($_GET['data'])) $data =  $_GET['data'];  
    }

if  ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if(isset($_POST['cmd'])) $cmd = $_POST['cmd'];
    if(isset($_POST['data'])) $data =  $_POST['data'];  
    }

好吧,顯然我錯了。 我發現的是...

  1. 當我切換到POST方法時,$ _ POST數組中的腳本不會看到此示例中顯示的任何變量。
  2. 從$ _POST數組切換到$ _REQUEST數組可以正常工作(例如:“ if(isset($ _ REQUEST ['cmd']))$ cmd = $ _REQUEST ['cmd']);”“ ),但...
  3. 只是使用POST方法發出XMLHttpRequest()調用的行為,在我的日志中導致了如下錯誤:

不推薦使用PHP:不建議自動填充$ HTTP_RAW_POST_DATA,並且在以后的版本中將其刪除。 為避免此警告,請在php.ini中將“ always_populate_raw_post_data”設置為“ -1”,並改用php:// input流。 在第0行的Unknown中

顯然,這是一個死胡同。 盡我所能研究這里發生的事情,在POSTPHP手冊參考中,我首先讀到了這一點...

$ _POST $ HTTP_POST_VARS [不建議使用]

因此,如果我理解正確的話,之所以只能使用$ _REQUEST數組獲取POST變量,是因為我的請求仍被格式化,就像我仍在使用GET一樣,這(顯然嗎?)已被棄用。 因此,“哄騙”它起作用只是將問題轉移到未來。

順便說一句,通過在服務器上調用phpinfo.php可以看到,盡管在日志中看到了錯誤,但“ always_populate_raw_post_data”確實已經設置為“ -1”。 因此,我發現所有建議“僅”在PHP.INI文件中進行此設置的“解決方案”都無濟於事。

即使它“隱藏”了錯誤,但這樣做對我來說卻無關緊要。 我的說法是否正確?即使使用POST方法時,即使我只是從$ _REQUEST數組中收集通過的PHP變量,並找出抑制LOG中“已棄用”警告的方法,整個方案仍然會崩潰(並使我的POST請求失敗),那一天我終於遷移到PHP7.x。

我很抱歉在這里提出問題,但是我確實嘗試搜索我可以找到的每個引用,這些引用都使用POST方法執行XMLHttpRequests,以及我在日志中獲得的已棄用的錯誤消息。 那里有太多過時的信息,我找不到關於如何正確更改或重新格式化XMLHttpRequests的清晰討論,以便可以使用POST方法。 實際上,我什至無法肯定地確定在PHP.5.6之外是否可以這樣做。 任何幫助將不勝感激。

PHP由命名的錯誤$_GET$_POST之后,一個Web瀏覽器將數據放在其中一個HTML表單的默認位置method屬性設置為GET或POST。

$_GET從查詢字符串中獲取數據,即使請求方法是POST。

請求主體由你傳遞給參數確定的send 您放入查詢字符串中的數據仍保留在查詢字符串中。

const url = 'http://myscript.php'
const form_data = new FormData();
form_data.append("cmd", "dothis");
form_data.append("data", "somedata");
cost xhr = new XMLHttpRequest;
xhr.open("POST", url);
xhr.addEventListener('load', function () { console.log(this.response); });
xhr.send(form_data);

暫無
暫無

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

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