尝试从外部网站获取两个 ISBN 编号的 JSON 数据,该网站的 Curl 如下所示。 当使用 AF.request 时,它对于一个 isbn 工作得很好,但是当尝试使用由公共号分隔的 isbn 数字的curl 请求中的字符串时,它不会返回任何结果。 我也尝试过 & 和 &20 和 + 而不是逗号,但似乎没有任何效果。 该网站允许您插入两个 ISBN 编号,然后向您显示结果并为您提供curl 语句,以便我知道curl 语句有效。 如有任何帮助,我们将不胜感激!
/* curl from ISBNdb
curl -X 'POST' \
'https://api2.isbndb.com/books' \
-H 'accept: application/json' \
-H 'Authorization: mykey' \
-H 'Content-Type: application/json' \
-d 'isbns=9781250178633,9781501110368'
*/
func fetchAPIDataISBN() {
let headers: HTTPHeaders = ["accept": "application/json","Authorization": "mykey","Content-Type": "application/json"]
//let parameters1 = ["isbns": "9781250178633,9781501110368"]
let parameters = ["isbns": "9781250178633"]
AF.request("https://api2.isbndb.com/books", method: .post, parameters: parameters, headers: headers)
我认为问题主要在于 API 对它接受的内容非常挑剔。它似乎接受带有
isbns
键的 URL 编码形式,后跟逗号分隔的数字列表。因此从理论上讲,将 parameters
声明为以下内容应该可行
let parameters = ["isbns": "9781250178633,9781501110368"]
但是,API 似乎不喜欢这样,因为逗号被百分比编码为
%2C
。
您可以通过将其添加到 ,
中的
allowedCharacters
集中来强制 Alamofire 对 URLEncodedFormEncoder
进行 not百分比编码:
AF.request(
"https://api2.isbndb.com/books",
method: .post,
parameters: parameters,
encoder: URLEncodedFormParameterEncoder(encoder: .init(
// feel free to use a larger character set than 'alphanumerics' here if the
// request body has other characters that you don't want to be encoded
allowedCharacters: .alphanumerics.union([","])
)),
headers: headers
)
如果不需要传递任何其他参数,也可以考虑将参数写为单个字符串:
let parameters = "isbns=9781250178633,9781501110368"
并直接在
httpBody
参数中设置 interceptor
:
let request = AF.request(
"https://api2.isbndb.com/books",
method: .post,
headers: headers
) {
$0.httpBody = parameters.data(using: .utf8)!
}