moh*_*ish 1 json ios nsurlsession swift alamofire
我需要将图像上传到服务器端点,其中结构必须如下所示:
{ "image": { "file": imageData }, "access_token": access_token }
Run Code Online (Sandbox Code Playgroud)
如何使用NSURLSession(甚至Alamofire或AFNetworking)发送此类请求?
您不能仅将二进制图像数据包含在JSON请求中。JSON需要文本表示,因此,如果执行此操作,则必须将其转换为字符串(例如base64编码),并在JSON中使用它,然后服务器代码可能会在尝试使用base64字符串之前将其转换回二进制数据。
但是,如果您是图像的base64编码,则它可能看起来像:
// get image data
let imageData = UIImagePNGRepresentation(image)
// convert to base64
let base64String = imageData.base64EncodedStringWithOptions(nil)
// build parameters
let parameters = ["image": ["file" : base64String], "access_token" : accessToken]
// get JSON
var error: NSError?
let data = NSJSONSerialization.dataWithJSONObject(parameters, options: nil, error: &error)
assert(data != nil, "Unable to serialize \(error)")
// build request
let url = NSURL(string: "http://example.com/upload")!
let request = NSMutableURLRequest(URL: url)
request.addValue("text/json", forHTTPHeaderField: "Content-Type")
request.HTTPMethod = "POST"
let task = NSURLSession.sharedSession().uploadTaskWithRequest(request, fromData: data) { data, response, error in
// check for basic connectivity errors
if error != nil {
println("error: \(error)")
return
}
// check for server errors
if let httpResponse = response as? NSHTTPURLResponse, let statusCode = httpResponse.statusCode as Int? {
if statusCode != 200 {
println("status code is \(statusCode)")
}
}
// check for details of app-level server response, e.g. if JSON that was dictionary:
var parseError: NSError?
if let responseObject = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &parseError) as? [String : AnyObject] {
println(responseObject)
} else {
println("JSON parse failed: \(parseError)")
println("response was: \(response)")
let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
println("responseString was: \(responseString)")
}
}
task.resume()
Run Code Online (Sandbox Code Playgroud)
如果您使用Alamofire,则可以简化以下操作:
// build parameters
let parameters = ["image": ["file" : base64String], "access_token" : accessToken] as [String : AnyObject]
// build request
let urlString = "http://example.com/upload"
Alamofire.request(.POST, urlString, parameters: parameters, encoding: .JSON)
.responseJSON(options: nil) { request, response, responseObject, error in
if error != nil {
println(error)
} else {
println(responseObject)
}
}
Run Code Online (Sandbox Code Playgroud)
但是以上两种方法都假设响应的性质,即服务器正在对来自JSON的图像数据进行base64解码等,但是希望这可以说明基本模式。
或者,使用一个application/x-www-form-urlencoded请求,您可以在其中发送二进制数据,如此处所示。
| 归档时间: |
|
| 查看次数: |
7664 次 |
| 最近记录: |