首先,我想说我遇到了与以下问题完全相同的问题:How to add data to HTTPBody with PUT method in NSURLSession?。但它没有回答,所以我提出了自己的问题。
我们为学校作业编写了一个节点API。我们测试了整个API。 (那里出现问题的可能性很小。)
之后我开始在CRUD用户的iOS客户端上工作。 让用户完美无缺,但每当我尝试编辑用户时,都会发生奇怪的事情。服务器上的数据以未定义的形式到达。
我使用以下代码保存用户:
func saveUser(user: User, completionHandler: (String?, User?) -> Void) {
let url = NSURL(string: "https://pokeapi9001.herokuapp.com/api/users/")
let request = NSMutableURLRequest(URL:url!)
request.HTTPMethod = "POST"
let postString = "email=\(user.email)&password=\(user.password!)&role=\(user.role)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error: \(error)")
}
do {
guard let data = data else {
throw JSONError.NoData
}
guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else {
throw JSONError.ConversionFailed
}
//do specific things
} catch let error as JSONError {
completionHandler(error.rawValue, nil)
} catch let error as NSError {
completionHandler(error.debugDescription, nil)
}
}
task.resume()
}
请记住,这是完美的工作(不知道是否打算像这样使用)
要编辑用户,请使用以下代码:
func editUser(user: User, completionHandler: (String?, User?) -> Void) {
let url = NSURL(string: "https://pokeapi9001.herokuapp.com/api/users/\(user.id!)")
let request = NSMutableURLRequest(URL:url!)
request.HTTPMethod = "PUT"
let postString = "email=\(user.email)&password=\(user.password!)&role=\(user.role)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error: \(error)")
}
do {
guard let data = data else {
throw JSONError.NoData
}
guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else {
throw JSONError.ConversionFailed
}
//do specific things
} catch let error as JSONError {
completionHandler(error.rawValue, nil)
} catch let error as NSError {
completionHandler(error.debugDescription, nil)
}
}
task.resume()
}
(原始代码有点长,但我删除了与实际发布数据无关的部分)
我真的不知道我做错了什么,可能是一些小而愚蠢的东西。请帮忙。
从@fiks
输入后编辑要清楚,我遇到的问题是我在editUser方法中以与saveUser方法相同的方式填充“postString”。(至少我认为我这样做) 但是在saveUser方法中,postString似乎正确地传递给了API(它创建了一个具有给定值的新用户)。 editUser方法不会传递值。
如果我在服务器上放置控制台日志,则显示所有值都是“未定义”。 为了测试iOS部分上的postString是否正确,我打印出两个字符串。他们两人都输出了email =user@test.com& password = test& role = admin
答案 0 :(得分:0)
根据我在邮递员请求中看到的内容,您发送的是 x-www-form-urlencoded 请求。
您必须在代码中指定它。请参阅示例:POST request using application/x-www-form-urlencoded
关于Charles:由于您使用的是https,因此您必须为主机启用代理。更多信息:https://www.charlesproxy.com/documentation/proxying/ssl-proxying/