2015-07-20 128 views
3

我在我的应用程序中登录页面,在该页面中进行身份验证并发出发布请求。 我将从API提供的API中获取令牌。 但是,我的代码没有在打印日志上打印任何内容。请帮忙!!如何在Swift中创建'post'HTTP请求?

@IBAction func submit(sender: AnyObject) { 

//creating a function that will connect to API 


     func connectToWebAPI(){ 

//setting up the base64-encoded credentials 
     let userName = "user" 
     let password = "pass" 
     let loginString = NSString(format: "%@:%@", userName, password) 
     let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)! 
     let base64LoginString = loginData.base64EncodedStringWithOptions(nil) 

//creating the request 
     let url = NSURL(string: "http://www.telize.com/geoip") 
     var request = NSMutableURLRequest(URL: url!) 
     let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
     let session = NSURLSession.sharedSession() 
     request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 

     let urlConnection = NSURLConnection(request: request, delegate: self) 
     request.HTTPMethod = "POST" 
     request.setValue(base64LoginString, forHTTPHeaderField: "Authorization") 


     let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in 
     if (error != nil) { 
        println(error) 

     } 
     else { 

// converting the data into Dictionary 

     let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary 

     println(jsonResult) 

       } 
      }) 


//fire off the request 

     task.resume() 

     } 

回答

1

几个问题:

  1. 首先,您同时使用NSURLConnectionNSURLSession。这意味着你实际上执行了两次请求。现在,NSURLConnection即将被弃用,您应该删除此代码段的NSURLConnection部分,并使用NSURLSession。其次,在解析JSON时,你明确告诉它不要报告任何错误(你设置error参数为nil)。你应该真正看到错误,如果有的话:

    var parseError: NSError? 
    if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &parseError) as? NSDictionary { 
        println("jsonResult = \(jsonResult)") 
    } else { 
        // if it didn't work, show enough so we can figure out why: 
    
        println("parseError = \(parseError)") 
        println("response = \(response)") 
        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) 
        println("responseString = \(responseString)") // this will probably be HTML from the server describing some problem in the request 
    } 
    

通常这些类型的请求,因为一些错误的原始NSURLRequest是如何创建的失败,但你是不是向我们展示的足够的信息源问题。

+0

太棒了!我接受了你的建议,并且它工作正常 – user2832411

1

以下是任何正在寻找答案的人的最终代码。

//setting up the base64-encoded credentials 
     let userName = "user" 
     let password = "pass" 
     let loginString = NSString(format: "%@:%@", userName, password) 
     let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)! 
     let base64LoginString = loginData.base64EncodedStringWithOptions(nil) 

//creating the request 
     let url = NSURL(string: "http://www.telize.com/geoip") 
     var request = NSMutableURLRequest(URL: url!) 
     let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
     let session = NSURLSession.sharedSession() 
     request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 

     request.HTTPMethod = "POST" 
     request.setValue(base64LoginString, forHTTPHeaderField: "Authorization") 


     let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 


      var parseError: NSError? 

     if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &parseError) as? NSDictionary { 
     println("jsonResult = \(jsonResult)") 

     } 
     else { 
     //if this didn't work, show enough so we can figure out why: 
      println("parseError = \(parseError)") 
      println("response = \(response)") 
      let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) 
      println("responseString = \(responseString)") 

      } 
      }) 


//fire off the request 

     task.resume() 

     }