显示导航

消费并测试第三方REST API

塞尔吉奥·德尔阿莫

365bet地区版本 4.0.1

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

365bet地区在本指南中,您将创建一个使用第三方REST API的365bet地区应用,此外,我们将使用模拟HTTP库来测试与此外部服务进行交互的代码

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails指南grails模拟http服务器初始

您可以直接前往如果你光盘进入grails指南grails模拟http服务器完成

编写申请

第一步是将Micronaut HTTP客户端库添加到我们的项目中。添加下一个依赖项

建立gradle
编译"io micronaut micronaut http客户端"

打开天气图

OpenWeatherMap是一个提供API的网络应用程序,可让您

获取您所在城市几天和每小时天气预报的当前每日天气预报有用的统计数据图形以及历史记录中的这一天可供您参考交互式地图显示降水云压在您所在位置附近

他们有一个免费计划,可让您获得当前天气数据一个城市

注册后,您将获得一个API密钥。您将需要一个API密钥才能与Open Weather Map API进行交互

apiKey
API密钥可能需要几分钟才能生效

将响应解析为JAVA类

创建几个JAVA POJOs Plain Old Java Objects来映射OpenWeatherMapJSON对类的响应

src main java org openweathermap CurrentWeather java
org openweathermap进口 com quickxml jackson批注JsonProperty;
进口 io micronaut核心注解自省;

进口 java有用列表;

内省
上市  当前天气 {
    私人的手手杰森地产("协调")
    私人的座标座标私人的 清单天气私人的风风私人的系统私人的雨雨私人的乌云密布私人的 基础私人的 整数dt杰森地产("ID")
    私人的 longcityId杰森地产("那么")
    私人的 城市名称杰森地产("代码")
    私人的 整数私人的 整数能见度上市当前天气吸气剂和二传手
}
src main java org openweathermap Clouds Java
org openweathermap进口 com quickxml jackson批注JsonProperty;
进口 io micronaut核心注解自省;

内省
上市  乌云 {
    杰森地产("所有")
    私人的 整数浑浊上市乌云吸气剂和二传手
}
src main java org openweathermap坐标Java
org openweathermap进口 com quickxml jackson批注JsonProperty;
进口 io micronaut核心注解自省;

进口 Java BigDecimal数学;

内省
上市  坐标 {

    杰森地产("")
    私人的 大十进制经度杰森地产("岁月")
    私人的 大十进制纬度上市坐标吸气剂和二传手
}
src main java org openweathermap Rain Java
org openweathermap进口 io micronaut核心注解自省;

