2015-06-08 4 views
3

Следующая завиток работаетПреобразование локон команды прошивкой

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

Однако при попытке преобразовать его прошивкой я получаю следующее сообщение об ошибке:

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

Я приложил мой код ниже, но я считаю, что моя проблема - это «q =» прямо перед json-данными, которые отправляются на URL-адрес. Если да, то что это называется и как мне поставить «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() 

ЧАСТИЧНОЙ EDIT: 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 Я получаю сообщение об ошибке во второй строке в расширении Словарь, который говорит: «Невозможно вызвать« карту »с помощью списка аргументов типа (Словарь <ключ, значение), (_, _) -> String) " Любая идея, как это исправить? – SMKS

+0

Я обновил расширение Dictionary для компиляции с помощью Swift 2.1. Все еще не совсем уверен, почему мне пришлось сломать функцию из двух, чтобы скомпилировать. Как только я объявляю переменную с let в закрытии карты, компилятор жалуется. Я могу задать еще один вопрос. – 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) 
Смежные вопросы