【问题标题】:swift URLRequest doesn't send parametersswift URLRequest 不发送参数
【发布时间】:2026-02-04 12:30:02
【问题描述】:

在下面的代码中

    let bodyData = "?sub=\(id)&name=User&email=test@test.com"
    let url = NSURL(string: "https://httpbin.org/get");
    let request:NSMutableURLRequest = NSMutableURLRequest(url:url as! URL)
    request.httpMethod = "GET"
    request.httpBody = bodyData.data(using: String.Encoding.utf8);
    NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: OperationQueue.main)
    {
        (response, data, error) in
        if let HTTPResponse = response as? HTTPURLResponse {
            let statusCode = HTTPResponse.statusCode

            if statusCode == 200 {
                // Yes, Do something. 
                let json = try? JSONSerialization.jsonObject(with: data!, options: [])
                if let dictionary = json as? [String: Any] {
                    let args = dictionary["args"]
                    NSLog("args:\(args)")
                    for (key, value) in dictionary{
                        NSLog("key:\(key) value:\(value)")
                    }
                }
            }
        }
    }

id 是传入函数的字符串。

它返回了有效数据,但测试站点/url 也以 json 格式返回您发送的任何参数。但是这段 sn-p 代码似乎没有发送 bodyData 中定义的查询参数,我不知道为什么。

【问题讨论】:

  • JSON *对象必须是数组或字典,您需要使用 JSONSerialization 从中获取 JSON 数据。你应该使用 URL 而不是 NSURL 和 URLRequest 而不是 NSURLReques。如果您需要可变请求,请将 URLRequest 声明为变量。
  • 感谢您的快速回复。事实证明,GET 方法不会将查询参数附加到 URL。因此,在创建请求时,参数需要成为 URL 的一部分。
  • 是的,我没有注意到您使用的是 get 而不是 post。您可以使用 URLComponents

标签: swift nsurlrequest


【解决方案1】:

如果使用 GET 请求,则将参数附加到 URL 中,根本不需要显式的 URLRequest

此代码是原生 Swift 3 并使用现代 API:

let id = 12

let bodyData = "?sub=\(id)&name=User&email=test@test.com"
let url = URL(string: "https://httpbin.org/get" + bodyData)!

URLSession.shared.dataTask(with: url) { (data, response, error) in

    if error != nil  {
        print(error!)
        return
    }

    do {
       if let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:Any],
          let args = json["args"] as? [String:Any] {
            print("args:\(args)")
            for (key, value) in args{
                print("key:\(key) value:\(value)")
            }
        }
    } catch {
        print(error)
    }
}.resume()

【讨论】:

  • 将查询参数附加到 URL 有效,但上面的代码没有为我编译。 dataTask 导致错误。
  • 我在 Swift 3 Playground 中成功地测试了这段代码。使用没有 NS 的原生 Swift 结构
最近更新 更多