Swiftでの個人開発アプリでHTTP通信にAlamofire5を使ってみています。
POST通信でパラメータをリクエストボディにセットして送信できるようにしたいと思いましたが、
特に意識しないとクエリパラメータとしてセットされるようで、
上記対応するための書き方が意外と見つからなかったのでメモとして残します。
Alamofireとは?導入手順は?あたりのハナシは割愛します。
サンプルコード
まずはいきなりコードから。
import Alamofire
class TestAlamofire{
// 送信先URL
let requestUrl = "https://test.com/post"
// リクエストパラメータ
let param: Parameters = [
"param1": "パラメータ1"
]
// リクエストヘッダ
let headers: HTTPHeaders = [
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"
]
func postRequest() {
// AlamofireでPOST送信
AF.request(
requestUrl,
method: .post,
parameters: param,
encoding: URLEncoding.httpBody,
headers: headers
)
.responseData { response in
switch response.result {
case .success(let data):
print("success")
case .failure(let error):
print("error")
}
}
}
}
要点
ポイント1:Content-Type=application/x-www-form-urlencoded にする。
// リクエストヘッダ
let headers: HTTPHeaders = [
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"
]
ポイント2:Alamofire.requestのencodingをURLEncoding.httpbodyにする。
AF.request(
requestUrl,
method: .post,
parameters: param,
encoding: URLEncoding.httpBody,
headers: headers
)
ポイント1の記述で一旦パラメータを「key1=value1&key2=value2...」のかたちにしたうえで、
ポイント2でそのパラメータをリクエストボディに(整形+)セットして送信、
という流れになってるんだと解釈しています。
(直感的には、ポイント1で”application/json”を指定するのが正しそうな感じがしたんですが)
最後に
手短ですが、AlamofireのPOSTリクエスト送信で、
リクエストボディにパラメータをセットする書き方でした。
encodingとheadersの組合せを色々試しましたがこれ以外うまくいかなかったので、
現状これが正解かなと思っています。
もし他の書き方があればぜひコメントでご指摘下さい。