我想從JavaScript發佈JSON數據到PHP。你可以做到這一點無論是爲什麼ajax`application/json`運行兩次PHP代碼?
Content-Type: application/json
或
Content-Type: application/x-www-form-urlencoded
這兩部作品,但我有一個很難得到的第一個工作。原因是我錯過了當內容類型爲application/json
時,PHP腳本似乎運行了2次。
我很驚訝,不知道發生了什麼。任何人都可以解釋發生了什麼以及如何處理它? (有一些相關的問題,但沒有一個答案似乎觀察到這種行爲。)
這是我的測試代碼。首先啓動PHP內置服務器:
php.exe -S localhost:7000
然後在該目錄下創建文件test1.php
用下面的代碼:
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
header("Content-Type: application/json");
function writeStdErr($msg) { $fh = fopen('php://stderr','a'); fwrite($fh, $msg); fclose($fh); }
writeStdErr("\n\nI am here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
$e = stripslashes(file_get_contents("php://input"));
writeStdErr("e=".$e."\n");
if (strlen($e) > 0) echo $e;
從Web瀏覽器控制檯
現在(我使用谷歌瀏覽器),從AJAX請求:
function test1(j) {
url = "http://localhost:7000/test1.php";
type = "application/x-www-form-urlencoded";
if (j) type = "application/json";
xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-type", type);
xhr.addEventListener("readystatechange", function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var json = JSON.parse(xhr.responseText);
console.log(json.email + ", " + json.password)
}
});
var data = JSON.stringify({"email":"[email protected]","type":type});
xhr.send(data);
console.log("now sending >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", url, type);
}
test1(false)
在控制檯輸出正是我所期待:
I am here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
e={"email":"[email protected]","type":"application/x-www-form-urlencoded"}
現在改爲使用applicaion/json
進行ajax呼叫,即test1(true)
。輸出結果如下:
I am here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
e=
I am here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
e={"email":"[email protected]","type":"application/json"}
正如你所看到的PHP代碼已經運行了兩次。並且第一次沒有輸入php://input
。
爲什麼?而這應該如何在PHP中處理?
借用這裏的一些代碼:Sending a JSON to server and retrieving a JSON in return, without JQuery
這裏有一些相關的問題: Code to be run twice in Ajax request, Running curl twice in php, https://stackoverflow.com/questions/24373623/ajax-request-help-code-gets-created-twice, Ajax form submitting twice with Yii 2
而且這個問題(的投票這裏最高的國家之一)當然是相關的,但沒有什麼可以說爲什麼PHP代碼運行兩次:
What is the correct JSON content type?
謝謝,但對我來說工作原理完全一樣。你使用的是什麼PHP?瀏覽器是什麼?(我的代碼實際上對你有不同的作用?) – Leo
PHP 5.4.35,Firefox 33.1.1和LAMP。我也嘗試過使用內置的服務器 - 仍然無法重現。你是否與Firefox有同樣的行爲? – JanTheGun
是的,我得到了與FF相同的行爲。在Windows 7上。 – Leo