[英]Can not send POST variables to php script on localhost using Postman
我正在iOS / Swift中開發Web應用程序的客戶端,現在我正在測試與服務器通信的部分。 我在localhost上設置了一個基本網站:
http://localhost/~username/ConnectivityTest/login
(對應於我的Mac文件系統上的/Users/username/Sites/ConnectivityTest/login
)。
服務器端腳本(上面目錄中的index.php
)是:
<?PHP
$userId = $_POST["userId"];
$password = $_POST["password"];
if (empty($userId) || empty($password)){
echo "Error: empty post variables";
}
else{
// Process credentials...
我在iOS上使用NSURLSession
API,但我注意到無論我如何配置我的請求,即使連接成功(即返回http代碼200和響應正文作為數據), POST
變量也不可用(空)在服務器端。
所以我決定嘗試在瀏覽器上使用Postman手動發送請求(試圖排除我的iOS / Swift代碼上的任何錯誤),但我不知道應該如何配置它(我不熟悉HTTP,它一切都讓我有點困惑):
我應該將Content-Type
標頭設置為application/json
, application/x-www-form-urlencoded
,還是什么?
我應該將身體數據作為form-data
, x-www-form-urlencoded
還是raw
?
在Postman中,我將身體數據(原始)設置如下:
{
"userId":"my-user-name",
"password":"123456"
}
Alternativley,作為form-data
,它是:
userId my-user-name [Text]
password 12345 [Text]
作為x-www-form-urlencoded
,它是:
userId my-user-name
password 12345
我嘗試的一切都給了我在我的代碼的錯誤路徑中設置的響應"Error: empty post variables"
(即$_POST['userId']
或$_POST['password']
為空)。
相反,如果我將變量作為URL參數傳遞:
http://localhost/~username/ConnectivityTest/login/index.php?userId=my-user-name&password=12345
...並在腳本中以&_GET['userId']
和$_GET['password']
訪問它們,它工作正常。
我錯過了什么?
更新:我在與php文件相同的目錄中創建了一個HTML文件:
<html>
<body>
<form action="index.php" method="post">
User name: <input type="text" name="userId"><br>
Password: <input type="text" name="password"><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
如果我在瀏覽器中加載上面的頁面,填寫字段並提交表單,我的PHP腳本上的$_POST
變量獲取正確的值。 所以php代碼是正確的,我在Postman中設置我的請求錯誤(仍然不知道為什么)。
更新2:為了防止localhost出現問題,我將腳本移動到我控制的共享wb托管服務,但結果是一樣的。
更新3:我以前肯定錯過了它,但有一個設置我工作:
標題: Content-Type application/x-www-form-urlencoded
正文(“raw”): userId=my-user-name&password=123456
但是,這限制了我對鍵/值的平面列表; 如果我希望向服務器發送更多結構化(即嵌套)數據,我需要JSON支持...
在這里和那里搜索之后,我發現只有當你將它們作為一個形式-ie, application/x-www-form-urlencoded
發送時,帖子正文數據才會進入$_POST
變量 - (我猜這就是$_POST
代表的內容) ,而不是用於請求的方法)。 如果我說的是不正確的話,請糾正我。
當使用Content-Type of application/json
,如下代碼可以解決問題:
$data = json_decode(file_get_contents('php://input'), true);
$userId = $data["userId"];
$password = $data["password"];
我想這是非常基本的東西,但話說回來,我對HTTP的了解非常有限......
@FirstOne的評論救了我。 我在URL中添加了正斜杠,它解決了問題。 這樣,即使沒有設置標頭,我的php腳本也可以將請求檢測為POST
內容類型應用程序/ x-www-form- urlencoded
我也沒有標題測試我的代碼,它工作正常。 我測試了Content-type:application / json,它運行正常。
if($ _ SERVER ['REQUEST_METHOD] ='POST'){echo'Request is post'; }
我的腳本在Chrome上使用RESTEasy - Rest客戶端返回“請求發布”。 謝謝,FirstOne。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.