Загрузить изображение с параметрами URL с помощью Alamofire при проблеме с iOS 9

У меня есть приложение для iOS, написанное на Swift 2.0, которое загружает изображения в хранилище больших двоичных объектов Microsoft Azure. Я использую Alamofire для запросов.

На устройстве с iOS 8 все работает нормально, но на iOS 9 выдает ошибки при загрузке:

    let AlamofireManager = Alamofire.Manager.sharedInstance
    AlamofireManager.session.configuration.HTTPAdditionalHeaders = [
        "Content-Type": "image/jpg",
        "x-ms-blob-type": "BlockBlob"
    ]
    AlamofireManager.upload(.PUT, uploadURL, data: imageData)
        .responseJSON { (request, response, result) in
            print("Request=\(request)")
            print("response=\(response)")
            print("result=\(result)")
            if (response) != nil {
                let statusString = String(stringInterpolationSegment: response!.statusCode)
                let statusCode = self.getStatusCodeFromStatusString(statusString)
                if (statusCode == 201) {
                    // MY SUCCESS CODE IS HERE
                }
                else {
                    // STATUSCODE != 201
                }
            }
            else {
                // OTHER ERROR
            }
       }

Пример URL-адреса для загрузки (uploadURL) может быть следующим:

https://mystorage.blob.core.windows.net:443/thumbs/7346e38a-eb54-48ea-b0fe-89357100dd18.jpg?sv=2013-08-15&sr=b&sig=GYwHvnUc52GsajFJCAu1v4W5qG0wSBpaXvxncD%2FAt34%3D&st=2015-10-01T11%3A25%3A57Z&se=2015-10-01T11%3A40%3A57Z&sp=w

Для Azure важно, чтобы: а) HTTP-глагол был PUT б) параметры URL-адреса включались в URL-адрес, а не как составные данные (это токен доступа для загрузки).

Возможно, у Alamofire есть проблемы с созданием URL-адреса с параметрами в сочетании с PUT?

Это решение не работает, потому что оно основано на загрузке составных данных: Загрузить изображение с параметрами в Свифте

Поскольку я думаю о проблеме с параметром URL, я попробовал следующее:

    let AlamofireManager = Alamofire.Manager.sharedInstance
    AlamofireManager.session.configuration.HTTPAdditionalHeaders = [
        "Content-Type": "image/jpg",
        "x-ms-blob-type": "BlockBlob"
    ]
    var URLRequest: NSMutableURLRequest {
        let URL = NSURL(string: uploadURL)!
        var mutableRequest = NSMutableURLRequest(URL: URL)
        mutableRequest.HTTPMethod = Alamofire.Method.PUT.rawValue
        return mutableRequest
    }
    AlamofireManager.upload(URLRequest, data: imageData)
:
: rest is same like above
:

Но это тоже не работает. В обоих случаях я всегда получаю ошибку 400 (в response.statusCode) с сервера. result содержит Failure и информацию NSCocoaErrorDomain - code 3840 с описанием Invalid value around character 3.

Но на iOS 8 решение работает как шарм :(

Есть идеи, в чем проблема и как ее решить?

Редактировать: Или проблема может быть в порте?


person Oliver Apel    schedule 01.10.2015    source источник


Ответы (1)


Получил это самостоятельно. Alamofire, похоже, не отправляет HTTP-заголовки, как ожидалось, с помощью AlamofireManager. Я добавил заголовки вручную:

    var URLRequest: NSMutableURLRequest {
        let URL = NSURL(string: uploadURL)!
        var mutableRequest = NSMutableURLRequest(URL: URL)
        mutableRequest.HTTPMethod = Alamofire.Method.PUT.rawValue
        mutableRequest.setValue("image/jpg", forHTTPHeaderField: "Content-Type")
        mutableRequest.setValue("BlockBlob", forHTTPHeaderField: "x-ms-blob-type")
        return mutableRequest
    }

    AlamofireManager.upload(URLRequest, data: imageData)
    :
    :
person Oliver Apel    schedule 02.10.2015
comment
Alamofire отправляет заголовки точно так, как ожидалось. Вам необходимо создать собственную конфигурацию сеанса и добавить заголовки перед созданием сеанса URL, иначе iOS 9 не добавит заголовки. - person cnoon; 04.10.2015