2015-06-08 166 views
3

下卷曲工作转换curl命令到iOS

curl -G -H "api_key: MYAPIKEY" https://api.semantics3.com/test/v1/products -d 'q={"upc":"70411576937"}' 

然而,在试图将其转换到iOS我得到以下错误:

Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." {NSErrorFailingURLStringKey=https://api.semantics3.com/test/v1/products,...} 

我在下面附上我的代码,但我相信我的问题是在提交给URL的json数据之前的“q =”。如果是这样,这是什么叫,我怎么把“Q =”在我的JSON数据之前?尽管如此,我还是无法确切地说,由于iOS没有为我们提供无关的错误消息而保持沉默。谢谢。

var urlString = "https://api.semantics3.com/test/v1/products" 
    var request = NSMutableURLRequest(URL: NSURL(string: urlString)!) 
    var response: NSURLResponse? 
    var error: NSErrorPointer = nil 
    var reqText = ["upc": "70411576937"] 
    var err: NSError? 

    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(reqText, options: nil, error: &err) 
    request.HTTPMethod = "GET" 
    request.addValue("MYAPIKEY", forHTTPHeaderField: "api_key") 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 
    var session = NSURLSession.sharedSession() 

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     var strData = NSString(data: data, encoding: NSUTF8StringEncoding) 
     if(err != nil) { 
      println(err!.localizedDescription) 
     } 
     else { 
      //this is where the error is printed 
      println(error) 
      var parseError : NSError? 
      // parse data 
      let unparsedArray: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: &parseError) 
      println(parseError) 
      if let resp = unparsedArray as? NSDictionary { 
       println(resp) 
      } 
     } 
    }) 
    task.resume() 
+0

我知道这听起来很愚蠢,但尝试戒烟模拟器和再次运行应用程序。有时候,我的模拟器在一晚或一段时间闲置后失去联系。 – AdamPro13

回答

1

身体是不是在GET HTTP方法使用。使用下面的代码Concat的您的PARAMS:

extension String { 

    /// Percent escape value to be added to a URL query value as specified in RFC 3986 
    /// 
    /// This percent-escapes all characters besize the alphanumeric character set and "-", ".", "_", and "~". 
    /// 
    /// http://www.ietf.org/rfc/rfc3986.txt 
    /// 
    /// :returns: Return precent escaped string. 

    func stringByAddingPercentEncodingForURLQueryValue() -> String? { 
     let characterSet = NSMutableCharacterSet.alphanumericCharacterSet() 
     characterSet.addCharactersInString("-._~") 

     return self.stringByAddingPercentEncodingWithAllowedCharacters(characterSet) 
    } 

} 

extension Dictionary { 

    /// Build string representation of HTTP parameter dictionary of keys and objects 
    /// 
    /// This percent escapes in compliance with RFC 3986 
    /// 
    /// http://www.ietf.org/rfc/rfc3986.txt 
    /// 
    /// :returns: String representation in the form of key1=value1&key2=value2 where the keys and values are percent escaped 

    func stringFromHttpParameters() -> String { 
     let parameterArray = map(self) { (key, value) -> String in 
      let percentEscapedKey = (key as! String).stringByAddingPercentEncodingForURLQueryValue()! 
      let percentEscapedValue = (value as! String).stringByAddingPercentEncodingForURLQueryValue()! 
      return "\(percentEscapedKey)=\(percentEscapedValue)" 
     } 

     return join("&", parameterArray) 
    } 

} 


var urlString = "https://api.semantics3.com/test/v1/products" 
var reqText = ["upc": "70411576937"] 
var err: NSError? 

let parameterString = reqText.stringFromHttpParameters() 
let requestURL = NSURL(string:"\(urlString)?\(parameterString)")! 

var request = NSMutableURLRequest(URL: NSURL(string: urlString)!) 
var response: NSURLResponse? 
var error: NSError? 

request.HTTPMethod = "GET" 
request.addValue("MYAPIKEY", forHTTPHeaderField: "api_key") 
request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.addValue("application/json", forHTTPHeaderField: "Accept") 
var session = NSURLSession.sharedSession() 

局部编辑:SWIFT 2.1(更新)

extension Dictionary { 

    func stringFromHttpParameters() -> String { 
     let parameterArray = self.map { (key, value) -> String in 
      let percentEscapedKey = (key as! String).stringByAddingPercentEncodingForURLQueryValue()! 
      let percentEscapedValue = (value as! String).stringByAddingPercentEncodingForURLQueryValue()! 
      return "\(percentEscapedKey)=\(percentEscapedValue)" 
     } 

     return parameterArray.joinWithSeparator("&") 
    } 

} 
+1

谢谢。我的问题是我的NSURL没有识别大括号,但stringByAddingPercentEncodingForURLQueryValue()方法为我解决了这个问题。 –

+0

使用Swift 2我在扩展字典中的第二行发现错误: “无法用类型为'(Dictionary '的参数列表调用'map'字符串)“ 任何想法如何解决这个问题? – SMKS

+0

我更新了字典扩展名以使用Swift 2.1进行编译。仍然不是很确定为什么我不得不打破两个函数来编译。只要我声明一个变量放入map的闭包,编译器就会抱怨。我可能会为此发布另一个问题。 – Laurent

0

将您的JSON为字符串,前面加上q=到这一点,那么它分配给请求的HTTPBody之前转换结果字符串数据。

像这样的东西可能:

let array = [ "one", "two" ] 
let data = NSJSONSerialization.dataWithJSONObject(array, options: nil, error: nil) 
let body= "q=" + NSString(data: data!, encoding: NSUTF8StringEncoding) 
request.HTTPBody = body.dataUsingEncoding(NSUTF8StringEncoding)