Swift5如何提取API响应shortlink字段实现深度链接分享
问题说明
- 调用短链生成POST接口时,返回响应结构如下:
Success{ shortlink = pAHJt7; status = 200; }
- 核心需求:提取响应中的
shortlink字段值,拼接业务URL前缀后,基于深度链接(deep linking)机制实现内容分享。 - 当前已编写的POST请求代码仅能打印完整响应,未实现字段提取与后续分享逻辑,代码如下:
func postRequest(latitude:Double,longitude:Double) { guard let url = URL(string: "http://i.Mallangtech.com/api/Url") else{ return } var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/Json", forHTTPHeaderField: "Content-Type") let body:[String: AnyHashable] = [ "status": 200, "shortlink":"okko"] request.httpBody = try? JSONSerialization.data(withJSONObject: body, options: .fragmentsAllowed) //hiting api let task = URLSession.shared.dataTask(with: request) { data, _, Error in guard let data = data, Error == nil else { return } do{ let response = try JSONSerialization.jsonObject(with: data, options: .allowFragments) print("Success\(response)") } catch{ print (error) } } task.resume() }
实现方案
根据接口返回格式分两种场景处理:
场景1:接口返回标准JSON格式
你当前代码把解析结果存为了通用Any类型,无法直接读取字段,只需要将解析结果强转为[String: Any]类型的字典,即可安全提取对应字段,修改请求回调内的解析逻辑即可:
let task = URLSession.shared.dataTask(with: request) { data, _, error in guard let data = data, error == nil else { return } do{ // 强转响应为字典结构 guard let responseDict = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else { print("响应格式不符合预期") return } // 安全提取shortlink字段,校验类型为字符串 guard let shortLinkCode = responseDict["shortlink"] as? String else { print("shortlink字段不存在或类型错误") return } // 替换为你自己的业务分享前缀即可拼接成完整深度链接 let fullShareDeepLink = "你的业务URL前缀" + shortLinkCode // 在此处调用你的深度链接分享逻辑:比如传参给路由模块、调起系统分享面板等 } catch{ print (error) } }
注意:你当前代码里的POST请求body是写死的测试参数,实际调用时请替换为接口要求的真实入参,比如经纬度等业务字段。
场景2:接口返回非标准格式(即你打印出的带Success{}、等号赋值、分号结尾的格式)
这种格式不属于标准JSON,无法直接用JSONSerialization解析,需要将返回数据转为字符串后,通过正则匹配提取短链码,参考代码:
let task = URLSession.shared.dataTask(with: request) { data, _, error in guard let data = data, error == nil else { return } // 把返回数据转为UTF8字符串 guard let responseText = String(data: data, encoding: .utf8) else { print("响应转字符串失败") return } // 正则匹配shortlink = 到分号之间的短链内容 let matchPattern = "shortlink = ([a-zA-Z0-9]+);" guard let matchRegex = try? NSRegularExpression(pattern: matchPattern, options: []) else { return } let fullRange = NSRange(responseText.startIndex..., in: responseText) guard let matchResult = matchRegex.firstMatch(in: responseText, options: [], range: fullRange), let shortLinkRange = Range(matchResult.range(at: 1), in: responseText) else { print("未匹配到shortlink字段") return } let shortLinkCode = String(responseText[shortLinkRange]) // 拼接业务URL前缀生成深度链接 let fullShareDeepLink = "你的业务URL前缀" + shortLinkCode // 在此处执行后续深度链接分享逻辑 }
内容的提问来源于stack exchange,提问作者Muhammad Mustafeez Ur Rehman
相关产品推荐
相关产品推荐

