Как сохранить данные в файл json и отправить на сервер с Alamofire - PullRequest
0 голосов
/ 22 марта 2020

Я хочу получить файл json с сервера (локальный apache), показать его содержимое в UITextView, затем добавить элементы и загрузить обратно на сервер. У меня есть содержимое json в UITextView, добавить еще один элемент и преобразовать в тип JSON. Попытка загрузки на сервер, но файл не загружен.

Мой код данных загрузки:

func loadData() {
    AF.request("http://localhost/cheerfulNutApache/nuts.json", parameters: header).responseJSON { response in
        switch response.result {
            case .success(let value):
                let response = JSON(value)
                self.textView.text = "\(response)"

            case .failure(let error):
                print(error)
                break
        }
    }
}

Мой код загрузки:

let data = textView.text!

    let decode = JSON.init(parseJSON: data)
    print(type(of: decode))

    AF.request("http://localhost/cheerfulNutApache/swift.json", method: .post, parameters: decode).validate().response { (response) in
        switch response.result {
        case .success:
            print("Successful")
            print(response)
        case .failure(let error):
            print(error)
        }
    }

Также я Google над этим вопросом, но найти только, как загрузить изображение, а не json. Поэтому мне нужна помощь с этим или совет.

UPD: добавить вывод функции загрузки AF

[Request]: POST http://localhost/cheerfulNutApache/swift.json
[Request Body]: 
None
[Response]: 
[Status Code]: 200
[Headers]:
Accept-Ranges: bytes
Connection: Keep-Alive
Content-Length: 0
Content-Type: application/json
Date: Mon, 23 Mar 2020 17:29:31 GMT
Etag: "0-5a188e7f87fc0"
Keep-Alive: timeout=5, max=100
Last-Modified: Mon, 23 Mar 2020 17:24:23 GMT
Server: Apache/2.4.41 (Unix) PHP/7.3.9
[Response Body]: 
None
[Data]: None
[Network Duration]: 0.08196401596069336s
[Serialization Duration]: 0.0s
[Result]: success(nil)
Swift.Result<Swift.Optional<Foundation.Data>, Alamofire.AFError>.success(nil)

1 Ответ

0 голосов
/ 22 марта 2020

На основе Документации Alamofire , чтобы загружать файлы / данные, вы должны использовать AF.upload(...) {...} вместо AF.request(...) {...}.

Я думаю, что вы должны изменить свой код загрузки to:

// Convert String to Data
//NOTE: this does NOT check text to be a valid JSON string.
let data = textView.text!.data(using: .utf8)!
let method: HTTPMethod = ... // Default value for `method` is `.post`.
let headers: HTTPHeaders = .../ If you have to set custom HTTP headers.

AF.upload(data, to: "http://localhost/cheerfulNutApache/swift.json", method: method, headers: headers)
  .validate()
  .response { (response) in

    ...

}

Если ваш метод запроса .post, и вам не нужно устанавливать HTTPHeaders, вы можете просто использовать это:

AF.upload(data, to: "http://localhost/cheerfulNutApache/swift.json")
    .validate()
    .response { (response) in

    ...

}

Отредактировано : второй аргумент метода upload должен называться to:. Также вы можете опустить установку method в .post, потому что значение по умолчанию для method равно .post.

...