在 Alamofire 中 Swift 发送参数
Posted
技术标签:
【中文标题】在 Alamofire 中 Swift 发送参数【英文标题】:Swift send parameters in Alamofire 【发布时间】:2018-02-11 00:52:38 【问题描述】:我想在请求中发送两个值:
1) 操作字符串
2) 用户对象
我收到消息Operation is not set
,即使我包含在参数"operation": "register"
中
我是 Alamofire 的新手。谁能给我解释一下:
1)如何在请求中发送值?
2)如何发送用户对象?
3)如何处理.Success
和.Failure
这两个结果
Swift 代码:
let urlString = URLFactory()
let url = URL(string: urlString.getAppURL())!
print("Log url: \(url)")
let user = User()
user.setEmail(email: email)
let parameters: Parameters = ["operation": "register", "user": user]
Alamofire.request(url, method: .post, parameters: parameters).responseJSON response in
print("Log \(response)")
print("Log response.request: \(response.request)")
print("Log response.error: \(response.error)")
print("Log response.data: \(response.data)")
print("Log response.result: \(response.result)")
快速输出:
Log url: http://192.168.0.101/GeolocationNews/NewsDataCrawler/app.php
Log SUCCESS:
message = "Invalid Parameters";
result = failure;
Log response.request: Optional(http://192.168.0.101/GeolocationNews/NewsDataCrawler/app.php)
Log response.error: nil
Log response.data: Optional(51 bytes)
Log response.result: SUCCESS
PHP 代码:
$login = new Login();
$fun = new FunctionsValidation();
if ($_SERVER['REQUEST_METHOD'] == 'POST')
$data = json_decode(file_get_contents("php://input"));
if(isset($data->operation))
$operation = $data->operation;
if(!empty($operation))
if($operation == 'register')
echo $login->register($data);
else // if operation is empty
$response["result"] = "failure";
$response["message"] = "Operation is empty";
echo json_encode($response);
else // if operation is not set
$response["result"] = "failure";
$response["message"] = "Operation is not set";
echo json_encode($response);
更新
我已经通过 Postman 发送测试了 API:
"operation": "register",
"user":
"email": "email value"
它给了我:"result":"failure","message":"Invalid Email"
所以 API 运行良好!
我已经尝试通过参数中的操作发送 Alamofire 请求并且它有效。所以看起来问题在于将用户对象转换为字典。谁能给我一个例子来说明如何做到这一点?
用户对象:
class User: NSObject
private var name: String,
email: String,
password: String,
oldPassword: String,
newPassword: String,
code: String
private var id: Int
override init()
self.name = ""
self.email = ""
self.password = ""
self.oldPassword = ""
self.newPassword = ""
self.code = ""
self.id = 0
// set and get methods ...
【问题讨论】:
你如何解析“用户”。看起来您正在尝试将 User 作为 Swift 对象发送。您可以先通过 REST 客户端测试您的 api,例如邮递员 @RikeshSubedi API 在检查用户之前返回响应。它首先检查操作然后返回"Operation is not set"
而不读取用户。所以用户不是这里的问题 - 至少现在
@JumanaAlhaddad 1. 我认为您的 api 有问题 - 请使用邮递员测试您的 api,正文为 "operation": "register"
2. 您需要将 User
对象转换为字典
@AdrianBobrowski 我已经测试了 API,它运行良好!查看我的更新
【参考方案1】:
我认为问题在于编码。根据您的 PHP 代码,它接受 application/json
作为内容类型,这应该通过带有 JSON 编码的 Almofire 发送。
试试这个:
Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default)
.responseJSON response in
print("Log \(response)")
print("Log response.request: \(response.request)")
print("Log response.error: \(response.error)")
print("Log response.data: \(response.data)")
print("Log response.result: \(response.result)")
参考: https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#parameter-encoding
【讨论】:
谢谢!你知道如何将用户对象转换为字典的例子吗? @AdrianBobrowski 我在后期更新中添加了我的用户模型 @KundanSinghChouhan 我已经添加了encoding: JSONEncoding.default
,但仍然无法正常工作。似乎问题在于在传递用户对象之前将其转换为字典。我的项目中有 SwiftyJSON,但它只是向我展示了如何从 JSON 转换为字典而不是其他方式。
@JumanaAlhaddad 我看到了你的邮递员,let parameters: Parameters = ["operation": "register", "user": ["email": user.email]]
应该足够了【参考方案2】:
问题在于将用户对象转换为字典。我没有使用对象,而是将用户设置为字典。
let userDictionary: Dictionary = ["email": email, "password": password]
let parameters: Parameters = ["operation": operation, "user": userDictionary]
Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON response in
...
【讨论】:
以上是关于在 Alamofire 中 Swift 发送参数的主要内容,如果未能解决你的问题,请参考以下文章
在 swift 中使用 alamofire 发送 JSON 数组作为参数
使用 swift 在 Alamofire 中发送带有对象数组的 JSON 作为参数
如何在 Swift 中的 Alamofire 中发送 body 参数?
在swift中使用alamofire将参数作为原始数据发送。