URL Encode Alamofire GET params with SwiftyJSON

后端 未结 1 680
情话喂你
情话喂你 2020-12-18 14:07

I am trying to have Alamofire send the following parameter in a GET request but it\'s sending gibberish:

filters={\"$and\":[{\"name\":{\"$bw\":\"duke\"},\"co         


        
相关标签:
1条回答
  • 2020-12-18 14:58

    By default Alamofire encodes the parameters using Parameter List in the POST body. Try changing the encoding to JSON. This way Alamofire will serialize the dictionary as a JSON string as you expect:

    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"}}
    

    Or using your code:

    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 ?? "")
            }
    }
    

    Gets the output:

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

    EDIT: URL-Encoded JSON in the GET parameters

    If you want to send a URL-Encoded JSON in the GET parameters you have to generate first the JSON string and then pass it as a string in your parameters dictionary:

    SWIFT 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 ?? "")
            }
    }
    

    SWIFT 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())
            }
    }
    

    SWIFT 3 and Alamofire 4.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
    }
    

    This generates a GET request with the following 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
    

    That URL-Decoded is:

    http://httpbin.org/post?KEY=my_key&filters={"$and":[{"name":{"$bw":"duke"},"country":"gb"}]}&limit=1
    
    0 讨论(0)
提交回复
热议问题