gpt4 book ai didi

ios - 由 base64encodeString 组成的 NSMutableRequest 正文在作为字符串发送时被截断

转载 作者:行者123 更新时间:2023-11-30 13:34:16 28 4
gpt4 key购买 nike

最近,我正在做一个 NSUrlSession 任务,将多张图片上传到后端。我将 .png 表示形式的所有图像附加到一个数组中。我将整个数组转换为 base64 字符串格式,并尝试将整个正文作为字符串发送。

imageArray 到 String 的转换 -

let imageArrayData: NSData = NSKeyedArchiver.archivedDataWithRootObject(imageArray)
let imageArrayBase64String = imageArrayData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))

在这里打印数组,我得到 -
(String) imageArrayBase64String = "YnBsaXN0MDDUAQIDBAUIIiNUJHRvcFgkb2JqZWN0c1gkdmVyc2lvblkkYXJjaGl2ZXLRBgdUcm9vdIABpQkKEBQcVSRudWxs0gsMDQ5WJGNsYXNzWk5TLm9iamVjdHOABKEPgALSEQsSE1dOUy5kYXRhTxIBe8QxiVBORw0KGgoAAAANSUhEUgAAEMAAAAsgCAIAAABnC3DjAAABGWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGBSSCwoyGESYGDIzSspCnJ3UoiIjFJgf8DAzCDDwMUgwGCUmFxc4BgQ4MMABDAaFXy7xsAIoi/rgszClMcLuFJSi5OB9B8gzk4uKCphYGDMALKVy0sKQOweIFskKRvMXgBiFwEdCGRvAbHTIewTYDUQ9h2wmpAgZyD7A5DNlwRmM4Hs4kuHsAVAbKi9ICDomJKflKoA8r2GoaWlhSaJfiAISlIrSkC0c35BZVFmekaJgiMwpFIVPPOS9XQUjAwMzRgYQOEOUf05EByejGJnEGIIgBCbI8HA4L+UgYHlD0LMpJeBYYEOAwP/VISYmiEDg4A+A8O+OcmlRWVQYxiZjBkYCPEBNDZKYi1QenUAAAAcaURPVAAAAAIAAAAAAAAFkAAAACgAAAWQAAAFkADAfM/Go8QlAABAAElEQVR4AXS8BXQcV7b3K0Pm3jt3IIlBlmzLFjMzMzMztVhqUasZ1ChmZibLsixmmSmGkB1yzIyhgZubTGJ//+rK6GW97721/muvffbZdaqqq7vqVNX+tUJijjZEKTBIztNNyNZKoeol5WlB8dnqibmaKfk68BOy1JNztVKpOkk5mgiSItPkPjLVU/K14rIOpxboJlO1YzNVE3I0IDJzayiMhmBclhoisEhOK9JHPhZPytNILdCiFGqn07STqKrJVI2UfM24rEPx2YcRzKDppRZoYxWkknM1IGxPSp52cp56epFOar5mClUjmYoN1kor0kVyWpFOejHG18E4KQXqqYUaacUaGSVa2XSdPJY+pUAtk6aVxdB"

创建 body -
let body = "task=doNotification&select_category=\(selectCategory!)&select_type=\(selectType!)&class=\(classid!)&repliable=\(repliable)&select_students=\(selectedStudents)&select_group=\(selectGroup!)&title=\(SbjctOrTtlTxtFld.text!)&text=\(textVieww.text!)&image=\(imageArrayBase64String)&date=\(dateText!)&time=\(timeText!)"

在这里打印正文,我得到 -
(String) body = "task=doNotification&select_category=exams&select_type=check&class=2&repliable=1&select_students=(\n    26,\n    25\n)&select_group=11&title=self&text=Adam <IMG_0002>&image=YnBsaXN0MDDUAQIDBAUIIiNUJHRvcFgkb2JqZWN0c1gkdmVyc2lvblkkYXJjaGl2ZXLRBgdUcm9vdIABpQkKEBQcVSRudWxs0gsMDQ5WJGNsYXNzWk5TLm9iamVjdHOABKEPgALSEQsSE1dOUy5kYXRhTxIBe8QxiVBORw0KGgoAAAANSUhEUgAAEMAAAAsgCAIAAABnC3DjAAABGWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGBSSCwoyGESYGDIzSspCnJ3UoiIjFJgf8DAzCDDwMUgwGCUmFxc4BgQ4MMABDAaFXy7xsAIoi/rgszClMcLuFJSi5OB9B8gzk4uKCphYGDMALKVy0sKQOweIFskKRvMXgBiFwEdCGRvAbHTIewTYDUQ9h2wmpAgZyD7A5DNlwRmM4Hs4kuHsAVAbKi9ICDomJKflKoA8r2GoaWlhSaJfiAISlIrSkC0c35BZVFmekaJgiMwpFIVPPOS9XQUjAwMzRgYQOEOUf05EByejGJnEGIIgBCbI8HA4L+UgYHlD0LMpJeBYYEOAwP/VISYmiEDg4A+A8O+OcmlRWVQYxiZjBkYCPEBNDZKYi1QenUAAAAcaURPVAAAAAIAAAAAAAAFkAAAACgAAAWQAAAFkADAfM/Go8QlAABAAElEQVR4AXS8BXQcV7b3K0Pm3jt3IIlBlmzLFjMzMzMztVhqUasZ1ChmZibLsixmmSmGkB1yzIyhgZubTGJ//+rK6GW97721/muvffbZdaqqq7vqVNX+tUJijjZEKTBIztNNyNZKoeol5WlB8dnqibmaKfk68BOy1JNztVKpOkk5mgiSItPkPjLVU/K14rIOpxboJlO1YzN"

