Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从json字符串构建url时,Alamofire返回无效url_Json_Swift_String_Url_Alamofire - Fatal编程技术网

从json字符串构建url时,Alamofire返回无效url

从json字符串构建url时,Alamofire返回无效url,json,swift,string,url,alamofire,Json,Swift,String,Url,Alamofire,Alamofire返回无效的URL 我正在使用以下代码形成一个用于搜索的URL字符串(urlStrForCustSearch) 和URL\u客户搜索=”http://pos1domain.mobi/pos/SV_IOS.asmx/IosJasonToDatatbl“: 控制台打印所需的url RightURL: {“tel”:1234567,“email”:null,“history”:null,“customer_id”:null,“addr”:null}]&funname=GET_-MM_-

Alamofire返回无效的URL

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

URL\u客户搜索=”http://pos1domain.mobi/pos/SV_IOS.asmx/IosJasonToDatatbl“

控制台打印所需的url

RightURL:

{“tel”:1234567,“email”:null,“history”:null,“customer_id”:null,“addr”:null}]&funname=GET_-MM_-customer\u-DTL\LST

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

响应失败
原因:失败:invalidURL(“{\'tel\':1234567,\'email\':null,\'history\':null,\'customer\u id\':null,\'addr\':null}]&funname=GET\u MM\u customer\u DTL\u LST”)

正如我们所看到的,在url字符串中添加了“\”
有人能帮我创建不带“\”字符串的url字符串吗


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

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

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

let str = "They said "hi" when I walked in"
Xcode会在这里显示一个错误,因为您的字符串实际上以“Themessaid”(打开和关闭的双引号)结尾

为了解决这个问题,需要对字符串中的双引号进行转义,如下所示

let str = "They said \"hi\" when I walked in"
如果没有这一点,iOS项目中的代码和API在读取字符串时都会出现问题,这将是无效的

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

http%3A%2F%2fos1Domain%2Emobi%2fos%2FSV%5FIOS%2asmx%2iosjasontodatatbl%3FjsonText%3D%5B%7B%22tel%22%3A1234567%2C%22email%22%3Anull%2C%22history%22%3Anull%22customer%5Fid%22addr%22%3Anull%7D%5D%26funname%3get%5FMM%5fccustomer%5FDTL%5FLST

因此,通常最好只对URL的查询字符串(GET params)进行编码

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)
输出:

更新-更好的解决方案

我完全忘记了您正在使用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)
谢谢你的剧本

        let queryString = JSONText.addingPercentEncoding(withAllowedCharacters: .alphanumerics)!
上面的一行造成了不同,它是“.get”方法

        let queryString = JSONText.addingPercentEncoding(withAllowedCharacters: .alphanumerics)!
        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 {