java - 快速将字符串转换为数据库 HTTP.UTF8

标签 java android ios swift utf-8

在向 web 服务发送请求时,我的参数字符串应该以 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;

        }

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

"ExpDate" : "ZIT5KR2 4Mk="

在安卓中:

"ExpDate":"ZIT5KR2+4Mk="

如何解决这个问题?

最佳答案

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

您的服务器显然需要一个带有 URL 编码表单数据的 POST 请求。 Android (UrlEncodedFormEntity) native 支持这种请求,但 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)

希望能解决您的问题。

关于java - 快速将字符串转换为数据库 HTTP.UTF8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41416276/

相关文章:

Java - 如何避免创建列表然后复制到其中

android - 在 android 中集成 twitter 时标题 cookie 无效

android - 我有 edittext 填充问题

ios - iOS 应用程序的收据验证码,不起作用

java.sql.SQLException : Error in allocating a connection in managed bean

java - 如何将外部图像加载到 Android Toast 中?

javascript - react native : Android is not showing all images (even though they are the same)

ios - 从另一个 View Controller 通知 View Controller

ios - swift中元素的宽度

Java servlet 用于计算还是仅用于控制?