当前位置: 首页 > 知识库问答 >
问题:

使用Swift 5.2调用REST API

夏谦
2023-03-14
#!/usr/bin/env python
import requests

resp = requests.get('https://finnhub.io/api/v1/stock/dividend?symbol=AAPL&from=2010-01-01&to=2020-12-31&token=xxx')
if resp.status_code != 200:
    # This means something went wrong.
    raise ApiError('GET /api/v1/stock/dividend?symbol=AAPL&from=2010-01-01&to=2020-12-31&token=xxx {}'.format(resp.status_code))
else:
    for dividend_item in resp.json():
        print('{} {} {}'.format(dividend_item['date'], dividend_item['symbol'], dividend_item['amount']))
2020-02-07 AAPL 0.77
2019-11-07 AAPL 0.77
2019-08-09 AAPL 0.77
2019-05-10 AAPL 0.77
2019-02-08 AAPL 0.73
2018-11-08 AAPL 0.73
2018-08-10 AAPL 0.73
2018-05-11 AAPL 0.73
2018-02-09 AAPL 0.63
2017-11-10 AAPL 0.63
2017-08-10 AAPL 0.63
2017-05-11 AAPL 0.63
2017-02-09 AAPL 0.57
2016-11-03 AAPL 0.57
2016-08-04 AAPL 0.57
2016-05-05 AAPL 0.57
2016-02-04 AAPL 0.52
2015-11-05 AAPL 0.52
2015-08-06 AAPL 0.52
2015-05-07 AAPL 0.52
2015-02-05 AAPL 0.47
2014-11-06 AAPL 0.47
2014-08-07 AAPL 0.47
2014-05-08 AAPL 0.47
2014-02-06 AAPL 0.43571
2013-11-06 AAPL 0.43571
2013-08-08 AAPL 0.43571
2013-05-09 AAPL 0.43571
2013-02-07 AAPL 0.37857
2012-11-07 AAPL 0.37857
2012-08-09 AAPL 0.37857

让我头疼的是在iOS13上把它转换成Swift5.2。我在这里找到了一个关于stackoverflow(在Swift中调用REST API)的好帖子,并将代码调整为我下面的Swift代码。

    func getDividendData() {
        let params = ["username":"john", "password":"123456"] as Dictionary<String, String>

        var request = URLRequest(url: URL(string: "https://finnhub.io/api/v1/stock/dividend?symbol=AAPL&from=2010-01-01&to=2020-12-31&token=xxx")!)
        request.httpMethod = "GET"
        request.httpBody = try? JSONSerialization.data(withJSONObject: params, options: [])
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        let session = URLSession.shared
        let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
            print(response!)
            do {
                let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject>
                print(json)
            } catch {
                print("error")
            }
        })

        task.resume()
    }

然后调用getDividedEndData()方法时,会出现以下错误。由于我对Swift编程不是很有经验,但我希望有人能给我一个提示。

