Отправка объекта 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/¶ms=\(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))
Это просто фрагменты кода, поэтому вам придется разместить его в нужном месте:)