簡體   English   中英

無法使用Postman將POST變量發送到localhost上的php腳本

[英]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,它一切都讓我有點困惑):

  1. 我應該將Content-Type標頭設置為application/jsonapplication/x-www-form-urlencoded ,還是什么?

  2. 我應該將身體數據作為form-datax-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的了解非常有限......

我第一次使用Postman時犯的錯誤是在使用失敗的POST方法時設置了參數。 我嘗試了你的Update 3,然后我意識到Body選項卡中有關鍵值對。

刪除參數,將Body設置為“x-www-form-urlencoded”並添加要在此處發布的變量按預期工作。

我的疏忽是我認為會有一個部分輸入值,並且該方法將決定如何傳遞它們,這是有意義的,以防您想要使用POST在URL中發送一些參數

Postman Chrome Extension  -  Post Body

@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.

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