ios - 如何在 swift 4 中获取 ISO8601 格式?

标签 ios swift xcode amazon-web-services swift3

我正在使用亚马逊网络服务进行商品搜索。我可以获得时间戳值并转换为 iso 格式。但在控制台输出中显示 Timestamp 无效。原因:必须是ISO8601格式

这是我的完整控制台输出值: 状态码为:可选(400) XML: . InvalidParameterValue参数时间戳的值 2018-06-15T18%3A43%3A52Z 无效。原因:必须是ISO8601格式。66a698a6-a967-4b34-b15a-94780f9287ce

这是我试过的男女同校:

    public func getSearchItem(searchKeyword: String) -> [String:AnyObject]{
      let timeStamp = getTimestamp()

    let dateFormatter = DateFormatter()
    dateFormatter.timeZone = TimeZone(identifier: "IST")
    let tempLocale = dateFormatter.locale // save locale temporarily
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    let date = dateFormatter.date(from: timeStamp.string(from: Date()))!
    dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss"
    dateFormatter.locale = tempLocale // reset the locale
    let dateString = dateFormatter.string(from: date)
    print("EXACT_DATE : \(dateString)")

    let url = "http://webservices.amazon.in/onca/xml"
    let parameters: Parameters = ["Service": "AWSECommerceService",
                                  "Operation": "ItemSearch",
                                  "ResponseGroup": "Images,ItemAttributes",
                                  "SearchIndex":"All",
                                  "Keywords": searchKeyword,
                                  "Timestamp": urlEncode(timeStamp.string(from: date)),
                                  "AWSAccessKeyId": urlEncode(ViewController.kAmazonAccessID),
                                  "AssociateTag": urlEncode(ViewController.kAmazonAssociateTag)
                                 ]



    let signedParams = signedParametersForParameters(parameters: parameters as! [String : String])

    Alamofire.request(url, method: .get, parameters: signedParams, encoding: URLEncoding.default)
        .responseString { response in
            print(" - API url: \(String(describing: response.request!))")   // original url request
            var statusCode = response.response?.statusCode

            switch response.result {
            case .success:
                print("status code is: \(String(describing: statusCode))")
                if let string = response.result.value {
                    print("XML: \(string)")
                }
            case .failure(let error):
                statusCode = error._code // statusCode private
                print("status code is: \(String(describing: statusCode))")
                print(error)
            }
    }


    return parameters as [String : AnyObject]
}

func getTimestamp() -> DateFormatter{
    var timestampFormatter = DateFormatter()
    timestampFormatter = DateFormatter()
    timestampFormatter.dateFormat = AWSDateISO8601DateFormat1
    timestampFormatter.timeZone = TimeZone(identifier: "IST")
    timestampFormatter.locale = Locale(identifier: "en_US_POSIX")
    return timestampFormatter
}

最佳答案

错误是:

Optional(400) XML: . InvalidParameterValue Value 2018-06-15T18%3A43%3A52Z for parameter Timestamp is invalid. Reason: Must be in ISO8601 format.

问题是关于 : 转义百分比(转换为 %3A),因为 2018-06-15T18:43:52Z 似乎在 ISO8601 格式中有效,而 2018-06-15T18%3A43%3A52Z 无效。

你在 parameters 中添加了自己的逃逸百分比:

所以:

"Timestamp": urlEncode(timeStamp.string(from: date))

=>

"Timestamp": timeStamp.string(from: date)

此外,请注意在 iOS 中有一个 ISO8601DateFormatter可从 iOS10+ 获得,可以避免您自己编写格式。

关于ios - 如何在 swift 4 中获取 ISO8601 格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50871273/

相关文章:

ios - 如何获取测试设备 ID 以在 Unity3D 中测试 iOS 上的 Admob

ios - deselectRowAtIndexPath 什么都不做

ios - 获取变量中 NSCalendarUnit 的 NSDateComponents 值

ios - Xcode 6 无法为 iPhone 6 模拟器显示正确的图像大小

iphone - 平移后 UIImageView 质量下降?

ios - AEXMLDocument loadXMLData() 在 Swift 中不起作用

ios - 在 Metal 中使用自定义计算着色器时发生内存泄漏

ios - 在 Swift 中等待异步操作完成

ios - 我的 TableViewCell 自定义类中的 IbOutlet 从未被初始化

c++ - 尝试在终端(MacOSX)中编译两个.cpp文件(来自XCode)时的“Duplicate symbol”