使用PUT方法的HTTPBody中的数据失败,而它与POST一起使用?

时间:2016-11-03 12:27:59

标签: ios swift api

首先,我想说我遇到了与以下问题完全相同的问题: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

1 个答案:

答案 0 :(得分:0)

根据我在邮递员请求中看到的内容,您发送的是 x-www-form-urlencoded 请求。

您必须在代码中指定它。请参阅示例:POST request using application/x-www-form-urlencoded

关于Charles:由于您使用的是https,因此您必须为主机启用代理。更多信息:https://www.charlesproxy.com/documentation/proxying/ssl-proxying/