从json字符串构建url时,Alamofire返回无效url
Alamofire返回无效的URL 我正在使用以下代码形成一个用于搜索的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_-
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 {