我正在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,as 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']
访问它们,它工作正常 .
我错过了什么?
UPDATE: 我在与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中设置我的请求错误(仍然不知道为什么) .
UPDATE 2: 为了防止localhost出现问题,我将脚本移动到我控制的共享wb托管服务,但结果是一样的 .
UPDATE 3: 我以前一定以前都错过了它,但是我有一个设置我正在工作:
Headers : Content-Type application/x-www-form-urlencoded
身体("raw"): userId=my-user-name&password=123456
但是,这限制了我对键/值的平面列表;如果我希望向服务器发送更多结构化(即嵌套)数据,我需要JSON支持...
3 回答
在这里和那里搜索之后,我发现只有当你将它们作为形式-i.e.,
application/x-www-form-urlencoded
发送时,帖子正文数据才进入$_POST
变量 - (我猜这是$_POST
代表的,而不是用于请求的方法) . 如果我正确的话,请纠正我 .使用
application/json
的Content-Type时,如下所示的代码可以解决问题:我想这是非常基本的东西,但话说回来,我对HTTP的了解非常有限......
我第一次使用Postman时犯的错误是在使用失败的POST方法时设置了参数 . 我尝试了你的Update 3,然后我意识到Body选项卡中有关键值对 .
删除参数,将Body设置为“x-www-form-urlencoded”并添加要在此处发布的变量按预期工作 .
我的疏忽是我认为将会有一个部分输入值,并且该方法将确定如何传递它们,这有意义,以防您希望通过POST在URL中发送一些参数
@FirstOne 的评论救了我 . 我在URL中添加了正斜杠,它解决了问题 . 这样,即使没有设置标头,我的php脚本也可以将请求检测为POST
内容类型应用程序/ x-www-form- urlencoded
我也没有 Headers 测试我的代码,它工作正常 . 我测试了Content-type:application / json,它运行正常 .
if($ _ SERVER ['REQUEST_METHOD] ='POST'){echo'Request is post'; }
我的脚本在Chrome上使用RESTEasy - Rest客户端返回“请求发布” . 谢谢,FirstOne .