2015-06-08 167 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)