• Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Moya parameters with same key

비어있다 서버를 붙이는데

http://localhost:8081/api/beers?min_abv=5&max_abv=6&beer_style=TEST_STYLE_1&aroma=TEST_AROMA_4&cursor=10&max_count=100&sort_by=review_count_desc

이렇게… 여러 정보를 param으로 받지만 모든게 다 Optional인 case가 있었드랬다…

enum BeerListService {
    case getBeerList(minAbv: Int?, maxAbv: Int?, style: String?, scent: String?, cursor: Int?, maxCount: Int?, sort: Sort?)
}

그래서 저걸 보고 이렇게 case를 만들었었고,
얘가 있는지 없는지 ( nil인지 아닌지 ) 판단해서 params로 URL에 붙여줘야 했다.

params를 쓰니까 task는 .requestParameters 일거고,
.requestParameters

.requestParameters(parameters: <#T##[String : Any]#>, encoding: <#T##ParameterEncoding#>)

이렇게 생겼기 때문에 params를 [String : Any], 즉 딕셔너리 타입으로 넘겨주면 된다.

var task: Task {
        switch self {
        case .getBeerList(let minAbv, let maxAbv, let style, let scent, let cursor, let maxCount, let sort):
            
            var params: [String:Any] = [:]
            
            if let minAbv = minAbv {
                params["min_abv"] = minAbv
            }
            
            if let maxAbv = maxAbv {
                params["max_abv"] = maxAbv
            }
            
            if let beerStyle = style {
                params["beer_style"] = beerStyle
            }
            
            if let aroma = scent {
                params["aroma"] = aroma
            }
            
            if let cursor = cursor {
                params["cursor"] = cursor
            }
            
            if let maxCount = maxCount {
                params["max_count"] = maxCount
            }
            
            if let sort = sort {
                params["sort_by"] = sort
            }
        
            return .requestParameters(parameters: params, encoding: URLEncoding.queryString)
        }
    }

그래서 이렇게 각 매개변수의 nil 여부를 판단한 후, 키값이랑 value값을 잘 넣어줬다.
(그럼 params만 보내면 알아서 key-value params로 다 넣어준다)
(encoding: URLEncoding.queryString 이렇게 해주면 !!!)

근데 문제가 생겼다.,,,

aroma, county, beer_style 등의 key를 중복 사용해서 해당 조건을 or로   있습니다.  url에서는 beer_style이 중복 사용

중복으로 조건을 걸 수 있던거임…
근데 dictionary의 key값은 unique해야 해서 여러개의 params["beer_style"] 을 만들 수 없었다.

그럼 어떡하냐,, 그냥 String 말고 [String] 으로 넣어주면 알아서 잘 들어가더라..

enum BeerListService {
    case getBeerList(minAbv: Int?, maxAbv: Int?, style: [String]?, scent: [String]?, cursor: Int?, maxCount: Int?, sort: Sort?)
}

이렇게만 넘겨주면 string 배열의 style 변수 내에 있는 item들을 하나하나 query로 붙여서 날려준다.
편하고만,,~~