2015-09-15 3 views
2

Я пытаюсь иметь Alamofire отправить следующий параметр в запросе GET, но он посылает тарабарщину:URL Encode Alamofire GET Params с SwiftyJSON

filters={"$and":[{"name":{"$bw":"duke"},"country":"gb"}]} 
//www.example.com/example?filters={"$and":[{"name":{"$bw":"duke"},"country":"gb"}]} 
//Obviously URL encoded 

Это мой код:

let jsonObject = ["$and":[["name":["$bw":string], "country":"gb"]]] 
let json = JSON(jsonObject) 
print(json) 

выходы

{ "$ и": [{ "название": { "$ м.т.": "Герцог" }, "страна": "гб" } ] }

Это мой запрос Титулы:

let params = ["filters" : json.rawValue, "limit":"1", "KEY":"my_key"] 

Это то, что AlamoFire является отправка:

KEY=my_key& 
filters[$and][][country]=gb& 
filters[$and][][name][$bw]=duke& 
limit=1 

Как вы видите, параметр фильтра является полным беспорядком. Что я делаю не так?

+0

Вы можете скопировать здесь, как вы используете Alamofire отправить этот запрос ? Разве этот запрос не отправляется с использованием GET? Может быть, вы можете попробовать с помощью метода POST? – tgebarowski

+0

Это должно быть. Я использую '.request (.GET, url, params)' – Mika

ответ

14

По умолчанию Alamofire кодирует параметры, используя список параметров в теле POST. Попробуйте изменить кодировку на JSON. Таким образом Alamofire будет сериализовать словаря в виде строки JSON, как вы ожидаете:

let parameters = [ 
    "foo": [1,2,3], 
    "bar": [ 
     "baz": "qux" 
    ] 
] 

Alamofire.request(.POST, "http://httpbin.org/post", parameters: parameters, encoding: .JSON) 
// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}} 

Или используя код:

let string = "duke" 
let jsonObject = ["$and":[["name":["$bw":string], "country":"gb"]]] 
let json = JSON(jsonObject) 
let params = ["filters" : json.rawValue, "limit":"1", "KEY":"my_key"] 

Alamofire.request(.POST, "http://httpbin.org/post", parameters: params, encoding: .JSON) 
    .responseString(encoding: NSUTF8StringEncoding) { request, response, content, error in 
     NSLog("Request: %@ - %@\n%@", request.HTTPMethod!, request.URL!, request.HTTPBody.map { body in NSString(data: body, encoding: NSUTF8StringEncoding) ?? "" } ?? "") 
     if let response = response { 
      NSLog("Response: %@\n%@", response, content ?? "") 
     } 
} 

получает выход:

Request: POST - http://httpbin.org/post 
{"filters":{"$and":[{"name":{"$bw":"duke"},"country":"gb"}]},"limit":"1","KEY":"my_key"} 

EDIT : URL-кодированный JSON в параметрах GET

Если вы хотите отправить URL с кодировкой JSON в параметрах GET вы должны сначала создать строку JSON, а затем передать его в виде строки словаря параметров:

СВИФТ 1

let string = "duke" 
let jsonObject = ["$and":[["name":["$bw":string], "country":"gb"]]] 
let json = JSON(jsonObject) 

// Generate the string representation of the JSON value 
let jsonString = json.rawString(encoding: NSUTF8StringEncoding, options: nil)! 
let params = ["filters" : jsonString, "limit": "1", "KEY": "my_key"] 


Alamofire.request(.GET, "http://httpbin.org/post", parameters: params) 
    .responseString(encoding: NSUTF8StringEncoding) { request, response, content, error in 
     NSLog("Request: %@ - %@\n%@", request.HTTPMethod!, request.URL!, request.HTTPBody.map { body in NSString(data: body, encoding: NSUTF8StringEncoding) ?? "" } ?? "") 
     if let response = response { 
      NSLog("Response: %@\n%@", response, content ?? "") 
     } 
} 

СВИФТ 2

let string = "duke" 
let jsonObject = ["$and":[["name":["$bw":string], "country":"gb"]]] 
let json = JSON(jsonObject) 

// Generate the string representation of the JSON value 
let jsonString = json.rawString(NSUTF8StringEncoding)! 
let params = ["filters" : jsonString, "limit": "1", "KEY": "my_key"] 

Alamofire.request(.GET, "http://httpbin.org/post", parameters: params) 
    .responseString(encoding: NSUTF8StringEncoding) { request, response, result in 
     NSLog("Request: %@ - %@\n%@", request!.HTTPMethod!, request!.URL!, request!.HTTPBody.map { body in NSString(data: body, encoding: NSUTF8StringEncoding) ?? "" } ?? "") 
     switch result { 
     case .Success(let value): 
      NSLog("Response with content: %@", value) 
     case .Failure(let data, _): 
      NSLog("Response with error: %@", data ?? NSData()) 
     } 
} 

СВИФТ 3 и 4 Alamofire.0

let string = "duke" 
let jsonObject = ["$and":[["name":["$bw":string], "country":"gb"]]] 
let json = JSON(jsonObject) 

// Generate the string representation of the JSON value 
let jsonString = json.rawString(.utf8)! 
let params = ["filters" : jsonString, "limit": "1", "KEY": "my_key"] 

Alamofire.request("http://httpbin.org/post", method: .get, parameters: params) 
    .responseString { response in 
     #if DEBUG 
      let request = response.request 
      NSLog("Request: \(request!.httpMethod!) - \(request!.url!.absoluteString)\n\(request!.httpBody.map { body in String(data: body, encoding: .utf8) ?? "" } ?? "")") 
      switch response.result { 
      case .success(let value): 
       print("Response with content \(value)") 
      case .failure(let error): 
       print("Response with error: \(error as NSError): \(response.data ?? Data())") 
      } 
     #endif 
} 

Это генерирует запрос GET с помощью следующего URL:

http://httpbin.org/post?KEY=my_key&filters=%7B%22%24and%22%3A%5B%7B%22name%22%3A%7B%22%24bw%22%3A%22duke%22%7D%2C%22country%22%3A%22gb%22%7D%5D%7D&limit=1 

Этот URL-декодированию:

http://httpbin.org/post?KEY=my_key&filters={"$and":[{"name":{"$bw":"duke"},"country":"gb"}]}&limit=1 
+0

Спасибо (и я должен был указать в вопросе извините за это), но мне нужно сделать запрос на получение. Также он должен выглядеть так: «filters»: «{" $ and ": [{" name ": {" $ bw ":" duke "}," country ":" gb "}]}", "limit ":" 1 "," KEY ":" my_key ".... Не уверен, кто написал этот API в первую очередь ... Я сделаю это более ясным в вопросе. – Mika

+0

Итак, вы хотите, чтобы строка JSON как параметр URL-Encoded в URL GET. Это полностью меняет вопрос. Взгляните на мое редактирование, чтобы узнать, соответствует ли это вашим потребностям. – redent84

+0

Спасибо, что отлично! Единственное, что мне пришлось изменить: «let jsonString = json.rawString (NSUTF8StringEncoding, options: .PrettyPrinted)!», Поскольку вы не можете предоставить «nil», а первый ярлык - посторонним. Я отредактирую его и отредактирую вопрос, чтобы сделать его более понятным для других. – Mika

Смежные вопросы