본문 바로가기

iOS/iOS

iOS) 서버와 데이터 통신을 위해 URLRequest 작성하기

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
    }
}

참고