IOS。 URL中的屏蔽符号

时间:2017-07-17 08:48:32

标签: ios xcode url swift3

我需要向服务器发送请求并获得响应。

我有以下网址:

http://192.168.200.10:9044/api/tables/?filter= {" open_visible":真,"与":假}

对于我使用Alamofire的查询。以下是我如何做的一些方法:

1)

class func getTables(completion: @escaping (_ response : DataResponse<TablesResponse>) -> Void) {
    SVProgressHUD.show()
    let getTablesPath = apiEntryPoint + "tables/?filter={\"open_visible\":true,\"related\":false}"

    Alamofire.request(getTablesPath)
        .validate()
        .responseObject { (response: DataResponse<TablesResponse>) in
            SVProgressHUD.dismiss()
            completion(response)
    }
}

我收到错误:screenshot

2)

class func getTables(completion: @escaping (_ response : DataResponse<TablesResponse>) -> Void) {
    SVProgressHUD.show()
    let getTablesPath = apiEntryPoint + "tables/?filter={%22open_visible%22:true,%22related%22:false}"

    Alamofire.request(getTablesPath)
        .validate()
        .responseObject { (response: DataResponse<TablesResponse>) in
            SVProgressHUD.dismiss()
            completion(response)
    }
}

我收到了错误。

3)

class func getTables(completion: @escaping (_ response : DataResponse<TablesResponse>) -> Void) {
    SVProgressHUD.show()
    var getTablesPath = apiEntryPoint + "tables/?filter="

    let jsonParameters = ["open_visible":true, "related":false]
    if let json = try? JSONSerialization.data(withJSONObject: jsonParameters, options: []) {
        if let content = String(data: json, encoding: .utf8) {
            getTablesPath += content
        }
    }

    Alamofire.request(getTablesPath)
        .validate()
        .responseObject { (response: DataResponse<TablesResponse>) in
            SVProgressHUD.dismiss()
            completion(response)
    }
}

我收到了错误。

4)

class func getTables(completion: @escaping (_ response : DataResponse<TablesResponse>) -> Void) {
    SVProgressHUD.show()
    let getTablesPath = apiEntryPoint + "tables/"

    Alamofire.request(getTablesPath, parameters: ["open_visible":true, "related":false])
        .validate()
        .responseObject { (response: DataResponse<TablesResponse>) in
            SVProgressHUD.dismiss()
            completion(response)
    }
}

我得到了所有桌子。不考虑所需的参数。这很糟糕。

问题

我可以发送服务器请求,考虑必要的参数。

2 个答案:

答案 0 :(得分:1)

尝试

let urlParameters = yourParametersString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())

因为您无法在网址

中传递{}个字符

答案 1 :(得分:0)

您可以使用请求参数以方便用户使用。 将您的所有请求数据放入NSDictionary并将其发送到服务器。

let parameters: NSDictionary = [
    "YOUR_KEY": YOUR_VALUE,
]

// Both calls are equivalent
Alamofire.request(YOUR_SERVER_ULR, method: .post, parameters: parameters, encoding: JSONEncoding.default)
Alamofire.request(YOUR_SERVER_ULR, method: .post, parameters: parameters, encoding: JSONEncoding(options: []))

另一种方法是,如果你将一些特殊字符传递给你的问题参数,那么你已经对URL进行了编码。

let URL = YOUR_FINAL_URL_TO_SERVER.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())

您可以查看Apple Document了解更多详情。