多部分表单上传和NSURLSession.uploadTaskWithRequest之间的区别

从networking编程的世界来看,我非常适合使用多部分表单请求来上传文件。 然而,在iOS中,我们有一个名为NSURLSession的方法,它的方法是uploadTaskWithRequest ,它似乎是调用来执行图像上传等的方法。

你能解释两种方法之间的差异, 多部分的forms上传 vs uploadTaskWithRequest ? 如果我已经有一个处理多部分表单上传的后端,我可能需要什么样的调整,以便它支持uploadTaskWithRequest

uploadTaskWithRequest简单地发送NSData ,文件或者stream作为请求的主体。 除此之外什么都不做。 它只是具有可以与后台会话一起使用的好处。

因此,如果您的Web服务需要multipart/form-data请求,则必须自己构build该请求(除非您使用AFNetworking或Alamofire之类的function来为您执行此操作)。 一旦你build立了这个请求,你可以使用dataTaskWithRequest (设置NSMutableURLRequestHTTPBody )或者uploadTaskWithRequest (在这种情况下你不需要设置HTTPBody ,而是把它作为uploadTaskWithRequest的参数提供)。

顺便说一下,像查尔斯这样的工具在这些情况下非常有用,让你观察幕后发生的事情。

file upload与multipart/form-data

使用multipart/form-data Content-type的第一种方法最初是在RFC 1867中定义的,然后转移到万维网联盟(World Wide Web Consortium),该联盟包括在HTML 4.0规范中,其中表单以HTML格式表示,通过HTTP和电子邮件发送。 当表格被用户填写后,表格被发送到服务器。 这种技术被浏览器和Web服务器广泛支持和使用。

然而, multipart/form-data也可以用于定义表单数据,而不是以HTML表示。 也就是说,您不一定需要Web浏览器或Web服务器。 RFC 7578 (formsIETF)可以被各种各样的应用程序使用并通过多种协议传输的当前规范。

但是,必须提到的是, multipart/form-data内容types并不总是/不是没有问题的。 这本身就相当复杂。 此外,它还使用/引用了很多其他的RFC,并且由于清理的结果,它和那些依赖的RFC已经被更改,废弃和更新频繁。 由于其复杂性,序列化程序和parsing器也变得相当复杂,并且存在大量的bug和其他问题的空间。

NSURLSession uploadTaskWithRequest

如何NSURLSession组成一个请求没有被精确logging。 但是它当然不使用multipart/form-data内容types。

对于上传任务, NSURLSession使用带有NSURLRequest参数的POST请求,您可以自己进行设置。 也就是说,您可以select设置内容types(例如text/plain; charset=utf-8)和其他标题。 NSURLSession也可以从给定的内容(文件,stream或NSData)派生适当的内容types本身。 也就是说,我们可以说,它变成了一个“简单”的POST请求。 由于复杂程度较低,请求不那么麻烦。

所以,为了让你的服​​务器支持一个uploadTaskWithRequest文件应该上传的地方,它应该简单地支持一些POSTtypes的简单内容。 也就是说,与具有包含处理头中的文件名的multipart/form-data内容types的“文件上载”相反,服务器将需要返回资源(文件)已经位于的位置的URL写到。