NSURLSessionUploadTask, как прочитать ответ сервера
Я использую NSURLSessionUploadTask для загрузки файла.
Вот некоторые части моего кода не завершены
let session:NSURLSession = NSURLSession(configuration: config, delegate: self, delegateQueue: NSOperationQueue .mainQueue())
let sessionTask:NSURLSessionUploadTask = session.uploadTaskWithStreamedRequest(request
Но проблема в том, что я не могу получить ответ JSON, который сервер отправляет обратно.
Следующий делегат также не стреляет, но другие делегаты стреляют
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData)
Код, который я использую:
func sendFileToServer1(fileName:String,fileData:NSData,serverURL:String){
let body = NSMutableData()
let mimetype = "application/octet-stream"
// let mimetype = "video/quicktime"
let boundary = "Boundary-\(NSUUID().UUIDString)"
let url = NSURL(string: serverURL)
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"
request.setValue("multipart/form-data; boundary=----\(boundary)", forHTTPHeaderField: "Content-Type")
body.appendData("------\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Disposition:form-data; name=\"file\"; filename=\"\(fileName)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Type: \(mimetype)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(fileData)
body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("------\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Disposition:form-data; name=\"submit\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Submit\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("------\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
request.HTTPBody=body
let config:NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
let session:NSURLSession = NSURLSession(configuration: config, delegate: self, delegateQueue: NSOperationQueue .mainQueue())
let sessionTask:NSURLSessionUploadTask = session.uploadTaskWithStreamedRequest(request)
sessionTask.resume()
}
func URLSession(session: NSURLSession, didBecomeInvalidWithError error: NSError?) {
print("error")
}
func URLSession(session: NSURLSession, task: NSURLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
print("Bytes sent:\(bytesSent) Total bytes sent:\(totalBytesSent) Total bytes expected to send:\(totalBytesExpectedToSend)")
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
print("response:\(response as! NSHTTPURLResponse)")
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
print("data didReceiveData")
}
Я соответствовал делегатам
- NSURLSessionDataDelegate
- NSURLSessionDelegate
- NSURLSessionTaskDelegate
Спасибо
2 ответа
Вы не должны использовать uploadTaskWithStreamedRequest:
если вы создаете данные при создании запроса. Это предназначено для загрузки огромных порций данных, где вам нужно читать данные из файла и кодировать их поочередно, отправляя их по частям за раз. (И как уже упоминалось, вы должны предоставить метод needNewBodyStream, если вы делаете это.)
Скорее всего, вы должны использовать uploadTaskWithRequest:fromData:
и предоставление двоичного объекта данных тела в качестве fromData
параметр.
Вам также не нужно устанавливать данные тела в запросе. NSURLSession игнорирует это, как правило.
Вы могли бы также рассмотреть uploadTaskWithRequest:fromData:completionHandler:
, который позволит вам указать блок для запуска со всеми данными после завершения загрузки, избавляя вас от необходимости предоставлять метод делегата для накопления данных.
Как NSURLSessionUploadTask
это подкласс NSURLSessionDataTask
вы можете попробовать использовать методы из NSURLSessionDataDelegate
:
func urlSession(_ session: NSURLSession, dataTask: NSURLSessionDataTask, didReceive response: NSURLResponse, completionHandler: (NSURLSession.ResponseDisposition) -> Void)
Согласно документации:
Сообщает делегату, что задача данных получила первоначальный ответ (заголовки) от сервера.