如何在iOS swift中进行产品搜索api?

我正在使用亚马逊产品广告api搜索产品。 安装了awscore和alamofire cocopods。 为项目搜索获取签名和添加参数的完成function,以获取表格视图列表中的产品图像,标题和描述。

这是我尝试获取亚马逊搜索的代码:

private func signedParametersForParameters(parameters: [String: String]) -> [String: String] { let sortedKeys = Array(parameters.keys).sorted(by:  String { let allowedCharacterSet = (CharacterSet(charactersIn: "!*'();:@&=+$,/?%#[] ").inverted) if let escapedString = input.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) { return escapedString } return "" } func send(url: String) -> String { // activityIndicator.startAnimating() guard let url = URL(string: url) else { print("Error! Invalid URL!") //Do something else // activityIndicator.stopAnimating() return "" } print("send URL: \(url)") let request = URLRequest(url: url) let semaphore = DispatchSemaphore(value: 0) var data: Data? = nil URLSession.shared.dataTask(with: request) { (responseData, _, _) -> Void in data = responseData print("send URL session data: \(String(describing: data))") let parser = XMLParser(data: data!) parser.delegate = self as? XMLParserDelegate if parser.parse() { print(self.results ?? "No results") } semaphore.signal() }.resume() // activityIndicator.stopAnimating() semaphore.wait(timeout: .distantFuture) let reply = data.flatMap { String(data: $0, encoding: .utf8) } ?? "" return reply } public func getSearchItem(searchKeyword: String) -> [String:AnyObject]{ let timestampFormatter: DateFormatter timestampFormatter = DateFormatter() timestampFormatter.timeZone = TimeZone(identifier: "GMT") timestampFormatter.dateFormat = "YYYY-MM-dd'T'HH:mm:ss'Z'" timestampFormatter.locale = Locale(identifier: "en_US_POSIX") // let responsegroupitem: String = "ItemAttributes" // let responsegroupImages:String = "Images" // activityIndicator.startAnimating() let operationParams: [String: String] = [ "Service": "AWSECommerceService", "Operation": "ItemSearch", "ResponseGroup": "Images,ItemAttributes", "IdType": "ASIN", "SearchIndex":"All", "Keywords": searchKeyword, "AWSAccessKeyId": urlEncode(CameraViewController.kAmazonAccessID), "AssociateTag": urlEncode(CameraViewController.kAmazonAssociateTag), "Timestamp": urlEncode(timestampFormatter.string(from: Date()))] let signedParams = signedParametersForParameters(parameters: operationParams) let query = signedParams.map { "\($0)=\($1)" }.joined(separator: "&") let url = "http://webservices.amazon.in/onca/xml?" + query print("querydata::::\(query)") let reply = send(url: url) print("reply::::\(reply)") // activityIndicator.stopAnimating() return [:] } 

创建桥接头文件#import。

 func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { getSearchItem(searchKeyword: searchKeyword) } 

这是我的控制台输出: 在此处输入图像描述

我的问题是,点击搜索按钮产品搜索没有列出。 我不知道犯了什么错误。 任何人都可以帮我解决这个问题..

根据文件 :

HTTPRequestURI组件是URI的HTTP绝对路径组件,但不包括查询字符串。 如果HTTPRequestURI为空,请使用正斜杠(/)。

对于Product Advertising API,HTTPRequestURI始终为“/ onca / xml”。 HTTPVerb是GET或POST。

尝试将requestURL设置为“/ onca / xml”而不是完整的URL,您不应该在此部分中发送完整的URL或查询字符串。

您还需要对要发送的值进行百分比编码。 您正在响应组属性中发送逗号,该属性应为百分比编码

 let operationParams: [String: String] = [ "Service": "AWSECommerceService", "Operation": "ItemSearch", "ResponseGroup": urlEncode("Images,ItemAttributes"), "IdType": "ASIN", "SearchIndex":"All", "Keywords": urlEncode(searchKeyword), "AWSAccessKeyId": urlEncode(CameraViewController.kAmazonAccessID), "AssociateTag": urlEncode(CameraViewController.kAmazonAssociateTag), "Timestamp": urlEncode(timestampFormatter.string(from: Date()))] 

 let stringToSign = "GET\n/onca/xml\n\(query)" 

注意:您应该使用https而不是http