如何使用Alamofire将[UInt8]字节数据上传至服务器?
正确用Alamofire上传[UInt8]字节数据的方法
你的问题出在把字节数组放到JSON参数里进行编码——这样Alamofire会把[UInt8]转换成JSON格式的数字数组(比如[1,2,3]),但你的服务器要求的Content-Type是自定义的二进制类型,显然不是JSON,所以服务器无法正确解析你的请求。
下面是两种正确的实现方式:
方式一:直接发送原始二进制数据(推荐)
先把[UInt8]转换成Data类型,然后用Alamofire的upload方法或者直接设置请求体来发送:
步骤1:转换字节数组到Data
// 假设这是你的[UInt8]字节数据 let byteData: [UInt8] = [0x10, 0x20, 0x30, 0x40] let requestData = Data(byteData)
步骤2:用upload方法发送(更符合上传场景)
let headers: HTTPHeaders = ["Content-Type": "application/vnd.awallet-signed-orders-v0"] Alamofire.upload( requestData, to: query, method: .put, headers: headers ).responseJSON { response in print("Request: \(String(describing: response.request))") print("Response: \(String(describing: response.response))") // 这里添加你的响应处理逻辑 }
或者用request方法直接设置HTTPBody
如果你更习惯用request方法,也可以直接设置请求体:
let headers: HTTPHeaders = ["Content-Type": "application/vnd.awallet-signed-orders-v0"] var urlRequest = URLRequest(url: URL(string: query)!) urlRequest.httpMethod = "PUT" urlRequest.allHTTPHeaderFields = headers.dictionary urlRequest.httpBody = requestData Alamofire.request(urlRequest).responseJSON { response in print("Request: \(String(describing: response.request))") print("Response: \(String(describing: response.response))") // 处理响应 }
方式二:如果服务器要求字节数据放在JSON字段中
如果你的服务器确实需要把字节数据封装在JSON的某个字段里(比如data字段),那你需要先把字节数组转换成Base64编码的字符串,再放入参数中:
let byteData: [UInt8] = [0x10, 0x20, 0x30, 0x40] let requestData = Data(byteData) let base64String = requestData.base64EncodedString() let parameters: Parameters = ["data": base64String] let headers: HTTPHeaders = ["Content-Type": "application/vnd.awallet-signed-orders-v0"] Alamofire.request( query, method: .put, parameters: parameters, encoding: JSONEncoding.default, headers: headers ).responseJSON { response in print("Request: \(String(describing: response.request))") print("Response: \(String(describing: response.response))") // 处理响应 }
关键说明
- 你的原始代码错误地使用了
JSONEncoding.default来编码字节数组,这会把二进制数据转换成JSON数组,完全不符合服务器的格式要求。 - 优先选择方式一,因为你的
Content-Type是自定义的二进制类型,直接发送原始字节流是最匹配的方案。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

