从静止页面获取页面结果API:最佳实践
对休息API来说相当新颖,并且只做了一些相当基本的查询以获得我目前需要的内容。从静止页面获取页面结果API:最佳实践
写的是翻出所有使用其他的设备的一个新的PowerShell脚本:
$url = "https://my-site.com/internal/api"
然后查询所有设备,并给一个变量赋值的结果,所以我就可以去,并且做的事情与该变量后来在我的整个脚本的不同点:
$devices = Invoke-RestMethod -uri "$url/devices" -UseDefaultCredentials -Method Get -ContentType "application/json"
有超过一万的结果,我想要做的是能在所有返回的页面搜索的结果。
到目前为止,我已经工作了,我可以做这样的事情让一个页面中的所有结果:
$devicespagetest = Invoke-RestMethod -uri "$url/devices?pagesize=99999" -UseDefaultCredentials -Method Get -ContentType "application/json"
这是不好的做法?
是否有更高效或程序化的方式来实现这一点,而不是像我上面那样做?
我真的不确定我们使用了多少Rest API,但我知道我们不会将它与Jira或Confluence整合。
您正在调用自己开发的API吗?
编辑:刚刚看到您在标签中调用WordPress API。 WordPress offers pagination links,并通过自定义标题提供有用的分页信息。
通常,REST API在通过查询参数(例如:“offset”和“max”)返回资源列表时提供分页支持。偏移量参数指示应跳过多少结果,并且max(或您的案例中的页面大小)确定要获取的结果的最大值。
例如,http://myapi.com/persons?_offset=0&_max=20代表您的列表中的前20个人。在HATEOAS限制的情况下,建议提供HTTP链接响应标头,以便客户端知道如何使用“上一个”,“第一个”,“下一个”和“最后”关系(在RFC 5988中标准化)。
例如:
GET /persons?_offset=30&_max=10 HTTP/1.1
Host: myapi.com
Accept: application/json
结果如下回应:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 934
Link: <http://myapi.com/persons?_offset=0&_max=10>; rel="first"
Link: <http://myapi.com/persons?_offset=20&_max=10>; rel="previous"
Link: <http://myapi.com/persons?_offset=40&_max=10>; rel="next"
{body}
为了保护服务器的客户端请求整个列表资源(即没有指定分页参数)时,建议采用以下方法。当客户端请求列表资源时(例如http://myapi.com/persons),服务器将客户端重定向到第一个X(例如10个)项目。
相应HTTP会话如下所示:下面的响应
GET /persons HTTP/1.1
Host: myapi.com
Accept: application/json
结果:
HTTP/1.1 303 See Other
Location: http://myapi.com/persons?_offset=0&_max=10
接着,客户端遵循重定向:
GET /persons?_offset=0&_max=10 HTTP/1.1
Host: myapi.com
Accept: application/json
这导致以下回应:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 850
Link: <http://myapi.com/persons?_offset=40&_max=10>; rel="next"
Link: <http://myapi.com/persons?_offset=120&_max=10>; rel="last"
{body}
但是,请注意,然而,重定向可能是您需要CORS(Cross Origin Resource Sharing)的环境中的问题的原因。在这种情况下,由GET /人检索的部分列表的表示可以简单地指示检索了多少人以及总共有多少人(可选)。
如果您的API提供了这样的导航链接,那么最好使用它们并实现与Invoke-RESTMethod
的循环并为您的搜索建立索引,而不是一次获取10000个结果,这将给您的服务器带来不必要的压力。但是不知道你的用例,很难给你一个适当的建议。
感谢大卫
基础上得到一个previousurl和nexturl价值,我已经把下面一起来:
$Devurl = "https://my-site.com/internal/api"
$restResults = Invoke-RestMethod -uri "$Devurl/$device" -UseDefaultCredentials -Method Get -ContentType "application/json"
$resultpages = $restResults.Pages
$incpages = ''
$testarray = @()
Do {
[int]$incpages += 1
$url = ($restResults.nexturl) -replace 'page=1',"page=$incpages"
$url
$getresults = Invoke-RestMethod -uri $url -UseDefaultCredentials -Method Get -ContentType "application/json"
$testarray += $getresults.Models
$resultpages -= 1
} while ($resultpages -gt 0)
如果我再筛选结果:
$testarray | where {$_.os -like '*windows*'} | select hostname,os
我见我期望的。
这是你说的那种循环吗?
感谢您的回复和建议David。 不是我不,它已经存在于我们的组织中。 看起来它确实支持这样的导航链接(删除标准方法等以适合): PS C:\ windows \ system32> $ devicespagetest |克 名称 ---- 计数 NextUrl 页面 每页 PreviousUrl 我会期待实现与调用,RESTMethod循环 – J1raya