![](/img/trans.png)
[英]escaping CRLF in HTTP multipart/form-data content type (iOS)
[英]URLSessionDataTask - upload parameters with multipart/form-data content type
我想在这个 curl 示例中创建主体:
curl --location --request POST 'https://request.url' \
--header 'Authorization: Bearer xxx' \
--form 'name="Name"' \
--form 'data="[{\"text\": \"This is comment\", \"another\": \"Thomas\"}]"'
如何实现这一点并在URLRequest
中正确设置httpBody
?
我尝试了不同的方法,但似乎没有任何效果。 简单的:
let body = NSMutableData()
body.appendString("name=" request.name))
body.appendString("data=" + "[{\"text\": \"This is comment\", \"another\": \"Thomas\" }]"))
return Data(body)
然后我尝试预先准备: "Content-Disposition: form-data;"
. 或添加线路断路器。 似乎没有任何工作。
这行代码是 class 的一部分,可以帮助我处理请求。 让它工作的最简单方法是什么? 感谢帮助
身体就是身体。 标题是标题。 它没有被解析。 它按原样发送。
要添加 header,您将创建一个 NSMutableURLRequest(或者我猜在 Swift 中,它是 MutableURLRequest)并使用 -setValue:forHTTPHeaderField: 方法或任何与 ZAE832E9B5BDA2699DB45F3FA6 等效的 ZAE832E9B5BDA2699DB45F3FA6
对于特定请求,假设 curl 没有添加任何有意义的额外内容,则 Objective-C 代码将是:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://request.url"]];
request.HTTPMethod = @"POST";
// This next bit may not work. See explanation below.
request.setValue:@"Bearer xxx" forHTTPHeaderField:@"Authorization"];
request.setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
request.body = @"---------ThisIsABoundaryMarker\r\n"
"Content-Disposition: form-data; name=\"Name\"\r\n"
"\r\n"
"[{\"text\": \"This is comment\", \"another\": \"Thomas\"}]\r\n"
"---------ThisIsABoundaryMarker--\r\n";
然后像发送任何其他 NSURLRequest 一样发送它。
我不确定每个方法名称如何转换为 Swift 但这应该非常接近完全正确,尽管表单编码很难看,所以 YMMV。 :-)
但是,有一个警告。 在文档中明确禁止覆盖 Authorization 字段,因为在许多情况下,这会被踩到。 在您的情况下,您没有使用任何看起来像基于密码的身份验证或公钥身份验证的东西,所以不应该使用 AFAIK,但我认为值得一提,以防您稍后注意到文档的那部分并吓坏了.
当然,如果 macOS 本身支持该身份验证方案,它绝对可能会中断(可能以一种内置或后置的方式基于您链接到的 SDK 或人们希望的方式)。 记在脑子里。 如果您可以说服服务器管理员让您通过不同的 header(如 X-Authorization)并在服务器端使用重写规则重写 header,这可能会更安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.