您可以注意到,主体甚至没有传递数组的完整编码字符串,也没有传递最后两个参数,即日期和时间。

那么为什么会这样呢?

调用网络服务 -
func sendAPIRequest(urlpath:NSString,body: NSString , completion: (result: NSMutableDictionary, error: AnyObject?)-> Void ) -> Void
{

let url:NSURL = NSURL(string: urlpath as String)!

let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"

let bodydata = body.dataUsingEncoding(NSUTF8StringEncoding)
request.HTTPBody = bodydata



let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config)

let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in

do
{

let resultdic = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSMutableDictionary
//print(resultdic!)
completion(result: resultdic!,error: nil)


}
catch
{
print("error")
}

}
task.resume()

最佳答案

几点观察:

  • 看起来您正在调试器中查看 body。这将截断字符串(尽管通常它在末尾显示省略号以表示它已被截断)。我建议你试试 print(body) 看看你是否在那里看到了整个字符串。
  • 您的 selectStudents 是一个 NSArray,当您对其进行字符串插值时,它会在其中包含一个换行符。最终结果是这个 x-www-form-urlencoded 请求格式不正确,很可能会被服务器拒绝。有几种方法可以解决这个问题
  • 如果你的服务器真的需要一个 select_students=(\n 26,\n 25\n) 形式的字符串(如果这真的是你想要的,我会非常惊讶),你会百分比转义该字符串:
    let selectedStudentsString = "selectedStudents=\(selectedStudents)".stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryParameterAllowedCharacterSet())!

    这将产生:
    selectedStudents=(%0A%20%20%20%20foo,%0A%20%20%20%20bar%0A)

    其中 URLQueryParameterAllowedCharacterSet 定义为:
    extension NSCharacterSet {

    /// Returns the character set for characters allowed in the individual parameters within a query URL component.
    ///
    /// The query component of a URL is the component immediately following a question mark (?).
    /// For example, in the URL `http://www.example.com/index.php?key1=value1#jumpLink`, the query
    /// component is `key1=value1`. The individual parameters of that query would be the key `key1`
    /// and its associated value `value1`.
    ///
    /// According to RFC 3986, the set of unreserved characters includes
    ///
    /// `ALPHA / DIGIT / "-" / "." / "_" / "~"`
    ///
    /// In section 3.4 of the RFC, it further recommends adding `/` and `?` to the list of unescaped characters
    /// for the sake of compatibility with some erroneous implementations, so this routine also allows those
    /// to pass unescaped.


    class func URLQueryParameterAllowedCharacterSet() -> Self {
    return self.init(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~/?")
    }

    }

    有关其他百分比转义选项,请参见 https://stackoverflow.com/a/35912606/1271826。但避免将 stringByAddingPercentEncodingWithAllowedCharacters 与任何现有字符集(例如 URLQueryAllowedCharacterSet )一起使用,因为它们都允许保留字符以非转义方式传递。
  • 如果您真的希望服务器代码在 x-www-form-urlencoded 请求中将其作为数组接收,您可能需要:
    var selectedStudentsArray = [String]()
    for index in 0 ..< selectedStudents.count {
    selectedStudentsArray.append("selectedStudents[]=\(selectedStudents[index])")
    }
    let selectedStudentsString = selectedStudentsArray.joinWithSeparator("&")

    这将产生:
    selectedStudents[]=26&selectedStudents[]=25

    这是在 x-www-form-urlencoded 请求中发送值数组的正确方法。
  • 您的 text 值也包括保留字符。您应该避免这种情况(以及任何其他可能包括 a - zA - Z0 - 9-._~/? 之外的字符)。同样,当像这样进行 x-www-form-urlencoded 请求时,所有保留字符都必须进行百分比转义。
  • 您正在获取图像数组并构建 NSKeyedArchiver 。就您的 Web 服务而言,这将是一个大的、不透明的 blob 对象。如果您的意图是将其视为服务器上的单个 blob,那很好,但如果您希望从中提取图像,那么您的生活就会变得不必要地复杂。

    您可以:
  • Base-64 分别对图像进行编码,然后使用我为 selectStudents 建议的相同格式,例如
    image[]=Bsa...JJH&image[]=5YJ...mVj

    请注意,您应该使用数据的原始内容(例如,直接从原始文件/ Assets 中获取 NSData,完全避免使用 UIImage),或者,如果您确实需要通过 UIImage 往返(如果您可以防止它),然后使用 UIImagePNGRepresentationUIImageJPEGRepresentationNSData 创建一个新的 UIImage
  • 您可以考虑使用 multipart/form-data 请求,然后可以单独存储单个图像(同样,尽管有上述关于获取 NSData 的评论)。如果您执行正确的 multipart/form-data 请求,它也可以避免在任何地方进行任何百分比转义,避免 base-64 编码(这使得传输比需要的大 33%)等等。

  • 归根结底,正确创建此类请求非常非常复杂,除非您真的想解开所有这些特质,否则我真的鼓励您考虑 Alamofire ,它可以让您摆脱这些杂草。如果你真的觉得有必要重新发明轮子,我建议你单独研究这些主题,因为这对于一个问题来说太宽泛了。我上面的每一个观点都可能需要一个单独的问题。

    关于ios - 由 base64encodeString 组成的 NSMutableRequest 正文在作为字符串发送时被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36256326/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com