我正在寻找bare minimum代码的帮助,以从TheTVDB API(v3)中获取一些信息。我以前从未编写过与API相关的代码。我尝试使用TVDBSharper进行快捷方式设置,但是它使用了异步例程和任务等。鉴于文档是针对C#的,我暂时无法理解,但我显然不明白该如何“等待”在VB中可以使用。
我已经尝试搜索API示例,但是大多数都是关于正在创建 API。
TheTVDB API文档说的第一件事是:“用户必须使用以下格式的API密钥和凭据来POST到/ login路由,以获得JWT令牌。”
^我不知道如何发布。我见过的所有示例都非常冗长且令人困惑,并且大多数使用C#。
所以(我为此道歉,但是我已经尝试了好几个月了)…有人可以告诉我最少的VB.NET代码来提取节目名称,例如系列ID 73739(丢失)。希望从那里,我可以开始弄清楚一些事情。
我有TheTVDB的有效API密钥。
通常,您不需要非常详细地了解异步/等待,但是我曾经是您现在的位置,尽管我并不声称自己是专家,但我确实设法做到了这一点:
[您知道,如果您遇到了引发异常的事情而从未发现它:
Sub Main(arguments)
Whatever()
End Sub
Sub Whatever
StuffBefore()
OtherWhateverThrowsException()
StuffAfter()
End Sub
Sub OtherWhateverThrowsException()
StuffBefore()
throw New Exception("Blah")
End Sub
一旦抛出该异常,您的VB线程将停止正在执行的操作,并在调用堆栈中回退,直到它弹出主菜单,然后崩溃到命令行-矩阵样式“返回来源”]
异步等待有点像这样。当有某种方法需要花很长时间才能完成工作时(从tvdb下载字符串),我们可以让它在代码中什么也不做,喝咖啡,等待TVDB的慢速服务器。这使事情变得容易理解,因为如果我们坐着等待,我们等待30秒钟,那么我们将得到响应并处理响应。显然,我们在获得响应之前无法处理响应,因此我们必须坐在那里等待它,这始终是正确的。
但是最好让我们的线程压回它的进入方式,“回到源头”,为其他人做其他事情,然后调用它(或它的另一个同事,我们可能不在乎)在TVDB的服务器响应时返回继续为我们工作。这就是Async Await为我们所做的。标记为“异步”的方法将被编译器以不同的方式处理,例如将您的进度保存在xbox游戏中。如果到达要等待的位置,则可以发出等待命令,正在执行工作的线程将执行保存游戏,然后关闭并为其他人工作,然后在我们准备就绪后返回并加载游戏再次进行下去。
保存游戏文件显示为任务;曾经是subs(什么都不返回)的方法现在应该是返回Task(没有关联数据的保存游戏)的Function。曾经返回过类似字符串的方法,现在应该标记为返回Task(Of String)-任务部分是保存播放状态(VB要使用的数据),字符串是数据您的应用程序想要使用。
一旦将某项标记为异步,它就需要包含一个Await语句。等待的是SaveYourGameAndGoDoSomethingElseWhileThis完成。通常,当您在等待某事时,您的程序将没有其他需要线程处理的事情,因此,调用TVDB API的不只是您的Function需要等待/被标记为Async-链中的每个函数,从头到尾一直到代码之外,都需要标记为“异步”,通常情况下,您将在备份的每一步中等待:
Sub DownloadTVDBButton_Click(arguments) DoStuff() End Sub Sub DoStuff StuffBefore() GetFromTVDB() StuffAfter() End Sub Sub GetFromTVDB() Dim i = 1 GetDataFromTVDBServer() 'wait 30s for TVDB ParseDataFromTVDB() End Sub Sub ParseDataFromTVDB() End Sub
成为:
Async Sub DownloadTVDBButton_Click(arguments) 'windows forms event handlers are always subs. Do not use async subs in your own code Await DoStuff() End Sub Function DoStuffAsync Returns Task StuffBefore() Await GetFromTVDBAsync() StuffAfter() End Function Async GetFromTVDBAsync() Returns Task Dim i = 1 Await GetDataFromTVDBServerAsync() 'go back up, and do something else for 30s ParseDataFromTVDB() End Sub Sub ParseDataFromTVDB() 'downstream; doesn't need to be async/await End Sub
我们切换为使用TVB的异步数据通话,因此我们等待它。当我们等待时,线程将回到上一个函数DoStuffAsync。因为我们正在等待that
,所以线程再次返回到按钮单击处理程序的级别。因为我们也在等待,所以线程又回到了您的代码之外。它回到了绘制UI的日常工作,使程序看起来仍然在响应等。当TVDB调用完成时,线程返回到紧接其后的位置(准备运行ParseData),并且具有所有功能数据从TVDB返回,并且保存游戏已经重新加载,因此它之前/状态所知道的一切都保持不变(变量i
存在且为1;您可以设想,如果线程转到做其他事情)
本质上,异步/等待使我们能够像没有它一样完成我们的工作,只是它建立了一个小保存游戏机制,这意味着当TVDB忙于获取数据时,我们的线程可以执行其他操作,而不是在我们等待时不必坐在aorund上什么也不做]
[将Await视为可以解开保存游戏并从中获取数据的设备也可能会有所帮助。如果一个GetSomething()坐了30秒钟,然后返回了您想要的字符串,那么GetSomethingAsync()将立即返回一个Task,该任务将(在工作完成后的30秒钟内)封装您想要的那个String,并且等待GetSomethingAsync()直到任务完成,然后从中获取所需的字符串
被命名为“ ... Async”的方法应被视为“以异步方式运行”。它们不必使用Async修饰符进行标记;只有在方法使用等待字的情况下才需要异步,但我建议您在调用树的整个过程中对返回任务(即等待)的所有对象使用等待。当您变得更有信心时,您不必总是等待AsyncingAsync,但是老实说,这样做的开销很小,并且不这样做的后果有时是灾难性的。所有遵循约定的开发人员总是将自己的东西命名为...如果异步以异步方式运行;您也应该采用这种方式,并确保在名称的末尾用“ Async”命名所有异步方法。
我不知道如何发布
您真的不需要。 TVDB API的端点很大。 swagger是一种以编程方式描述REST服务的方式,以便您的Visual Studio可以构建一组类来使用它,并为您提供精美的名称。抽出一个WebClient并手动创建一些JSON是非常老派的/低级]
TVDB的招摇描述符位于https://api.thetvdb.com/swagger.json
您右键单击您的项目,选择
Add... Rest API Client
,将https://api.thetvdb.com/swagger.json
粘贴为URL,并为所有生成的类选择要使用的命名空间(组织单位)。目前,TVDB API中的某些内容导致了AutoRest( VS用来解析API规范的工具)阻塞了,但通常情况下它会工作,并且您会得到一堆VB.NET(或C#;编译为DLL并引用它)对象,可以完成所有工作为您发布信息。
如前所述,VS暂时无法处理TVDB API,我今天没有足够的时间弄清楚原因,但是您可以在AutoRest的github(或SO)上发布一个问题,说“为什么https://api.thetvdb.com/swagger.json导致“输入字符串格式不正确””,并获得更多帮助