Json으로 Post하기
URLRequest
생성시 기본 헤더는Json
이 아닙니다!
Network API
통신을 하여 데이터를 외부 서버로 전송할 때 보통 json 형식으로 인코딩하여 보냅니다.
MongoDB
로 Json 데이터를 전송하는데 데이터가 계속 이상하게 보내졌습니다.
{
"name" : "playlistViewed",
"createdAt" : "2020-12-16T15:43:07.294+0900",
"metadata" : {
"from" : "today"
}
}
보내고자 했던 형식은 위와 같은데 자꾸 보내지는 데이터는 아래와 같았습니다.
{
"\"name\":\"playlistViewed\",\"createdAt\":\"2020-12-16T15:43:07.294+0900\",\"metadata\":{\"from\":\"today\"}" : ""
}
괜히 엄한 서버 살펴보다 다음과 같은 메세지를 발견했습니다. 🤭🤦♀️
{
host: '127.0.0.1:4000',
'content-type': 'application/x-www-form-urlencoded',
connection: 'keep-alive',
accept: '*/*',
'user-agent': 'MiniVibe/1 CFNetwork/1197 Darwin/19.6.0',
'accept-language': 'en-us',
'content-length': '22',
'accept-encoding': 'gzip, deflate'
}
아니...URLRequest
의 기본 헤더가 json
이 아니었다니...😠
당연히 기본이 json
인 줄 알았는데 저게 문제였습니다.
헤더를 ["Content-Type": "application/json"]
로 변경했더니 원하는 대로 보내졌습니다.
URLRequest
생성시 기본 헤더는Json
이 아닙니다!
Code
코드는 다음과 같습니다.
헤더는 default로 ["Content-Type": "application/json"]
으로 지정하였고 파라미터로 넘겨줘서 변경 가능하도록 했습니다.
import Foundation
enum NetworkMethod: String {
case get
case post
case put
case patch
case delete
}
struct RequestBuilder {
private let url: URL?
private let method: NetworkMethod
private let body: Data?
private let headers: [String: String]
init(url: URL?,
method: NetworkMethod,
body: Data? = nil,
headers: [String: String] = ["Content-Type": "application/json"]) {
self.url = url
self.method = method
self.body = body
self.headers = headers
}
func create() -> URLRequest? {
guard let url = url else { return nil }
var request = URLRequest(url: url)
request.httpMethod = method.rawValue.uppercased()
if let body = body {
request.httpBody = body
}
request.allHTTPHeaderFields = headers
return request
}
}
참고
'iOS > iOS' 카테고리의 다른 글
iOS) SwiftLint 적용하기 - CocoaPods (0) | 2021.01.13 |
---|---|
iOS) gitignore 적용하기 (0) | 2021.01.13 |
iOS) CoreData - Migration (1) | 2020.12.15 |
iOS) Build input file cannot be found 에러 해결 (0) | 2020.11.07 |
iOS) NavigationBar의 Border 지우기 (0) | 2020.10.09 |