【问题标题】:Convert String to Data base HTTP.UTF8 in swift快速将字符串转换为数据库 HTTP.UTF8
【发布时间】:2017-01-01 14:42:40
【问题描述】:

在向网络服务发送请求时,我的参数字符串应该编码基本 UTF8,我的代码用于获取数据库 UTF8 编码:

  let postData
            = try! JSONSerialization.data(withJSONObject: param, options: JSONSerialization.WritingOptions.prettyPrinted)
            //param is NSDictionary 
   let jsonString = NSString(data: postData, encoding: String.Encoding.utf8.rawValue)! as String
   let pair = "action=payment&key=hmn@$Q*$GD4@!$#&input=\(jsonString)"
   let post = pair.data(using: String.Encoding.utf8, allowLossyConversion: true)
request.httpMethod = "POST"

    request.httpBody = post

android中有java代码:

 pairs.add(new BasicNameValuePair("action", "payment"));
        pairs.add(new BasicNameValuePair("key", "hmn@$Q&*$GD4@!$#"));
        pairs.add(new BasicNameValuePair("input", item.toString()));

        try {
            httpGet.setEntity(new UrlEncodedFormEntity(pairs, HTTP.UTF_8));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            Exception_Code = 1;

        }

输入密钥中的某些参数使用 MD5 和 TripleDes 加密,我无法从 Web 服务获得响应,因为在 swift + 字符中编码基本 UTF8 时,加密数据随空间变化,如何快速编码基本 HTTP.UTF_8。 迅速:

"ExpDate" : "ZIT5KR2 4Mk="

在安卓中:

"ExpDate":"ZIT5KR2+4Mk="

如何解决这个问题?

【问题讨论】:

    标签: java android ios swift utf-8


    【解决方案1】:

    您的问题很难理解,因为您没有解释 "ExpDate":"ZIT5KR2+4Mk=" 是什么。它包含在哪个部分?我假设 ExpDate 是一个属性 param 字典,它被序列化为 JSON。我进一步假设加号字符是 Base64 编码后的原始字符,并且在构建 URL 请求时没有插入。

    您的服务器显然需要一个带有 URL 编码的表单数据的 POST 请求。 Android (UrlEncodedFormEntity) 原生支持这种请求,但 iOS 不支持。为了达到同样的效果,您不能只连接键/值对。您还必须对它们进行正确的 URL 编码。

    为此,我建议使用以下URLRequest 扩展:

    import Foundation
    
    extension URLRequest {
    
        private static let alloweCharacters = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -_.*")
    
        public mutating func setURLEncodedFormData(parameters: [String: String?]) {
    
            var encodedParameters = ""
    
            for (key, value) in parameters {
    
                if !encodedParameters.isEmpty {
                    encodedParameters += "&"
                }
    
                encodedParameters += URLRequest.urlEncoded(value: key)
                encodedParameters += "="
                if let value = value {
                    encodedParameters += URLRequest.urlEncoded(value: value)
                }
            }
    
            self.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
            self.httpBody = encodedParameters.data(using: .utf8)
        }
    
    
        private static func urlEncoded(value: String) -> String {
    
            return value.addingPercentEncoding(withAllowedCharacters: alloweCharacters)!.replacingOccurrences(of: " ", with: "+")
        }
    
    
    }
    

    可以这样使用(在 Playground 中测试):

    var request = URLRequest(url: URL(string: "http://somehost.com/someservice")!)
    request.httpMethod = "POST"
    
    let jsonString = "{ \"ExpDate\" : \"ZIT5KR2+4Mk=\", \"SomeString\" : \"%=&\" }"
    var params = [ "action": "payment", "key": "hmn@$Q&*$GD4@!$#", "input": jsonString]
    request.setURLEncodedFormData(parameters: params)
    

    希望它能解决你的问题。

    【讨论】:

    • 我的第一个代码可能没有正确涵盖所有情况。我添加了一个带有自定义字符集和将空格显式转换为加号的新版本。
    猜你喜欢
    • 2015-04-09
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2015-06-19
    • 2017-03-16
    相关资源
    最近更新 更多