【问题标题】:Alamofire returns invalid url, when building an url from json string从 json 字符串构建 url 时,Alamofire 返回无效的 url
【发布时间】:2018-07-18 22:56:33
【问题描述】:

Alamofire 返回一个无效的 URL

我正在使用以下代码形成一个用于搜索的 URL 字符串 (urlStrForCustSearch)

URL_CUSTOMER_SEARCH = "http://pos1domain.mobi/pos/SV_IOS.asmx/IosJasonToDatatbl":

    let customerJson = [[
                        "customer_id":nil,
                        "tel":1234567,
                        "email":nil,
                        "addr":nil,
                        "history":nil]]

    do{
        let JSONData = try JSONSerialization.data(withJSONObject: customerJson, options: [])
        let JSONText = String(data: JSONData,
                              encoding: .utf8)!

        let urlStrForCustSearch = URL_CUSTOMER_SEARCH+"?jsonText=\(JSONText)&funname=GET_MM_CUSTOMER_DTL_LST"
        print(urlStrForCustSearch)

        Alamofire.request(urlStrForCustSearch, method: .post, parameters: [:], encoding: URLEncoding.default, headers: [:]).responseString { response in
            if response.result.isSuccess {
                print("Response is success")

            }else{
                print("Response Failed")
                print("Reason : \(response)")
            }
        }

    }catch{
        print("Cannot parse the dictionary")
    }

控制台打印所需的网址

正确的网址:

http://pos1domain.mobi/pos/SV_IOS.asmx/IosJasonToDatatbl?jsonText=[{"tel":1234567,"email":null,"history":null,"customer_id":null,"addr":null}]&funname=GET_MM_CUSTOMER_DTL_LST

但是在将urlStrForCustSearch 字符串作为参数传递给 Alamofire 时,Alamofire 返回无效 URL

响应失败
原因:FAILURE: invalidURL("http://pos1domain.mobi/pos/SV_IOS.asmx/IosJasonToDatatbl?jsonText=[{\"tel\":1234567,\"email\":null,\"history\":null,\"customer_id\":null,\"addr\":null }]&funname=GET_MM_CUSTOMER_DTL_LST")

我们可以看到 '\' 被添加到 url 字符串中
谁能帮我创建没有'\'字符串的url字符串

如果需要任何输入,请告诉我。

【问题讨论】:

    标签: json swift string url alamofire


    【解决方案1】:

    反斜杠用于转义字符串中的特殊字符。

    如果您想在 Swift 中分配一个包含双引号的字符串变量,如下所示:

    let str = "They said "hi" when I walked in"
    

    Xcode 会在此处显示错误,因为您的字符串实际上以“他们说”结尾(打开和关闭双引号。

    要解决这个问题,您需要转义应该是字符串一部分的双引号,就像这样

    let str = "They said \"hi\" when I walked in"
    

    如果没有这个,你在 iOS 项目中的代码都会有问题,你的 API 也会有读取字符串的问题,这将是无效的。

    当在 URL 中使用特殊字符时,您可以使用百分比编码对字符串进行编码,它将特殊字符替换为浏览器可以理解的格式。如果您使用百分比编码转换完整的 url,它的可读性就不是很高:

    http%3A%2F%2Fpos1domain%2Emobi%2Fpos%2FSV%5FIOS%2Easmx%2FIosJasonToDatatbl%3FjsonText%3D%5B%7B%22tel%22%3A1234567%2C%22email%22%3Anull%2C%22history%22 %3Anull%2C%22customer%5Fid%22%3Anull%2C%22addr%22%3Anull%7D%5D%26funname%3DGET%5FMM%5FCUSTOMER%5FDTL%5FLST

    所以通常最好只对 URL 的查询字符串(GET 参数)进行编码。

    let baseUrlString = "http://pos1domain.mobi/pos/SV_IOS.asmx/IosJasonToDatatbl"
    let queryString = "?jsonText=[{\"tel\":1234567,\"email\":null,\"history\":null,\"customer_id\":null,\"addr\":null}]&funname=GET_MM_CUSTOMER_DTL_LST".addingPercentEncoding(withAllowedCharacters: .alphanumerics)!
    
    let urlString = baseUrlString + queryString
    print(urlString)
    

    输出:http://pos1domain.mobi/pos/SV_IOS.asmx/IosJasonToDatatbl%3FjsonText%3D%5B%7B%22tel%22%3A1234567%2C%22email%22%3Anull%2C%22history%22%3Anull%2C%22customer%5Fid%22%3Anull%2C%22addr%22%3Anull%7D%5D%26funname%3DGET%5FMM%5FCUSTOMER%5FDTL%5FLST

    更新 - 更好的解决方案

    我完全忘记了您使用的是 Alamofire,我正在解决您提到的字符串问题。 Alamofire 可以通过将参数传递给请求调用来自动为您处理编码。

    let parameters: Parameters = ["foo": "bar"]
    
    // All three of these calls are equivalent
    Alamofire.request("https://httpbin.org/get", parameters: parameters) // encoding defaults to `URLEncoding.default`
    Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding.default)
    

    【讨论】:

      【解决方案2】:

      感谢 Scriptable,

              let queryString = JSONText.addingPercentEncoding(withAllowedCharacters: .alphanumerics)!
      

      上面那行有所不同,它是“.get”方法。

              let JSONData = try JSONSerialization.data(withJSONObject: customerJson, options: [])
              let JSONText = String(data: JSONData,
                                    encoding: .utf8)!
              //Without this line we will get invalid url from alamofire
              let queryString = JSONText.addingPercentEncoding(withAllowedCharacters: .alphanumerics)!
      
              let urlStringForCust = URL_CUSTOMER_SEARCH+"?jsonText=\(queryString)&funname=GET_MM_CUSTOMER_DTL_LST"
              print(urlStringForCust)
      
              Alamofire.request(urlStringForCust, method: .get, parameters: [:], encoding: URLEncoding.default, headers: [:]).responseString { response in
                  if response.result.isSuccess {
      

      【讨论】:

        猜你喜欢
        • 2017-03-06
        • 1970-01-01
        • 1970-01-01
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        相关资源
        最近更新 更多