[android]将字符串转换为数据基地 HTTP。在 swift UTF8

发布时间: 2017/3/19 17:04:36
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

在发送请求到 web Service 我参数字符串应基 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

那里是 java 代码在 android :

 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 响应 service 因为在swift在基地 UTF8 编码 + 字符在加密的数据更改与 space ,如何可以编码基础 HTTP。在 swift UTF_8。 在 swift:

"ExpDate" : "ZIT5KR2 4Mk="

in android :

"ExpDate":"ZIT5KR2+4Mk="

如何可以解决这个问题吗?

解决方法 1:

你的问题很难理解当你不去解释什么 "ExpDate":"ZIT5KR2+4Mk=" 是。其中一部分是它所载?我认为ExpDateproperty 序列化为 JSON 的param字典。我进一步假设加号字符后的原始字符 Base64 编码并不插入 URL 请求生成之时。

您的服务器显然期望一个 POST 请求的 url 编码表单数据。这种要求本机支持由 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: "+")
    }


}

它可以使用像这样 (在操场上测试)︰

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)

我希望它可以解决你的问题。

赞助商