内省
上市   {
    私人的 整数lastThreeHours上市吸气剂和二传手
}
src main java org openweathermap单元java
org openweathermap上市 枚举单位标准英制上市 静态的单位unitWithString海峡如果海峡空值) {
            如果str toLowerCase等于"公制") ) {
                返回单位公制其他 如果str toLowerCase等于"帝国的") ) {
                返回英制单位返回单位标准覆写
    上市 toString返回 这个名称为LowerCase
src main java org openweathermap天气java
org openweathermap进口 io micronaut核心注解自省;

内省
上市  天气 {
    私人的 longID私人的 主要私人的 描述私人的 图标上市天气吸气剂和二传手
}
src main java org openweathermap Sys Java
org openweathermap进口 io micronaut核心注解自省;

内省
上市  系统 {
    私人的 longID私人的 类型私人的 信息私人的 国家私人的 整数日出私人的 整数日落上市系统吸气剂和二传手
}
src main java org openweathermap风Java
org openweathermap进口 io micronaut核心注解自省;

进口 Java BigDecimal数学;

内省
上市   {
    私人的 大十进制速度私人的 大十进制上市吸气剂和二传手
}

露天天气服务

创建下一个服务

grails应用程序服务组织openweathermap OpenweathermapService groovy
org openweathermap进口 grails config配置
进口 365bet地区grails核心支持365bet地区ConfigurationAware
进口 常规转换CompileDynamic
进口 常规转换CompileStatic
进口 io micronaut http HttpStatus
进口 io micronaut http客户端BlockingHttpClient
进口 io micronaut http客户端HttpClient
进口 io micronaut http HttpRequest
进口 io micronaut http HttpResponse
进口 io micronaut http客户端异常HttpClientResponseException
进口 我micronaut http uri UriBuilder
进口 组织grails web json JSONObject

静态编译
 OpenweathermapService 实施365bet地区365bet地区ConfigurationAware帮忙城市名称国家/地区代码阻止HttpClient客户端覆写
    虚空setConfiguration Config co setupHttpClient co getProperty'开放天气网址', , 'http api openweathermap org'appid co getProperty'开放天气', cityName co getProperty'开放天气cityName', countryCode co getProperty'开放天气国家代码', )
    }

    虚空设置HttpClient网址这个客户端HttpClient创建url toURL到阻止当前天气currentWeather单位单位单位标准currentWeather城市名称国家/地区代码单位CurrentWeather currentWeather城市名称国家代码单位单位单位标准尝试HttpRequest请求HttpRequest GET currentWeatherUri cityName countryCode单位返回客户检索请求CurrentWeather抓住HttpClientResponseException e返回 空值 (3)
        }
    }

    URIcurrentWeatherUri城市名称countryCode单位单位标准UriBuilder uriBuilder UriBuilder'数据天气'queryParam'q', "${城市名称},${国家代码}"toString queryParam'帮忙'帮忙Printparam单位如果unitParam uriBuilder uriBuilder queryParam'单位'unitParam uriBuilder构建unitParameter单位单位单位标准空值单位toString
1 要获取当前天气,请执行GET请求,并提供城市名称国家/地区代码和API密钥作为查询参数
2 如果响应正常,则将JSON数据解析为Groovy类
3 如果答案不是,例如,该方法返回null

先前的服务使用了几个配置参数。yml应用程序

grails应用配置会议应用yml
开放天气:
    帮忙: f c d f ddccf c e cb ee
    城市名称: 伦敦
    国家代码: 英国

换货

要测试网络代码,请添加依赖项

建立gradle
测试编译'com stehno更换更换'

Ersatz Server是一个用于测试HTTP客户端的模拟HTTP服务器库,它允许配置服务器端请求响应期望,以便您的客户端库可以进行真实的HTTP调用并获取真实的预先配置的响应,而不是伪造的存根。

首先执行一项测试,以验证Openweathermap服务当前天气REST API返回时,方法返回null401例如,当API密钥无效时

src test groovy组织openweathermap OpenweathermapServiceSpec groovy
org openweathermap进口 com stehno替换替换服务器
进口 com stehno替换cfg ContentType
进口 comat ersatz encdec编码器
进口 免费测试服务ServiceUnitTest
进口 spock lang忽略
进口 spock lang规格

忽略( { 系统盖滕'特拉维斯')  布尔值 } )
 OpenweathermapServiceSpec 延伸规格实施ServiceUnitTest {

    定义 "对于未授权的密钥,返回null"() {
        给定更换服务器更换更换服务器'伦敦'
        国家代码'英国'
        帮忙'XXXXX'替代期望GET'数据天气') { (1)询问'q', "${},${国家代码}"询问'帮忙'叫appid1) (2)响应者代码401) (3)服务设置HttpClient替换httpUrl(4)服务appid appid什么时候当前天气当前天气服务当前天气城市国家代码然后当前天气替换验证(5)

        清理更换停止(6)
    }
}
1 向目标声明GET请求开放天气带有查询参数的路径
2 在此示例中声明要验证的条件,我们只想验证端点是否被击中一次
3 告诉模拟服务器返回此测试
4 Ersatz启动一个嵌入式Undertow服务器,将根网络请求发送到该服务器,而不是OpenWeather API服务器
5 验证ersatz服务器条件
6 记住要停止服务器

下一步测试,当服务器返回并提供JSON负载时,JSON负载已正确解析为Groovy类

