‫大家好吗？
‫在本视频中, 我想向您展示如何使用我们在前两个视频中使用API构建的货币转换器｡
‫因此, 您不需要使用在数据库中看到的代码｡
‫例如, 您实际上甚至不必看过数据库示例,
‫因为我们将使用在静态示例中创建的代码｡
‫例如, 在静态WP
‫F货币转换器中, 我们使用静态数据, 并将对其进行扩展,
‫以使其使用来自API的数据, 这意味着我们从互联网获取数据, 并使用这些数据, 以便使用最新的货币值和最新的转换率进行最佳的货币转换｡
‫这基本上就是这背后的想法｡
‫当然, 你可以看看这篇文章｡
‫我们为此创建了完整的文章｡
‫是的, 你基本上可以去看看｡
‫你可以在里面找到所有的代码, 一堆解释等等｡
‫了｡
‫我们要使用的API来自开放汇率, 这很酷｡
‫这个网站提供汇率, 我们可以使用多达1000个电话每月免费｡
‫这对于学习是很好的, 但是一旦你想实际使用它来提供你想销售的服务, 你就必须付费｡
‫但正如我所说, 它是免费的测试, 这正是我们所需要的｡
‫所以你可以去定价每一次如果你是这样一个付费页面, 只是看看他们有什么在这里｡
‫你可以看到有开发者计划, 企业计划, 无限计划, 但这不是什么与我们相关｡
‫我们感兴趣的是这个免费的计划, 所以提供每小时更新与基础货币美元和每月多达1000个请求, 这是伟大的｡
‫所以你在这里进入免费计划, 然后你必须注册, 你才能使用这个｡
‫好吧, 我会的
‫所以如果你想沿着, 你可以只在这里注册, 一旦你注册了｡
‫您将需要有您的应用程序ID, 因此您将需要此ID在这里｡
‫这个ID是我们进行API调用所需要的, 因为现在我们可以进行API调用, 基本上可以取回数据｡
‫我们怎么把数据拿回来？
‫我们得到的是这种格式, 所以我们得到的是JSON格式｡
‫这是JSON格式｡
‫JSON是一种非常有用的数据显示格式, 也是一种只有文本的可读格式｡
‫所以基本上它把它分解了｡
‫因此, 这不是一个数据表, 因为你通常会看到在许多情况下的数据, 但这是一个真正的文本格式,
‫你仍然可以阅读相当好｡
‫好吧, 我会的
‫因此, 我们将获得的数据基本上是免责声明许可证时间戳基础, 费率和费率本身是一组不同的费率,
‫基础将是美元｡
‫所以一美元你会得到一个3｡ 6无论EAD代表什么, 我不知道, 那么澳大利亚元你会得到139,
‫例如｡
‫好的, 这些就是我们得到的值｡
‫我们可以使用它来调整程序, 使其能够获取最新的货币或货币比率,
‫这样我们就不必在代码中手动输入它们,
‫也不必像上一个视频中那样, 在程序中手动输入额外的数据库选项卡｡
‫好吧, 我会的
‫那么让我们来看看我们的项目｡
‫这是静态项目｡
‫正如我所说的, 如果你还没有看过视频,
‫一定要看看我向你展示如何构建这个､ WPF部分等等的视频, 因为我将在这个视频中讲述WPF部分｡
‫我将只关注API方面的内容｡
‫为了让这个计划成功, 我们需要额外的课程, 因为我们｡
‫以一定的格式获取信息, 对吧｡
‫我们得到它的格式, 就像我说的, 是这个格式｡
‫所以你可以随时去看文档, 你会发现它的可读性更强一点｡
‫在这里, 您可以看到这是您需要执行的HTTP请求, 以获取这种格式或这种数据｡
‫您看, 我们需要使用应用程序ID向该网页发出请求, 然后它基本上就是您在后端拥有的应用程序ID｡
‫所以你需要使用你自己的应用ID才能让这个工作, 因为我的ID将被限制在1000个, 如果有人要使用它, 它会的｡
‫好吧, 如果你们中的一些人打算使用它, 那么它将被滥用如此频繁, 以至于它不会起作用｡
‫所以我们会你会需要你自己的一个｡
‫但是一旦你这样做了, 你能得到的就是这种信息和这种信息｡
‫好吧, 我把这个叫做根｡
‫所以我将创建一个类, 它是路由的, 基本上是我的类型,
‫它允许我获取所有的数据.
‫在路由中, 我有属性, 也可以是类本身｡
‫例如, 利率将是另一个类｡
‫我将创建一个名为rates的类, 但之后我可以创建一个long for timestamp,
‫因为这是一个long值｡
‫我可以创建一个字符串来表示美元等｡
‫所以让我们一步一步来｡
‫让我们从路由类开始｡
‫所以我要在主窗口类中创建一个新类｡
‫现在我将创建一个公共类｡
‫根｡
‫好的, 这里有一个叫做rates的速率, 还有一个叫做time的长时间戳｡
‫然后我就可以拿到执照了｡
‫所以我们也去拿执照吧｡
‫我们进去吧
‫我将重点介绍简单的许可证｡
‫所以公共字符串许可证｡
‫现在我们需要得到利率｡
‫但正如我所说, 利率有点复杂, 因为有一堆不同的利率｡
‫我会创建一个额外的类, 我称之为rate.
‫重要的是我这里有名字, 和这里的名字完全一样｡
‫所以, 我们将获得的名字, 这些不是唯一的｡
‫还有更多｡
‫你可以得到更多的细节｡
‫支持的货币｡
‫因此, 您可以转到文档, 然后转到支持的货币,
‫在这里您将看到所有支持的货币｡
‫我不打算全部用上｡
‫我只是要用其中的一些｡
‫但重要的是, 您在项目中使用的名称, 它们也应该在那里可用｡
‫印度卢比, 日元, 美元, 我不知道那是什么｡
‫我猜是欧元加元之类的｡
‫好吧, 我会的
‫丹麦王冠, 捷克王冠｡
‫PHP这是一种很酷的语言, 我猜是一种编程语言｡
‫但在这种情况下, 它不仅仅是｡
‫实际上, 呃, 也是一种价格｡
‫好了, 我有了所有的属性, 都有getter和setter？
‫所以我有一个公共类速率, 它有所有的setter和getter,
‫你会看到, 每次你, 比如, 想要得到这种格式的数据.
‫这是一个根类, 它有很多属性, 但这个属性本身可以有多个属性,
‫它是一个类.
‫所以我们创建了这个类比率, 叫做比率, 它和这里的完全一样｡
‫这很重要｡
‫所以你需要确保你在程序中使用的名字和这里的名字是一样的｡
‫我现在只需要获取rates, timestamp和license, rate只会在这里获取这些属性,
‫也就是说只会获取这些货币或这些货币的在线可用值｡
‫现在我们已经解决了这个问题, 我们可以开始获取值, 我们可以从网络上获取数据｡
‫我将创建一个额外的方法来获取这些数据｡
‫让我快速介绍一下这个方法｡
‫我将把它粘贴到这里, 实际上, 让我们在主窗口之后再做一遍, 让我们看看它｡
‫所以我在这里使用的是异步任务｡
‫因此, 让我通过使用sys线程任务来解决这个问题｡
‫好吧, 我会的
‫所以这让我们可以并行地做事情｡
‫我们可以激活多个线程｡
‫因此, 使用任务, 我们可以运行异步操作｡
‫当你从互联网上获取数据时, 你应该异步地进行,
‫因为否则, 当你等待响应时, 你基本上会冻结你的程序｡
‫因此, 它会冻结整个主线程, 应用程序也会冻结, 无法正常工作｡
‫这就是为什么要使用异步任务｡
‫你使用这个关键字async, 你使用这个任务类, 我们想得到一个非路由的结果｡
‫因此, 如果您想了解有关task的更多信息, 您可以随时查看文档｡
‫你会看到的｡
‫任务为我们提供了一个类型为t的通用包结果｡
‫嗯, t结果｡
‫T结果是什么｡
‫此任务生成的结果的类型｡
‫我希望这项任务能产生什么样的结果｡
‫当我得到数据的时候, 我想得到root, 所以我想得到一个结果, 这个结果是我们创建的类的类型,
‫root, 然后我们可以使用这个结果, 这意味着我们可以使用我们得到的数据,
‫我们可以对它做任何我们想做的事情｡
‫例如, 我们可以用它来分配给我们的程序, 然后使用货币汇率或汇率｡
‫好吧, 我会的
‫现在我创建了一个新的根对象, 因为基本上我希望能够在这里返回一个根对象和我的根｡
‫而且因为无论何时你用互联网做什么, 事情都可能出错｡
‫你要用, 试, 抓｡
‫因此, 我们使用try和catch来避免中断应用程序｡
‫这里也可以有异常调用, 但我只返回根｡
‫如果这不起作用, 那么我们在这里使用关键字using和var客户机, 新的HTTP客户机｡
‫因此, 我们创建了一个新的客户端, 并使用此系统net http, 即HTTP客户端｡
‫所以现在我们可以使用它｡
‫因此, 此类提供了一个基类, 用于发送和接收来自URL的HTTP请求和响应｡
‫好吧, 我会的
‫对于时间跨度, 我们需要将系统添加到我们的命名空间中｡
‫现在我们有了线程任务, 有了数据和http｡
‫你可以看到所有的好东西｡
‫好吧, 我会的
‫现在客户端需要超时｡
‫所以我给予它一个时间跨度, 最多等待一分钟｡
‫所以它有充足的时间来获取数据｡
‫当然,
‫您也可以在这里使用秒, 但我只想说, 给予它一整分钟, 然后我将得到响应消息, 这将是客户端获取异步URL｡
‫让我们看看如何获得异步｡
‫Get async是一个需要请求的方法｡
‫统一资源标识符｡
‫所以基本上我们给它发送一个链接或者给予它一个链接｡
‫所以一个URL会给我们｡
‫大事｡
‫所以它让我们以异步的方式访问数据｡
‫因此, 可以说, 它只是与我们的主线程并行执行, 这样我们的应用程序就不会崩溃｡
‫而且因为这是可以得到的东西｡
‫所以你可以在这里看到这个关键字, 这个任务异步地做一些事情｡
‫我们需要在这里添加一个权重关键字, 因为我们正在等待结果, 一旦它在那里,
‫我们将存储它作为响应｡
‫所以基本上这就是我们得到的反应｡
‫而回应的格式我们还无法读取｡
‫所以它会是这样的回应, 但以一种我们还不能读懂的格式｡
‫所以我们需要把它转换成程序可以读取的格式, 也就是说, 首先, 我们需要把它变成一个字符串,
‫就像我们在这里做的那样｡
‫这是一些字节格式的数据｡
‫现在, 我们将它转换为｡
‫字符串, 这样您就可以看到将http内容序列化为字符串作为异步操作｡
‫因此, 我们有了这些数据并对其进行序列化｡
‫所以我们把它转换成字符串格式｡
‫所以我们使用我们的响应, 也就是HTTP响应消息｡
‫我们获取其内容, 因此获取或设置HTTP响应消息的内容｡
‫基本上, 我们从它获取数据, 然后将其作为字符串读取, 然后再次异步读取,
‫这样就可以再次使用它｡
‫所以我们需要在这里增加一个权重｡
‫这将为我们提供响应字符串｡
‫现在的问题是我们需要JSON格式｡
‫这就是我们在这里使用JSON转换器的原因｡
‫所以让我在这里使用JSON转换｡
‫它甚至不提供它在这里, 所以我需要手动做｡
‫这意味着我将在这里说使用一个新的转弯软点｡
‫杰森｡
‫现在, 要使其正常工作, 我们需要确保安装了此软件包｡
‫所以管理新的get包｡
‫这里我们需要安装这个牛顿软杰森｡
‫那么, 让我们安装它｡
‫您也可以浏览和搜索它｡
‫在我的情况下, 它是直接可用的, 因为好吧, 我已经在那里输入了名字｡
‫而且一旦它被加载和安装, 我们现在就可以使用这个包了, 这样你就可以看到Newton soft了｡
‫Jason现在错误消失了, 工作正常｡
‫好了, 现在你可以往下看, 你可以看到Jason Convert是有效的, Jason Convert来自这个Newton soft
‫Jason｡
‫它的基本功能是DC实现我们拥有的对象根｡
‫带有响应字符串｡
‫因此,
‫我们需要给予它响应字符串, 而响应字符串已经将我们获得的数据（HTTP响应）转换为字符串, 现在我们将该字符串转换为JSON对象｡
‫现在, 问题是, 对于这个响应对象, 也就是相邻对象, 我们现在可以像处理升C的对象一样处理它｡
‫这就是它的强大之处, 因为现在我们可以很容易地访问它的属性｡
‫例如, 我可以直接输入timestamp response､ object､ dot
‫timestamp, 这样我就可以在消息框中显示它, 因为我认为这是显示它的最简单方法｡
‫通过这种方式, 我现在可以显示我们实际上是从互联网上获得数据的｡
‫我们等一下再测试一下｡
‫但在我们这样做之前, 让我们先完成这个方法｡
‫现在我将返回响应对象｡
‫所以每次我们调用get data now这个方法时, 它都会返回一个task root响应对象｡
‫它基本上允许我们访问所有的根元素, 例如时间戳, 以及我们想要的不同汇率｡
‫万一不管用呢｡
‫因此, 如果响应代码, 即此状态代码, 不正确｡
‫现在, 我们来看看状态代码｡
‫还有状态代码, 它是200状态代码, 最为人所知的可能是404｡
‫未找到状态代码｡
‫所以这是一个令人难忘的状态代码｡
‫你可能知道它0404女友没有找到或网站没有找到这样的东西｡
‫好吧, 我会的
‫这些是可用的不同响应代码｡
‫每次你试图访问一个HTTP页面或网页或任何类型的HTTP请求时, 你发出一个请求, 你首先会得到一个状态代码｡
‫根据状态代码, 您可以决定是否对数据执行某些操作｡
‫因为, 比如说, 如果状态码不是okay, 那么比如说, 我们没有得到数据, 它就没有找到｡
‫那我们就不能用数据来工作了｡
‫所以我们可以说, 好吧, 我们跳过它或者试试别的｡
‫如果是200, 也就是OC,
‫基本上内部意味着是200的代码, 那么我们知道我们可以使用它, 只有这样我们才想把响应转换成JSON对象, 然后在项目中使用｡
‫否则我就返回一个空的根对象, 所以我就返回我的根｡
‫万一程序崩溃或者这个任务获取数据崩溃, 我也会在这里返回我的根目录.
‫好吧, 我会的
‫现在我们有了这个绑定货币, 让我们看看在哪里使用绑定货币｡
‫我们在主窗口中使用它｡
‫现在我们创建一个新的方法, 它将是get value, 或者实际上我们可以为此创建一个额外的方法｡
‫我认为这是有道理的, 因为它是一个异步方法｡
‫所以我们有这个私有的异步void get value, 我们只想在得到值后绑定货币｡
‫所以我需要价值观｡
‫vol的变量, 此处vol的类型为root｡
‫所以让我在这里补充一下｡
‫其实我可以｡
‫是的, 我知道
‫让我们把它加到最上面｡
‫因此, 我将创建一个新的路由对象, 命名为瓦尔,
‫它将是一个空的根对象｡
‫所以它将是这个类的一个对象｡
‫然后我就可以继续说｡
‫设置好, 那么这个路线值基于你从数据中得到的东西｡
‫现在, 这种获取数据的方法基本上将调用这个异步方法, 我们刚刚创建了这个方法, 如果一切正常,
‫它将返回｡
‫一个JSON类型的响应对象, 基本上是一个可读的对象, 具有以下格式｡
‫这是一个JSON对象, 我们需要它, 因为我们可以很容易地使用它,
‫因为我们可以很容易地访问它的属性, 例如, 只需说“响应”､ “对象”､ “点时间戳”｡
‫现在我们通过输入wait, get data来获取数据, 这里我们需要传递一个URL,
‫因此我们需要传递字符串URL, 而字符串URL基本上就是我们从网站获取的请求｡
‫这个链接, 基本上就是这个链接, 但是你可以用这个应用程序ID来替换这个部分｡
‫所以你的应用程序ID, 你替换它, 然后你最终得到你在这里看到的｡
‫所以我要用我自己的ID来代替它｡
‫所以如果你下载了代码, 你可以把这部分替换掉｡
‫应用程序ID之后的所有内容都等于符号｡
‫您可以将其替换为您自己的ID, 然后您现在将创建自己的请求｡
‫顺便说一句, 你甚至可以在浏览器中测试它｡
‫让我真实的地说一下｡
‫我只是在浏览器中测试一下, 这就是我得到的结果｡
‫这是我用不同的货币和汇率得出的结果｡
‫您可以看到, 我们得到免责声明､ 许可证､
‫时间戳基数和费率, 费率是所有这些不同的费率, 然后依次具有此浮动值, 或者实际上可能是双值｡
‫我把它当作一个双精度值, 没错.
‫这就是我们使用刚才看到的代码所得到的结果｡
‫所以基本上我们这里的代码, 这个｡
‫会给予我们你刚刚看到的｡
‫这个瓦尔现在将是一个根对象, 它是包含费率的根, 在我们的例子中, 它包含时间戳和许可证｡
‫至少我是这么用它的｡
‫这些是我将使用的属性, 您也可以使用其他属性｡
‫在这种情况下, 所有这些都是可用的, 许可证和基地是失踪或免责声明, 并基于失踪｡
‫但是对于base, 你必须小心, 因为base是升C的关键词｡
‫是这样｡
‫在这一点上, 我们得到的值或我们可以得到的值｡
‫现在, 让我们在主窗口方法中调用get value, 基本上是在主窗口构造函数中｡
‫现在我们将得到价值, 我们将绑定货币｡
‫现在让我们来看看bind currency, 因为这是我们之前创建的方法｡
‫当然, 现在我们需要调整和绑定货币, 因为我们无法像以前那样获取数据,
‫我们需要手动输入数据｡
‫这就是我们在这里做的｡
‫所以这次我们要做的是从网络上获取数据｡
‫所以我不需要手动使用不同的值, 我要做的是｡
‫把它贴在这里｡
‫我会让它保持简单｡
‫顺便说一句, 我把它重新命名为DT, 这样写起来更容易一些｡
‫好吧, 我会的
‫所以现在这个数据表叫做T, 我们有数据表行｡
‫我们在第一个位置添加select｡
‫但是在第二个位置, 我们有, 例如, 印度卢比, 它只给予我们价值率,
‫印度卢比｡
‫那么, 什么是价值呢？
‫value是我们创建的一个原始对象, 它是root类型的, 当然, 它包含了利率.
‫它的类型是rate, 它允许我们这里所有的速率｡
‫所以现在｡
‫我们需要确保这里使用的名称也是这里使用的名称, 因为否则我们无法访问它们｡
‫所以我得到了所有不同的汇率, 并将它们分配给这些汇率的名称, 或者确切地说, 分配给这些货币的名称
‫现在很酷的是剩下的可以保持不变因为所有那些货币项目, 来源等等的组合框, 它们都保持不变｡
‫我们不需要对这些进行任何更改,
‫因为我们唯一更改的是数据现在不再来自手动添加的元素, 而是来自web｡
‫但这基本上只是一个数字, 对吗？
‫所以对我们的程序来说, 这真的没有太大的区别｡
‫它不关心数据来自何处, 因为我们没有更改数据格式｡
‫它仍然是相同的数据格式, 只是现在它来自网络, 这很酷｡
‫现在, 如果我们运行这个应用程序, 我们可以看到这是我们得到的时间戳｡
‫这是我运行这个程序时的时间戳｡
‫为什么这个窗口会出现？
‫嗯, 因为我在这里添加了这个消息框｡
‫让我稍微改变一下｡
‫那么, 除了显示时间戳, 我们还得到了什么？
‫我们有执照, 所以让我去拿执照｡
‫所以我把这个叫做license｡
‫让我们再运行一次｡
‫现在看｡
‫你看到的许可证是, 这是开放汇率的许可证｡
‫现在让我们来看看利率｡
‫所以我们所有的利率｡
‫率｡
‫还有这个｡
‫让我们试试看｡
‫尽管rates是一种不同的格式, 让我们看看它是否崩溃｡
‫这只是货币静态窗口利率, 所以它不会以这种特定的格式显示数据｡
‫让我们改用这个响应字符串｡
‫所以我们应该把这整串字符串取出来｡
‫你看, 我们到了｡
‫这基本上就是我们得到的所有数据的字符串格式｡
‫所以费率免责声明, 许可证时间戳｡
‫所以你可以看到我们从互联网上得到的数据｡
‫汇率｡
‫很酷的一点是我们可以选择我们在这里定义的汇率｡
‫假设我想把1,000欧元兑换成｡
‫美元和.
‫看起来, 我们的计算是不正确的, 因为它应该是相反的｡
‫所以它应该是1,000美元, 你得到843欧元｡
‫现在, 由于我们使用了不同的值,
‫或者我们得到了不同的值, 基本上我们的程序是基于美元的, 或者我们得到的数据是基于美元的, 正如你在他们的页面上看到的｡
‫所以他们说美元是这里的基础｡
‫我们需要确保再次对我们的软件进行一次更改, 即在主窗口的转换单击函数中的XML文件｡
‫我们需要把公式往上改一点因为现在公式不应该从货币开始,
‫所以这里应该是C和B到货币选择值, 然后再往下或者右手边｡
‫这一个现在应该是从, 因为我们基本上需要交换两种货币的方向, 否则我们会得到错误的值｡
‫现在如果我再运行一次｡
‫实际上我们应该把这个盒子扔掉, 因为它真的很烦人｡
‫我们可以在这里将其注释掉｡
‫这张
‫现在就去
‫再来一遍｡
‫比如说1, 000美元, 我们把它转换成欧元｡
‫那么, 在录制时, 1,000美元可以得到多少欧元？
‫是843号
‫好吧, 我会的
‫所以, 是的, 差不多就是这样｡
‫现在, 您已经了解了如何从互联网获取数据, 如何使用API,
‫如何将API信息转换为JSON对象, 然后使用它, 因为这样您就可以像使用尖锐对象一样使用它,
‫这就是JSON对象的强大功能, 以及如何将其转换为我们可以读取的内容｡
‫因此, 重要的是, 首先, 我们使用异步任务,
‫因为我们异步获取数据, 这可能需要一段时间, 这可能会出错等等｡
‫这就是为什么我们在这里使用try, 然后我们在这里使用HTTP客户端, 在这里我们有一个超时, 然后我们有一个特定类型的响应｡
‫它只是HTTP响应消息类型, 我们需要这样做｡
‫首先, 获取响应的状态代码,
‫然后我们可以获取内容, 并将其读取为字符串, 然后将其存储在字符串中, 然后我们获取该字符串, 并将其创建为JSON对象｡
‫所以我们使用JSON转换序列化对象｡
‫因此, 我们将其序列化为root的格式, 这也是我们自己创建的类,
‫它基本上具有我们刚刚从JSON格式中获取的不同属性｡
‫现在, 您可以访问任何API, 基本上可以应用在本视频中学到的相同原理, 从中获取数据,
‫然后在程序中使用这些数据｡
‫所以我希望你喜欢这个视频｡
‫这只是对我决定添加它的课程的一点补充, 因为我只是认为了解这些东西很好, 作为一个开发人员,
‫它确实很有帮助｡