如何在 Swift 中传递 HTTP Post 请求中的参数?

Bar*_*382 5 swift urlsession

我正在开发一个简单的 Swift 测试应用程序,它只调用我的服务器上的 Perl 脚本。现在我只想发送用户名和 ID,然后将它们返回到 JSON 响应中。没什么,我还在学习阶段。

但无论我尝试哪种方式,我都无法成功发送 URLRequest 中的两个参数。

在下面的示例中,您会看到我尝试在主 url 中发送它们,我尝试将它们添加为 forHTTPHeaderFields,但我在 URLSessionDataDelegate 中返回的响应始终是:

数据为 {"userid":"","username":""} JSON 可选({ userid = ""; username = "";

let file = File(link: "http://example.com/cgi-bin/swift.pl?username=John&userid=01", data: "hello")
uploadService.start(file: file)
Run Code Online (Sandbox Code Playgroud)

在我的 URLSession 实例中我尝试过:

// From one of my view controllers I create a File struct 
// from a YouTube lesson. Eventually I want to send a file. 
// So for now am using just *Hello*:

let uploadTask = UploadTask(file: file)
let url = URL(string: file.link)!
let uploadData = Data(file.data.utf8)
    
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField:"Content-Type")
    
request.addValue("application/json", forHTTPHeaderField: "Accept")
    
request.addValue("John", forHTTPHeaderField: "username")
request.addValue("01", forHTTPHeaderField: "userid")

uploadTask.task = uploadSession.uploadTask(with: request, from: uploadData)
uploadTask.task?.resume()
Run Code Online (Sandbox Code Playgroud)

Swift 测试的所有其他部分都有效,我在 URSessionDelegate 中收到响应和数据,并且没有错误。显然我只是不知道如何正确发送这两个参数。作为记录:

  • 下面的 Perl 脚本可以在 Linux 命令行中运行,或者从 Web 浏览器调用时运行。

  • 如果我在下面的 perl 脚本中硬编码返回响应,我会在 URLSessionDelegate 中收到它,所以我知道我正在正确解析它

  • 另外,我的服务器的错误日志显示 $header1 和 $header2 从未被初始化。

#!/usr/bin/perl -w
use strict;
use CGI;
use JSON;
my $q = new CGI;

my $header1 = $q->param("username");
my $header2 = $q->param("userid");

print $q->header('application/json');

my %out = (username=>"$header1", userid=>"$header2");

my $json = encode_json \%out;

print $json;
exit(0);

Run Code Online (Sandbox Code Playgroud)

atu*_*ltw 0

在这两行中:

request.addValue("John", forHTTPHeaderField: "username")
request.addValue("01", forHTTPHeaderField: "userid")
Run Code Online (Sandbox Code Playgroud)

您将它们添加为 http 标头而不是 url 查询参数。

要添加查询参数,需要先转换为 URLComponents,然后再转换回来: https: //developer.apple.com/documentation/foundation/urlcomponents

var urlComponents = URLComponents(string: file.link)!
urlComponents.queryItems = [
    URLQueryItem(name: "username", value: "name"),
    URLQueryItem(name: "userid", value: "id")
]

let newURL = urlComponents.url!

//use the newURL
Run Code Online (Sandbox Code Playgroud)