URLSession 参数必须有效

URLSession parameters must be valid

这是 Url 我要求的:

https://api.rss2json.com/v1/api.json?rss_url=https%3A%2F%2Fwww.theverge.com%2Frss%2Findex.xml&api_key=u3vl3sxdva2cch7jjyrnynvwlhjycjrizhcsgmmq

如果您 运行 在浏览器上使用它,它可以正常工作并给出 JSON 响应。但是,我在 运行 宁以下代码的 catch 块中收到此错误:URLSession 参数必须有效

let callURL = URL.init(string: urlString)    // urlString is the above url
var request = URLRequest.init(url: callURL!)
request.addValue(ContentType_ApplicationJson, forHTTPHeaderField: HTTPHeaderField_ContentType)
request.httpMethod = HTTPMethod_Get    
let dataTask = urlSession.dataTask(with: request) { (data,response,error) in
        if error != nil{
            completion(nil)
            return
        }
        do {
            if let resultJson = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary{
                print("Result",resultJson)
                if let news = resultJson.value(forKeyPath: "articles") as? [NSDictionary]{
                    print("News",news)
                    completion(news)
                    return
                }
            }
        } catch {
            print("Error -> \(error)")
        }
    }

dataTask.resume()

我不确定你的代码有什么问题,但我已经在操场上测试了你上面的代码我得到的消息是下面的代码

import Foundation
import UIKit
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

let urlString = "https://api.rss2json.com/v1/api.json?rss_url=https%3A%2F%2Fwww.theverge.com%2Frss%2Findex.xml&api_key=u3vl3sxdva2cch7jjyrnynvwlhjycjrizhcsgmmq"
let callURL = URL.init(string: urlString)    // urlString is the above url
var request = URLRequest.init(url: callURL!)
request.addValue("Content-Type", forHTTPHeaderField: "application/json")
request.httpMethod = "GET"
let dataTask = URLSession.shared.dataTask(with: request) { (data,response,error) in

    let res = response as! HTTPURLResponse
    print(res)
    if error != nil{
        print(error!)
        return
    }
    do {
        if let resultJson = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary{
            print("Result",resultJson)
            if let news = resultJson.value(forKeyPath: "articles") as? [NSDictionary]{
                print("News",news)

                return
            }
        }
    } catch {
        print("Error -> \(error)")
    }
}

dataTask.resume()

这对我有用

    let callURL = URL.init(string: "https://api.rss2json.com/v1/api.json?rss_url=https%3A%2F%2Fwww.theverge.com%2Frss%2Findex.xml&api_key=u3vl3sxdva2cch7jjyrnynvwlhjycjrizhcsgmmq")    // urlString is the above url
    var request = URLRequest.init(url: callURL!)
     request.httpMethod = HTTPMethod.get.rawValue
    let dataTask = URLSession.shared.dataTask(with: request) { (data,response,error) in
        if error != nil{

           print(error)
        }
        do {
            if let resultJson = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary{
                print("Result",resultJson)
                if let news = resultJson.value(forKeyPath: "articles") as? [NSDictionary]{
                    print("News",news)

                    return
                }
            }
        } catch {
            print("Error -> \(error)")
        }
    }

    dataTask.resume()

GET 请求不需要 URLRequest,这是默认设置,只需传递 URL

这有效,但是键 articles

没有值
let urlString = "https://api.rss2json.com/v1/api.json?rss_url=https%3A%2F%2Fwww.theverge.com%2Frss%2Findex.xml&api_key=u3vl3sxdva2cch7jjyrnynvwlhjycjrizhcsgmmq"
let callURL = URL(string: urlString)!
let dataTask = URLSession.shared.dataTask(with: callURL) { (data,response,error) in
    if error != nil { return }
    do {
        if let resultJson = try JSONSerialization.jsonObject(with: data!) as? [String:Any] {
            print("Result",resultJson)
//            if let news = resultJson["articles"] as? [[String:Any]] {
//                print("News",news.count)
//                return
//            }
        }
    } catch {
        print("Error -> \(error)")
    }
}
dataTask.resume()

并且——一如既往——不要在Swift中使用NSDictionaryvalueForKey.allowFragments如果根对象是集合类型。