web-dev-qa-db-ja.com

Postmanを使用してローカルホスト上のphpスクリプトにPOST変数を送信できません

私はiOS/SwiftでWebアプリケーションのクライアント側を開発しており、現在、サーバーと通信する部分をテストしています。私はローカルホストに基本的なウェブサイトをセットアップします:

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 AP​​Iを使用していますが、接続が成功した場合でも(つまり、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']としてそれらにアクセスすると、正常に機能します。

私は何が欠けていますか?

PDATE: 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でリクエストを間違って設定しています(理由はまだわかりません)。

PDATE 2: localhostに問題が発生した場合に備えて、スクリプトを自分が制御する共有wbホスティングサービスに移動しましたが、結果は同じです。

PDATE 3:以前はどういうわけかそれを見逃したに違いありませんが、動作したセットアップが1つあります。

ヘッダー:Content-Type application/x-www-form-urlencoded

本文(「生」):userId=my-user-name&password=123456

ただし、これにより、キー/値のフラットリストに制限されます。より構造化された(つまり、ネストされた)データをサーバーに送信したい場合は、JSONサポートが必要です...

6
Nicolas Miari

あちこち検索したところ、投稿本文のデータが$_POST変数に入るのは、フォームとして送信した場合のみであることがわかりました。つまり、application/x-www-form-urlencoded$_POSTだと思います)は、リクエストに使用されるメソッドではなく、を表します)。 ---(正しくないことを言っている場合は訂正してください。

application/jsonのContent-Typeを使用する場合、次のようなコードでうまくいきます。

$data = json_decode(file_get_contents('php://input'), true);

$userId = $data["userId"];
$password = $data["password"];

これは非常に基本的なことだと思いますが、HTTPに関する私の知識は非常に限られています...

15
Nicolas Miari

Postmanを最初に使用したときに犯した間違いは、POSTメソッドを使用するときにパラメータを設定すると失敗することでした。動作するUpdate3を試したところ、[本文]タブにキーと値のペアがあることに気付きました。 。

パラメータを削除し、本文を「x-www-form-urlencoded」に設定し、ここに投稿する変数を追加すると、期待どおりに機能します。

私の見落としは、値を入力するための単一のセクションがあり、POSTでURLにいくつかのパラメーターを送信したい場合に意味がある、値を渡す方法をメソッドが決定することを考えていました。

Postman Chrome Extension - Post Body

12
codemonkee

@ FirstOneによるコメントは私を救った。 URLにスラッシュを追加したところ、問題は解決しました。このように、私のphpスクリプトは、ヘッダーをに設定しなくても、リクエストをPOST

Content-Type application/x-www-form- urlencoded

また、ヘッダーなしでコードをテストしましたが、正常に機能します。 Content-type:application/jsonでもテストしましたが、正常に動作します。

if($ _ SERVER ['REQUEST_METHOD] =' POST '){echo'リクエストは投稿されています '; }

私のスクリプトは、RESTEasyを使用して「Requestispost」を返しました-Chrome上のRESTクライアント。ありがとう、FirstOne。

2
Benny64