使用多行 Swift 字符串构建多部分表单数据不起作用

Building multipart form data with multiline Swift strings does not work

我有一个将多部分表单数据构建到 Swift String 中的函数,将该字符串转换为 Data,然后将该数据分配给我的变量 URLRequest' s httpBody 属性。当写成多行字符串时(内容是来自 UIImageJPEGRepresentation 的 JPEG UIImage 数据):

let body = """
--\(formDataBoundary)
Content-Disposition:form-data; name="file"; filename="image.jpeg"
Content-Type: image/jpeg

\(jpegData.base64EncodedString())

--\(formDataBoundary)--
"""

它不起作用,但通过多次追加组装而成:

var body = "--\(formDataBoundary)\r\n"
body += "Content-Disposition:form-data; name=\"file\"; filename=\"image.jpeg\"\r\n"
body += "Content-Type: image/jpeg\r\n\r\n"
body += "\(jpegData.base64EncodedString())\r\n\r\n"
body += "--\(formDataBoundary)--"

确实如此。有没有人解释为什么?我只对这两个实现进行评论,这就是我 URLSessionDataTask 的成功或失败之间产生差异的原因。

HTTP 和 MIME header 行由 CRLF 对终止(回车符 return + 换行符,\r\n),这就是您在

中使用的内容
var body = "--\(formDataBoundary)\r\n"
// ...

Multi-line 字符串文字仅由换行符分隔, 您必须添加所需的 CR 字符:

let body = """
--\(formDataBoundary)\r
Content-Disposition:form-data; name="file"; filename="image.jpeg"\r
Content-Type: image/jpeg\r
\r
\(jpegData.base64EncodedString())\r
\r
--\(formDataBoundary)--\r
"""