2020-04-21 22:39:27.963666+0200 RESTtest[15836:1085147] GET method must not have a body
2020-04-21 22:39:27.967193+0200 RESTtest[15836:1085147] Task <C919CF75-FB01-4FF5-8CC8-646B1CA1FB5D>.<1> finished with error [-1103] Error Domain=NSURLErrorDomain Code=-1103 "resource exceeds maximum size" UserInfo={NSUnderlyingError=0x600002953240 {Error Domain=kCFErrorDomainCFNetwork Code=-1103 "(null)"}, NSErrorFailingURLStringKey=https://finnhub.io/api/v1/stock/dividend?symbol=AAPL&from=2010-01-01&to=2020-12-31&token=xxx0, NSErrorFailingURLKey=https://finnhub.io/api/v1/stock/dividend?symbol=AAPL&from=2010-01-01&to=2020-12-31&token=xxx, NSLocalizedDescription=resource exceeds maximum size}
Fatal error: Unexpectedly found nil while unwrapping an Optional value: file /Users/joe/Desktop/RESTtest/RESTtest/ViewController.swift, line 27
2020-04-21 22:39:27.967483+0200 RESTtest[15836:1085147] Fatal error: Unexpectedly found nil while unwrapping an Optional value: file /Users/joe/Desktop/RESTtest/RESTtest/ViewController.swift, line 27
(lldb) 

附注:出于隐私原因,我用XXX替换了令牌。

共有1个答案

彭烨熠
2023-03-14

正如错误所说:

GET方法不能有主体

所以错误原因是一行:

request.httpBody
let url = URL(string: "https:// Your url path")!
var components = URLComponents(url: url, resolvingAgainstBaseURL: false)
let queryItems: [URLQueryItem] = params.map { parameter in
    URLQueryItem(name: parameter.key, value: parameter.value)
}

components.queryItems = queryItems

var request = URLRequest(url: components.url!)
// ...

 类似资料:
  • 通过io的requestAbs方法调用/调用/使用REST API的vertx实现。vertx。果心http。vertx-core-3.2.0中的HttpClient类。jar导致HTTP错误::302,响应数据为HTML Erro响应。 不确定requestAbs方法的行为,因为没有引发异常,也没有写入任何日志。此外,还随附了使用vertx JAR的此方法的源代码。如果方法实现有bug,是否有问

  • 问题内容: 我正在尝试在内核驱动程序和用户空间程序之间进行异步通信(我知道这里有很多问题需要类似的信息,但是找不到与sysfs_notify相关的信息)。 我将在这里留下Vilhelm的编辑,但是将源代码添加到一个使用sysfs的简单驱动程序中,并在一个用户空间程序中对其进行轮询。驱动程序工作正常(我从网络上获得了大部分钱;它缺少功劳,但是我回去添加功劳时找不到它们)。不幸的是,轮询程序无法正常工

  • 我有以下要求 在Login.html页面-登录btn并忘记密码btn 如果登录btn点击, 应该完成用户名和pswd文本字段验证。 如果验证成功-调用LoginServlet 如果LoginServlet成功验证用户- 我正在努力寻找过去3天的解决方案,我已经推荐了SO和其他门户网站的帮助,但仍然缺乏最终输出 登录名。html LoginServlet

  • 如果读者使用delphi(本文使用的是delphi2009,其他的delphi版本请读者自行测试)调用支持会话的WebService时有一些差别。经笔者测试,使用delphi调用WebService,将scope属性值设为transportsession和application都可以实现跨服务的会话管理,这一点和Java与C#不同,Java和C#必须将scope属性值设为application才支

  • 从理论上说,WebService可以被任何支持SOAP协议的语言调用。在Visual Studio中使用C#调用WebService是在所有语言中最容易实现的(VB.net的调用方法类似,也同样很简单)。 新建一个Visual Studio工程,并在引用Web服务的对话框中输入如下的URL,并输入Web引用名为“WebService”: http://localhost:8080/axis2/se

  • 问题内容: 我正在尝试获取登录到我的应用程序中的用户的Facebook个人资料图片。Facebook的API声明返回正确的URL作为JSON对象。 我想从代码中获取图片的URL。我尝试了以下操作,但这里缺少内容。 运行此代码将导致以下结果: 问题答案: 回调中的参数不是正文,而是一个http.ClientResponse对象。您需要组装车身:

  • 我必须调用api使用生成。我将在中发送令牌。我通过网络获得了一些,但我不知道如何与API一起传递参数。有人能帮忙吗? 我需要调用docusign apihttps://account-d.docusign.com/oauth/token 此外,我需要发送和。我不知道如何收到这个。有人能举个例子吗?以下是供参考的图像。 在此处输入图像描述

  • 我正在使用一个去福尔菲区域从我的基于网络的服务器进行下游访问。当客户端接收数据时,我添加到频道未来的频道进程接收器永远不会被调用。我在使用netty编程方面不是很有经验,所以我认为我误解了nettys渐进式频道未来的工作原理。因此,我在这里查看了我在这里找到的示例代码:programcreek.com.但它基本上是相同的代码?我试图在这里找到类似的问题,但找不到原因。提前感谢您的任何提示,为什么听