You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:03:28