Alamofire 请求未返回结果

问题描述 投票:0回答:1

尝试从外部网站获取两个 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)
swift alamofire
1个回答
0
投票

我认为问题主要在于 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)!
}
© www.soinside.com 2019 - 2024. All rights reserved.