Отправка объекта JSON в GET-запросе в Swift в Alamofire

Я пытаюсь выполнить запрос GET с привязанным к нему объектом json, это как я сгенерировал объект JSON

   let jsonObject: [String: AnyObject] = [

        "ean_code": [
            "type": "match",
            "value": "16743799"
        ]
    ]

и тогда я выполнил запрос

как это

        Alamofire.request(.GET,Constant.WebClient.WS_URL + "/product?filters="+String(jsonObject),parameters:parameters)

но это дало мне ошибку, которая не может связать URL с недопустимым символом

так что я закодировал URL из этого

let request = String(jsonObject).stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPasswordAllowedCharacterSet())!

это закодирует URL, но я снова это даст мне следующую ошибку

Запрос не выполнен с ошибкой: Ошибка Domain=NSCocoaErrorDomain Code=3840 "Недопустимое значение вокруг символа 0." UserInfo = {NSDebugDescription = Недопустимое значение вокруг символа 0.}

поэтому мой вопрос, как я могу связать объект JSON с GET URL??

3 ответа

Решение

Сделать что-то подобное

let parameters: [String: AnyObject] = [

    "filters": "merchantName",
    "ean_code": [
        "type": "match",
        "value": "16743799"
    ]
]

do {
    let data = try NSJSONSerialization.dataWithJSONObject(parameters, options: .PrettyPrinted)
    let jsonString = NSString(data: data, encoding: NSUTF8StringEncoding)
    let urlEncodedJson = jsonString!.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
    let urlString = "http://www.filter.com/&params=\(urlEncodedJson!)"
    let url = NSURL(string: urlString)
    // Trigger alaomofire request with url
}
catch let JSONError as NSError {
    print("\(JSONError)")
}

Похоже, вы пытаетесь добавить параметры запроса двумя способами:

  • Добавление параметра в конец вашей строки URL
  • Передав параметры в запрос Alamofire

Как вы делаете GET В любом случае, все ваши параметры должны быть закодированы в виде URL, поскольку запросы GET не должны иметь тела. Почему бы вам просто не добавить свой filters запрос в параметры?

let parameters: [String: AnyObject] = [

    "ean_code": [
        "type": "match",
        "value": "16743799"
    ]
]

Alamofire.request(.GET, Constant.WebClient.WS_URL + "/product", parameters: parameters)

Пытаться:

func encode(json: [String: AnyObject]) -> NSMutableURLRequest {
    let request: NSMutableURLRequest = ...
    if let URLComponents = NSURLComponents(URL: request.URL!, resolvingAgainstBaseURL: false) {
    let percentEncodedQuery = (URLComponents.percentEncodedQuery.map { $0 + "&" } ?? "") + query(json)
    URLComponents.percentEncodedQuery = percentEncodedQuery
    request.URL = URLComponents.URL
    return request
}

func query(parameters: [String: AnyObject]?) -> String {
    guard let parameters = parameters else {
        return ""
    }
    var components: [(String, String)] = []

    for key in parameters.keys.sort(<) {
        let value = parameters[key]!
        components += queryComponents(key, value)
    }

    return (components.map { "\($0)=\($1)" } as [String]).joinWithSeparator("&")
}

func queryComponents(key: String, _ value: AnyObject) -> [(String, String)] {
    var components: [(String, String)] = []

    if let dictionary = value as? [String: AnyObject] {
        for (nestedKey, value) in dictionary {
            components += queryComponents("\(key)[\(nestedKey)]", value)
        }
    } else if let array = value as? [AnyObject] {
        for value in array {
            components += queryComponents("\(key)[]", value)
        }
    } else {
        components.append((key, "\(value)"))
    }

    return components
}

Используйте это как:

Alamofire.request(encode(json))

Это просто фрагменты кода, поэтому вам придется разместить его в нужном месте:)

Другие вопросы по тегам