src test groovy组织openweathermap OpenweathermapServiceSpec groovy
org openweathermap进口 com stehno替换替换服务器
进口 com stehno替换cfg ContentType
进口 comat ersatz encdec编码器
进口 免费测试服务ServiceUnitTest
进口 spock lang忽略
进口 spock lang规格

忽略( { 系统盖滕'特拉维斯')  布尔值 } )
 OpenweathermapServiceSpec 延伸规格实施ServiceUnitTest {

    定义 "CurrentWeather对象是通过JSON Payload构建的"() {
        给定更换服务器更换更换服务器'伦敦'
        国家代码'英国'
        帮忙'XXXXX'替代期望GET'数据天气'询问'q', "${},${国家代码}"询问'帮忙'叫appid1响应者编码器ContentType APPLICATION JSON地图编码器json(1)200身体协调罐头: -0.13, 岁月: 51.51天气ID: 803, 主要: '乌云', 描述: '碎云', 图标: 'd'基础'车站'主要温度: 20.81, 压力: 1017, 湿度: 53, 最低温度: 19, 最大温度: 22],
                        能见度: 10000速度: 3.6, : 180, 味道: 9.8乌云所有: 75dt1502707800系统类型: 1, ID: 5091, 信息: 0.0029, 国家: "国标", 日出: 1502685920, 日落: 1502738622ID2643743那么'伦敦'代码200ContentType APPLICATION JSON(2)服务设置HttpClient ersatz httpUrl服务appid appid什么时候当前天气当前天气服务当前天气城市国家代码然后当前天气当前天气城市名称'伦敦'当前的天气代码200当前天气城市ID2643743当前的天气缅因州温度20.81当前天气主压力1017当前的湿度天气53当前天气主要温度19当前天气主tempMax22当前天气当前天气0主要'乌云'当前天气0ID803当前天气0主要'乌云'当前天气0描述'碎云'当前天气0图标'd'当前的天气能见度10000当前天气风速3.6当前天气风度180当前天气云多云75当前天气基准'车站'currentWeather dt1502707800当前天气坐标替换验证清理更换停止
1 声明响应编码器以转换地图进入应用程序json内容使用Ersatz提供的编码器
2 将响应内容定义为地图上面定义的编码器会将其转换为JSON

http stehno com更换指南《 Ersatz用户指南》中的shadow jar Shadow Jar部分365bet地区Ersatz使用的Undertow嵌入式版本引起了一些服务器框架的问题,这些服务器框架也使用Undertow,例如365bet地区和Spring boot如果使用标准jar发行版时遇到错误,请尝试使用安全发行版,该发行版是带有Undertow库的带阴影的jar并将其JBoss依赖项重新打包到jar中_

运行测试

运行测试

grailsw grails测试应用程序grails打开测试报告

要么

gradlew检查打开构建报告测试索引html

天气管理员的根网址

创建一个家庭控制器使用先前的服务

365bet地区应用程序控制器演示HomeController groovy
演示进口 常规转换CompileStatic
进口 org openweathermap当前天气
进口 org openweathermap OpenweathermapService
进口 org openweathermap单位

静态编译
 家庭控制器OpenweathermapService openweathermapService定义 指数(unit Unit UnitEnum Unit unitWithString unit CurrentWeather当前天气openweathermapService currentWeather unitEnum当前天气当前天气单元unitEnum

网址映射常规将根URL映射到此控制器

"/"(控制者: '')`

标签库

创建一个标记库来帮助您封装一些渲染方面

grails app taglib org openweathermap OpenweathermapTagLib groovy
org openweathermap OpenweathermapTagLib {
    静态的命名空间"开放天气"

    定义图片属性"\"http openweathermap组织img w${attrs图标}PNG\"/>"
    }

    定义温度符号属性如果attrs单位英制单位'F'
        } 其他 如果attrs单位单位公制'C'
        }

    }
}

视图

创建下一个GSP,以将收集的天气信息呈现为HTML页面

grails应用程式检视首页索引gsp