【发布时间】:2015-11-17 08:53:05
【问题描述】:
我正在使用 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,但我注意到无论我如何配置我的请求,即使连接成功(即,返回 200 的 http 代码和响应正文作为数据),@ 987654326@ 变量在服务器端不可用(空)。
所以我决定尝试在浏览器上使用 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: 以防本地主机出现问题,我将脚本移至我控制的共享 wb 托管服务,但结果是相同的。
更新 3:我之前一定是错过了它,但是我已经开始使用一个设置:
标题:Content-Type application/x-www-form-urlencoded
正文(“原始”):userId=my-user-name&password=123456
但是,这将我限制在键/值的平面列表中;如果我希望向服务器发送更多结构化(即嵌套)数据,我需要 JSON 支持...
【问题讨论】:
-
在网络上阅读,似乎
application/x-www-form-urlencoded用于键=值的基本平面列表,而application/json用于更复杂/嵌套的数据,例如数组/字典等。所以也许我应该将我的请求格式统一为json(为了支持更复杂的API,而不仅仅是登录)。 -
对我来说,在 POSTMAN 上使用
localhost/something不起作用,但在最后添加/后,php 开始从 POST 和php://input获取值。我必须使用localhost/something/才能使其工作。