私は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
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']
としてそれらにアクセスすると、正常に機能します。
私は何が欠けていますか?
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サポートが必要です...
あちこち検索したところ、投稿本文のデータが$_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に関する私の知識は非常に限られています...
@ 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。