2016-08-18 48 views
4

我試圖執行與綁定到它JSON對象GET requst,我該如何生成的JSON對象發送JSON對象的GET請求迅速在Alamofire

let jsonObject: [String: AnyObject] = [ 

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

,然後我執行請求

這樣

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

但是這給了我一個錯誤,是canot網址綁定無效字符

,所以我編碼從這個

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

的URL,這將編碼的URL,但我又是這會給我下面的錯誤

Request failed with error: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}

所以我的問題是我怎麼可以綁定一個JSON對象來獲取網址?

+0

是對JSON總是在變化? – hariszaman

回答

1

做這樣的事情

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)") 
} 
+0

這工作謝謝:) –

+0

我仍然會說,不要發送json對象在url中,而是使用一個post/put請求來做到這一點。 – hariszaman

+0

我完全同意你的意見。但是後端從後臺開發並且似乎能夠在GET中發送參數, –

0

嘗試:

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

這只是代碼snipets,所以你必須把它放在適當的地方:)

+0

你是什麼意思的這條線?讓請求:NSMutableURLRequest = ... –

+0

我的意思是你必須創建該對象的路徑到您的後端服務。 –

0

它看起來像你正嘗試以兩種方式添加查詢參數:

  • 添加一個參數,以你們的末日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) 
+0

我已編輯該問題,請現在檢查,商家名稱不是正確的參數 –

+0

我已更新我的答案。你不需要'手動'追加參數到你的網址。參數參數被設計爲對參數進行編碼並且爲你做。 – tebs1200

+0

但是過濾器是什麼?它必須是,我是否應該把它呢? –