Edited at

Alamofire4でJsonをPOST、ファイルを multipart/form-data でPOST

More than 1 year has passed since last update.


Alamofire 4.0 で HTTP POST する

ググって出てくる Alamofire のコードは古いバージョンのものが多く出てくるので、

Alamofire 4.0 での HTTP POSTのやり方を整理しました

ハンドリングが簡単でめっちゃ使いやすいです


JSON を POST で送信

この例ではレスポンスをJsonオブジェクトとして受け取るために.responseJSON をレスポンスハンドラーにしてます


JSONをPOSTするサンプル

let url = "http://hoge/fuga"

let headers: HTTPHeaders = [
"name": "value"
]
let parameters: Parameters = [
"str_param": "str value",
"num_param": 0,
"nested": [
"nested_param": "value"
]
]

Alamofire.request(url,
method: .post,
parameters: parameters,
encoding: JSONEncoding.default,
headers: headers)
.authenticate(user: "user", password: "password")
.responseJSON { response in

if
let json = response.result.value as? [String: Any],
let prop1 = json["prop1"] as? String
{
debugPrint(prop1)
}

debugPrint(response)
}


レスポンスを文字列で受け取りたい時は、.responseStringを使いましょう

レスポンスを受け取りたい型に応じてハンドラーが用意されています

https://github.com/Alamofire/Alamofire#response-handling

複数のレスポンスハンドラーをチェーンさせて使うこともできます

https://github.com/Alamofire/Alamofire#chained-response-handlers


ファイルを multipart/form-data で POST

upload を使った場合は、request と違って送信途中の progress を取得できます

それ以外は request とほぼ同じです

ベースはJSONをPOSTする時と似た感じですが、データを送信する処理の前にファイルをエンコードした結果をコールバックで受け取る処理を挟む必要があるので、初めてだとちょっとだけわかりにくいです


multipart/form-dataでファイルをPOSTするサンプル

let fileContent = "file content as string"

let url = "http://hoge/fuga"
let headers: HTTPHeaders = [
"name": "value"
]

Alamofire.upload(
multipartFormData: { (multipartFormData) in
multipartFormData.append(fileContent.data(using: String.Encoding.utf8)!,
withName: "param_name",
fileName: "filename",
mimeType: "multipart/form-data")},
to: url,
headers: headers,
encodingCompletion: { encodingResult in
// file をエンコードした後のコールバック
switch encodingResult {
case .success(let upload, _, _):
// upload は request の戻り値の DataRequest を継承したオブジェクトなので
// request と同様にメソッドチェーンしたい項目はこの中で指定できます
upload
.authenticate(user: "user", password: "password")
.uploadProgress(closure: { (progress) in
print("Upload Progress: \(progress.fractionCompleted)")
})
.responseString { response in
debugPrint(response)
}
case .failure(let encodingError):
print(encodingError)
}
}
)