将curl命令转换为iOS

以下curl作品

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,...} 

我已经附加了我的代码如下,但我相信我的问题是“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() 

GET方法中不使用Body。 使用下面的代码来连接你的参数:

 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("&") } } 

把你的JSON转换成一个string,在其前面加上q= ,然后把结果string转换为Data,然后把它分配给请求的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)