一般来说,并不是所有的数据库厂商都与微软达成了商务合作,这就导致市面上还存在一部分数据源无法通过PowerBI内置的连接器进行数据连接。
但几乎所有的数据库,都可以通过各种各样的方式,提供给外界一个可以进行数据交互的接口,也就是说我们常说的API,而恰好,PowerBI是可以对API数据进行处理的。
API,应用程序编程接口,是企业一种主流的数据传输方式,避免了通过账户密码的方式给数据库带来的安全隐患
和性能问题
,也是针对上面问题的答案。
对比通过数据库账户密码获取数据的方式,API具备如下优点:
-
避免通过账户密码连接数据,杜绝了安全隐患
-
避免对数据库进行查询操作,减轻了数据库负载压力
函数介绍
语法如下
let
RequestUrl = "请求的网址",
GetQuery = [参数1 = "条件1", 参数2 = "条件2"],
PostContent = "参数1=条件1&参数2=条件2",
Headers = [AccessToken = "Token的令牌", #"Content-Type" = "application/x-www-form-urlencoded"],
Result = Json.Document(
Web.Contents(RequestUrl, [Headers = Headers, Query = GetQuery, Content = Text.ToBinary(PostContent)])
)
in
Result
Web.Contents参数介绍
-
RequestUrl
就是需要请求API的网址-
如果是内部自开发的,那么询问开发者使用方法即可
-
如果是外部公网的话,那么需要利用F12查询相关配置信息
-
Payload
是目前存放POST请求参数的位置,之前都是存放在Headers下面
-
-
GetQuery
就是查询中我们需要使用到的参数,一般是针对GET的API类型,通常是网址问号后面的部分- 例如:
www.baidu.com/s?wd=白茶
,“wd=白茶”这部分就是参数
- 例如:
-
PostContent
是我们需要提交的数据,一旦填写这个参数,Url的请求会自动从GET转化为POST类型 -
Headers
是请求头,一般所有的API都是需要填写这部分的,包括Token、Content-Type等 -
Content -Type
这个参数,要看请求类型-
如果是GET类型的API请求,那么这个参数可以省略
-
如果是POST类型的API请求,那么这个参数是必填项
-
如果参数里面有"-"、空格、或者是一些特殊符号,那么就需要添加#作为前缀声明
-
-
[]
是PowerQuery的基本语法,即为Record,返回的是行数据 -
Web.Contents
返回的结果是Json数据,我们利用Json.Document将其转化为结构数据 -
Result
返回的结果,可以根据自己的需求,决定数据深化程度调整代码 -
某些API需要我们先获取一些条件,例如Token、Pages等一些其他先决条件
-
某些API需要我们循环遍历,例如获取Pages不同页面的相同信息,最终汇总一下
注意事项[1]
-
API请求以GET类型或POST类型的形式发出
-
POST类型请求只能匿名发出
案例
案例1:GET多页面数据合并
http://quote.stockstar.com/stock/ranklist_a_3_1_1.html
结果
代码
let
RequestUrl = "http://quote.stockstar.com/stock/ranklist_a_3_1_",
Function = (Pages) =>
let
GetData = Web.Contents(RequestUrl & Text.From(Pages) & ".html"),
UrlTable = Web.Page(GetData){0}[Data],
RemoveLastNData = Table.RemoveLastN(UrlTable, 1),
SelectColumns = Table.SelectColumns(
RemoveLastNData, {"代码", "简称", "流通市值(万元)", "总市值(万元)", "流通股本(万元)", "总股本(万元)"}
)
in
SelectColumns,
Result = Table.Combine(List.Transform({1..2}, Function))
in
Result
解析
-
RequestUrl
就是需要请求API的网址- 当前网址在浏览器查看可以知道是GET类型请求,且不需要Token验证
-
Funcation
添加了一个自定义函数,参数名为Pages,用来处理请求API-
GetData
是请求API的基本语法,因为API网址翻页是动态的,所以将其页面标识转化为变量Pages,当前返回结果为Html页面结构 -
UrlTable
是利用Web.Page函数,将Html源码解析为表格结构 -
RemoveLastNData
是为了删除每一页最后一行的多余数据 -
SelectColumns
是为了删除其他不需要的空白列
-
-
Result开始调用上面的自定义函数,用来循环合并数据
-
List.Transform
可以让第一参数里面的每个值,都执行第二参数的操作 -
{1..2}
是利用“…”构建了连续的列表,“…”前后分别代表开始和结束 -
Table.Combine
的作用是为了合并多个表
-
案例2:POST多页面数据合并
http://www.drugfuture.com/cndrug/national.aspx?ApprovalDateStart=2016-01-01&ApprovalDateEnd=2016-12-31
结果
代码
let
RequestUrl = "http://www.drugfuture.com/cndrug/national.aspx",
Headers = [#"Content-Type" = "application/x-www-form-urlencoded"],
GetQu