cURL 与 Alamofire - Swift - multipart/form-data
cURL with Alamofire - Swift - multipart/form-data
首先,如果这个问题很愚蠢,我很抱歉,但我对这个东西还很陌生。我尝试了不同的方法来使用 Alamofire 创建与此 cURL 请求等效的 swift,但我不知道如何将图像作为 multipart/form-data 发送到 API.
curl -X POST -F "file=@/Users/nicolas/sample.png" -F "mode=document_photo" https://api.idolondemand.com/1/api/sync/ocrdocument/v1 -F "apikey=xxx-xxx-xxx-xxx-xxx"
我认为当前代码对于此类请求来说是错误的,但我仍然会 post 为您提供:
func getOCR(image: UIImage) {
let url = "https://api.idolondemand.com/1/api/sync/ocrdocument/v1"
let apiKey = "xxx-xxx-xxx-xxx-xxx"
let imageData = UIImagePNGRepresentation(image)
Alamofire.request(.POST, url, parameters: ["apikey": apiKey, "file": imageData!]).responseJSON() {
_,_,JSON in
print(JSON)
}
}
到目前为止,它对我有用的唯一方法是使用 URL,但是由于我尝试将用户用相机拍摄的图像发送到服务器,所以我只能发送图像文件。
URL代码:
func test(url: NSURL) {
let url = "https://api.idolondemand.com/1/api/sync/ocrdocument/v1"
let apiKey = "xxx-xxx-xxx-xxx-xxx"
Alamofire.request(.POST, url, parameters: ["apikey": apiKey, "url": url]).responseJSON() {
_,JSON,_ in
print(JSON)
}
}
如果我得到回复我会很高兴,因为这让我发疯。
ps。我正在使用 swift 2.0
Alamofire 在他们的 documentation 中有一个使用 Alamofire.upload(_:URLString:headers:multipartFormData:encodingMemoryThreshold:encodingCompletion:)
的示例,看起来它会回答您的问题(请注意,在他们的示例中,headers
和 encodingMemoryThreshold
参数如果您不提供默认值)。
另请参阅他们关于 MultipartFormData class 实例上的各种 appendBodyPart()
方法的文档。
因此,可以修改您提供的示例代码的方法可能是:
func getOCR(image: UIImage) {
let url = "https://api.idolondemand.com/1/api/sync/ocrdocument/v1"
let apiKey = "xxx-xxx-xxx-xxx-xxx"
let mode = "document_photo"
let imageData = UIImagePNGRepresentation(image)
Alamofire.upload(
.POST,
URLString: url,
multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(
data: apiKey.dataUsingEncoding(NSUTF8StringEncoding)!,
name: "apikey"
)
multipartFormData.appendBodyPart(
data: mode.dataUsingEncoding(NSUTF8StringEncoding)!,
name: "mode"
)
multipartFormData.appendBodyPart(
data: imageData!,
name: "file",
fileName: "testIMG.png",
mimeType: "image/png"
)
},
encodingCompletion: { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.responseJSON { _, _, JSON in println(JSON) }
case .Failure(let encodingError):
println(encodingError)
}
}
)
}
首先,如果这个问题很愚蠢,我很抱歉,但我对这个东西还很陌生。我尝试了不同的方法来使用 Alamofire 创建与此 cURL 请求等效的 swift,但我不知道如何将图像作为 multipart/form-data 发送到 API.
curl -X POST -F "file=@/Users/nicolas/sample.png" -F "mode=document_photo" https://api.idolondemand.com/1/api/sync/ocrdocument/v1 -F "apikey=xxx-xxx-xxx-xxx-xxx"
我认为当前代码对于此类请求来说是错误的,但我仍然会 post 为您提供:
func getOCR(image: UIImage) {
let url = "https://api.idolondemand.com/1/api/sync/ocrdocument/v1"
let apiKey = "xxx-xxx-xxx-xxx-xxx"
let imageData = UIImagePNGRepresentation(image)
Alamofire.request(.POST, url, parameters: ["apikey": apiKey, "file": imageData!]).responseJSON() {
_,_,JSON in
print(JSON)
}
}
到目前为止,它对我有用的唯一方法是使用 URL,但是由于我尝试将用户用相机拍摄的图像发送到服务器,所以我只能发送图像文件。
URL代码:
func test(url: NSURL) {
let url = "https://api.idolondemand.com/1/api/sync/ocrdocument/v1"
let apiKey = "xxx-xxx-xxx-xxx-xxx"
Alamofire.request(.POST, url, parameters: ["apikey": apiKey, "url": url]).responseJSON() {
_,JSON,_ in
print(JSON)
}
}
如果我得到回复我会很高兴,因为这让我发疯。
ps。我正在使用 swift 2.0
Alamofire 在他们的 documentation 中有一个使用 Alamofire.upload(_:URLString:headers:multipartFormData:encodingMemoryThreshold:encodingCompletion:)
的示例,看起来它会回答您的问题(请注意,在他们的示例中,headers
和 encodingMemoryThreshold
参数如果您不提供默认值)。
另请参阅他们关于 MultipartFormData class 实例上的各种 appendBodyPart()
方法的文档。
因此,可以修改您提供的示例代码的方法可能是:
func getOCR(image: UIImage) {
let url = "https://api.idolondemand.com/1/api/sync/ocrdocument/v1"
let apiKey = "xxx-xxx-xxx-xxx-xxx"
let mode = "document_photo"
let imageData = UIImagePNGRepresentation(image)
Alamofire.upload(
.POST,
URLString: url,
multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(
data: apiKey.dataUsingEncoding(NSUTF8StringEncoding)!,
name: "apikey"
)
multipartFormData.appendBodyPart(
data: mode.dataUsingEncoding(NSUTF8StringEncoding)!,
name: "mode"
)
multipartFormData.appendBodyPart(
data: imageData!,
name: "file",
fileName: "testIMG.png",
mimeType: "image/png"
)
},
encodingCompletion: { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.responseJSON { _, _, JSON in println(JSON) }
case .Failure(let encodingError):
println(encodingError)
}
}
)
}