Ximilar POST请求,带有图像URL和标题



我正在尝试运行一个post请求,将图像发送到ximilar应用程序。甚至不确定我的请求是否100%正确。每次我都得到相同的回复:

https://api.ximilar.com/recognition/v2/classify/ } { Status Code: 400, Headers {
"Content-Type" =     (
"application/json"
);
Date =     (
"Mon, 12 Apr 2021 04:02:58 GMT"
);
Server =     (
"nginx/1.16.1"
);
"Strict-Transport-Security" =     (
"max-age=31536000"
);
Vary =     (
"Accept, Origin"
);
allow =     (
"POST, OPTIONS"
);
"referrer-policy" =     (
"same-origin"
);
"x-content-type-options" =     (
nosniff
);
"x-frame-options" =     (
DENY
);
} }
{
records =     (
"Expected a list of items but got type "str"."
);
}

我的代码:(不确定正文值是否写对。(

let url = URL(string: "https://api.ximilar.com/recognition/v2/classify/")!
var request = URLRequest(url: url)

request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Token __MyTOKEN__", forHTTPHeaderField: "Authorization")

let body = [
"task_id" : "c03c288b-a249-4b17-9f63-974c2f30beb9",
"records" : "https://www.sticky.digital/wp-content/uploads/2013/11/img-6.jpg"
]
let bodyData = try? JSONSerialization.data(withJSONObject: body, options: [] )

request.httpMethod = "POST"
request.httpBody = bodyData

let session = URLSession.shared

session.dataTask(with: request) { (data, response, error) in
if let response = response {
print(response)
}
if let data = data {
do {
let json = try JSONSerialization.jsonObject(with: data, options: [])
print(json)
} catch {
print(error)
}
}
}.resume()

我希望能够在控制台中输出JSON响应。

以下是curl中运行良好的代码:

curl -H "Content-Type: application/json" -H "authorization: Token __API_TOKEN__" https://api.vize.ai/v2/classify -d '{"task_id": "0a8c8186-aee8-47c8-9eaf-348103feb14d", "version": 2, "descriptor": 0, "records": [ {"_url": "__IMAGE URL HERE__" } ] }'

服务器报告records:错误

应为项目列表,但得到的类型为";str";

据说它期望记录有一个项目数组,但只收到一个字符串。在curl中,records是一个带有单个关键字_url的字典数组,但在Swift中,该值只是一个字符串,与错误报告的内容一致。您还可以在curl中提供versiondescriptor,但在Swift示例中没有。

因此,您可以尝试:

let body: [String: Any] = [
"task_id" : "c03c288b-a249-4b17-9f63-974c2f30beb9",
"version": 2,
"descriptor": 0,
"records" : [
[
"_url": "https://www.sticky.digital/wp-content/uploads/2013/11/img-6.jpg"
]
]
]

或者,您可以定义Encodable类型,如编码和解码自定义类型:中所述

struct XimilarRequest: Encodable {
let taskId: String
let version: Int
let descriptor: Int
let records: [XimilarRecord]
}
struct XimilarRecord: Encodable {
let url: URL
enum CodingKeys: String, CodingKey {
case url = "_url"
}
}

然后你可以做:

let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
let imageUrl = URL(string: "https://www.sticky.digital/wp-content/uploads/2013/11/img-6.jpg")!
let ximilarRequest = XimilarRequest(
taskId: "c03c288b-a249-4b17-9f63-974c2f30beb9",
version: 2,
descriptor: 0,
records: [XimilarRecord(url: imageUrl)]
)
request.httpBody = try encoder.encode(ximilarRequest)

Hi这里有一个适用于您的示例(填充图像的Auth令牌和_url(:

import Foundation
let headers = [   "Content-Type": "application/json",   "authorization": "Token __API_TOKEN__" ] let parameters = [   "task_id": "0a8c8186-aee8-47c8-9eaf-348103feb14d",   "version": 2,   "records": [["_url": "__IMAGE URL HERE__"]] ] as [String : Any]
let postData = JSONSerialization.data(withJSONObject: parameters, options: [])
let request = NSMutableURLRequest(url: NSURL(string: "https://api.ximilar.com/recognition/v2/classify")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data
let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in   if (error != nil) {
print(error)   } else {
let httpResponse = response as? HTTPURLResponse
print(httpResponse)   } })
dataTask.resume()

最新更新