【问题标题】:How to POST request in Swift如何在 Swift 中发布请求
【发布时间】:2016-11-24 19:38:15
【问题描述】:

我有这个 API http://my-api.mydoctorfinder.com/ 这将根据您输入的电子邮件和密码返回一个布尔值。

我的问题是,尽管使用了正确的电子邮件和密码,但它总是会返回 false。

我在想我可能没有发送正确的参数,因为我创建了一个包含电子邮件和密码的字典。然后通过 NSJSONSerialization.dataWithJSONObject 方法传递它

顺便说一句,我使用的是 SwiftyJson。

这是我的代码

//creates a dictionary and calls the PostRequest method
func attemptLogIn( email: String, password: String) {
    let route = loggerURL
    let body: [String:String] = ["email":email, "password":password]
    makeHTTPPostRequest(route, body: body)
}

//performs post request
private func makeHTTPPostRequest(path: String, body: [String: AnyObject]) {
    let request = NSMutableURLRequest(URL: NSURL(string: path)!)

    // Set the method to POST
    request.HTTPMethod = "POST"

    do {
        // Set the POST body for the request
        let jsonBody = try NSJSONSerialization.dataWithJSONObject(body, options: .PrettyPrinted)
        request.HTTPBody = jsonBody
        let session = NSURLSession.sharedSession()

        let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
            if let jsonData = data {
                let json:JSON = JSON(data: jsonData)
                //onCompletion(json, nil)
                print("The Response: ")
                print(json)
            } else {
                //onCompletion(nil, error)
                print("The Response: ")
                print("Hello")
            }
        })
        task.resume()
    } catch {
        // Create your personal error
        //onCompletion(nil, nil)
    }
}

【问题讨论】:

  • 您的 API 文档并没有立即表明它是期待 application/json 请求、application/x-www-form-urlencoded 请求还是 XML 或其他什么。 (仅仅因为您可能会生成 JSON 响应,并不一定意味着请求也是 JSON。)您的代码建议请求应该是 JSON,但如果是这样,您应该相应地设置 Content-Type 标头,如所述约西普。顺便说一句,你说它“总是返回 [s] false”。 response 是什么样的? error?如果 JSON 解析失败,data 包含什么?

标签: ios json xcode swift2 swifty-json


【解决方案1】:
  1. 使用 API 所需的输入检查您的电子邮件和密码密钥
  2. 检查您的登录网址

【讨论】:

    【解决方案2】:

    尝试以这种方式使用 NSJSONSerialization 创建 JSON 对象:

    request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(body, options: [])
    

    我认为问题出在 .PrettyPrinted 常量中。

    编辑: 也尝试添加正确的内容类型:

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    

    【讨论】:

    • 刚刚编辑了答案,因为作者使用的是 Swift 2。
    【解决方案3】:

    这是获取数据的快速发布请求:

    func retriveTextDataByPost(requestURL:String, params: NSDictionary, handler:((dict:NSDictionary?) -> Void)) {
    
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
    
        let url = NSURL(string: requestURL)
        let request = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 60)
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.HTTPMethod = "POST"
    
        do {
            let postData = try NSJSONSerialization.dataWithJSONObject(params, options:NSJSONWritingOptions.PrettyPrinted)
            request.HTTPBody = postData
    
            let postDataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
    
                if data != nil {
    
                    do {
    
                        let dictResult:NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
                        handler(dict: dictResult)
    
                    } catch { }
                }
            }
            postDataTask.resume()
    
        } catch { }
    }
    

    【讨论】:

      【解决方案4】:

      响应只是一个真或假,即它不是一个 json 对象。 所以我建议不要使用 Swifty 儿子,而是使用 Alamofire。

      以下代码应该适合你:-

      let myParameters = [
          "email": "your email id",
          "password": "your password"]
      
      Alamofire.request(.POST, "http://my-api.mydoctorfinder.com/ ", parameters: myParameters)
               .response { request, response, data, error in
                    print(request)
                    print(response)
      if(response == true)
      {
      // do your thing
      }
                    print(error)
                }
      

      注意:可能需要对 bool 的响应进行类型转换

      以下是您提供的链接的屏幕截图,它返回 true(而不是 json 对象)[注册后,我尝试使用相同的凭据登录]

      【讨论】:

      • 我只有一个问题,通过Cocoapods安装Alamofire还是无法导入。
      • 我解决了导入错误,但仍然是同一个人。总是假的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 2021-10-26
      相关资源
      最近更新 更多