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")
}

Я согласился с делегатами

  1. Нсурлсессиондатаделегате
  2. NSURLSessionDelegate
  3. Нсурлсессионтаскделегате

Спасибо


person RajuBhai Rocker    schedule 08.08.2016    source источник
comment
Насколько мне известно, в задаче загрузки нет возможности прочитать данные ответа сервера .... мы можем получить поля заголовка ответа сервера, но не данные полезной нагрузки, которые отправляет сервер. Поправьте меня, если я ошибаюсь   -  person RajuBhai Rocker    schedule 08.08.2016
comment
Какой еще делегат уволен?   -  person Larme    schedule 09.08.2016
comment
func URLSession (сеанс: NSURLSession, задача: NSURLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {   -  person RajuBhai Rocker    schedule 09.08.2016
comment
Реализуйте все методы делегата и сообщите нам каждый из них, который вызывается   -  person Wain    schedule 11.08.2016
comment
поделитесь еще кодом   -  person SHN    schedule 11.08.2016
comment
Я обновил свой вопрос с кодом   -  person RajuBhai Rocker    schedule 11.08.2016
comment
Попробуйте также реализовать соединение: needNewBodyStream:. Он должен создать и вернуть новый объект NSStream так же, как вы создали первоначальный запрос. В соответствии с документом Apple для uploadTaskWithStreamedRequest:: Поток тела и данные тела в этом объекте запроса игнорируются, и NSURLSession вызывает метод URLSession:task:needNewBodyStream: своего делегата для предоставления данных тела.   -  person SHN    schedule 11.08.2016
comment
@SHN - Его не вызывают, я пробовал.   -  person RajuBhai Rocker    schedule 11.08.2016
comment
@RajuBhaiRocker вам нужно использовать NSURLSessionDataTask, поскольку вы отправляете данные на сервер с помощью API, вы не загружаете/переносите какой-либо ресурс в хранилище. Допустим, если вы загружаете видео в ведро Amazon в то время, вы можете использовать NSURLSessionUploadTask, который предназначен для загрузки. Здесь вы публикуете изображение, видео и т. д. в запросе API.   -  person Dipen Panchasara    schedule 16.08.2016


Ответы (2)


Вы не должны использовать uploadTaskWithStreamedRequest:, если вы создаете данные при создании запроса. Это предназначено для загрузки огромных блоков данных, когда вам нужно считывать данные из файла и кодировать их понемногу, отправляя их понемногу. (И, как уже упоминалось, вы должны предоставить метод needNewBodyStream, если вы это сделаете.)

Скорее всего, вы должны использовать uploadTaskWithRequest:fromData: и указать большой двоичный объект данных в качестве параметра fromData.

Вам также не нужно устанавливать данные тела в запросе. NSURLSession, как правило, игнорирует это.

Вы также можете рассмотреть uploadTaskWithRequest:fromData:completionHandler:, который позволит вам указать блок для запуска со всеми данными после завершения загрузки, что избавит вас от необходимости предоставлять метод делегата для накопления данных.

person dgatwood    schedule 14.08.2016
comment
Итак, в этом случае, могу ли я получить процент загрузки, а также данные полезной нагрузки ответа? - person RajuBhai Rocker; 16.08.2016
comment
Я думаю, что методы делегата для загрузки по-прежнему срабатывают, когда вы используете обработчик завершения. Но даже если это не так, задачи NSURLSession полностью поддерживают наблюдение за значениями ключа, поэтому вы всегда можете наблюдать за изменениями свойств countOfBytesSent и countOfBytesExpectedToSend в задаче и пересчитывать процент загрузки при изменении любого из этих значений. . - person dgatwood; 18.08.2016

Поскольку NSURLSessionUploadTask является подклассом NSURLSessionDataTask, вы можете попробовать использовать методы из NSURLSessionDataDelegate:

func urlSession(_ session: NSURLSession, dataTask: NSURLSessionDataTask, didReceive response: NSURLResponse, completionHandler: (NSURLSession.ResponseDisposition) -> Void)

Согласно документации:

Сообщает делегату, что задача данных получила первоначальный ответ (заголовки) от сервера.

person yageek    schedule 17.08.2016
comment
Я не смог получить данные JSON, которые сервер отправляет обратно... Я не нашел другого метода, который дает данные json, которые сервер отправляет обратно - person RajuBhai Rocker; 17.08.2016