gpt4 book ai didi

rest - 如何从 PSMethod 类型返回有意义的结果

转载 作者:行者123 更新时间:2023-12-02 23:55:54 26 4
gpt4 key购买 nike

我正在对政府数据库进行简单的 API 调用。我对地址字段感兴趣。虽然它看起来像一个哈希,但我无法获得值。

这是 API 调用:

$searchTerm = "01446754"
$url = "https://api.companieshouse.gov.uk/search?q=$searchTerm"
$apiKey = "myregisteredapikey"

$authVal = "Basic " + [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($apikey))

$header = @{
"Authorization"=$authVal
}

$response = Invoke-RestMethod -Uri $url -Headers $header -Method Get -ContentType 'application/json'
$results = $response.items
$results

在此示例中,按公司编号搜索,我得到以下数据集:
links                  : @{self=/company/01446754}
description_identifier : {incorporated-on}
kind : searchresults#company
company_status : active
address : @{premises=Lakeside Works Rocester; postal_code=ST14 5JP; locality=Staffordshire; address_line_1=Uttoxeter}
date_of_creation : 1979-09-05
address_snippet : Lakeside Works Rocester, Uttoxeter, Staffordshire, ST14 5JP
description : 01446754 - Incorporated on 5 September 1979
company_type : ltd
company_number : 01446754
title : JCB LIMITED

一切都好,直到我这样做 $results.Address返回:
OverloadDefinitions                                                                                        
-------------------
System.Object&, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Address(int )

我不确定这告诉我什么。 Intellisense 在末尾添加一个括号; (我认为)表明它是一个对象,所以我尝试了:
PS C:\> $results.Address()
Cannot find an overload for "Address" and the argument count: "0".
At line:1 char:1
+ $results.Address()
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest

显然,我不知道我在这里做什么,但我尝试使用“地址”哈希中返回的字段之一:
PS C:\> $results.Address('postal_code')
Cannot convert argument "0", with value: "postal_code", for "Address" to type "System.Int32": "Cannot convert value "postal_code" to type "System.Int32". Error: "Input
string was not in a correct format.""
At line:1 char:1
+ $results.Address('postal_code')
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

所以它似乎想要一个整数,所以我尝试了:
PS C:\> $results.Address(1)
Exception calling "Address" with "1" argument(s): "Operation could destabilize the runtime."
At line:1 char:1
+ $results.Address(1)
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : VerificationException

好的,让我们看看“地址”是什么类型:
PS C:\> $results.Address.gettype()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSMethod System.Management.Automation.PSMethodInfo

那么如何从 PSMethod 类型的对象中获取值呢?

最佳答案

好的,所以我明白了。虽然我不确定这是否是最好的方法。我不明白为什么明显的哈希表是 PSMethod 类型。但是我不是开发人员:-(。

$results.Address.Invoke(0).address返回:

PS C:\> $results.Address.Invoke(0).address

address_line_1 locality postal_code premises
-------------- -------- ----------- --------
Uttoxeter Staffordshire ST14 5JP Lakeside Works Rocester

所以把它们放在一起,我最终得到:
$searchTerm = "01446754"
$url = "https://api.companieshouse.gov.uk/search?q=$searchTerm"
$apiKey = "myregisteredapikey"


$authVal = "Basic " + [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($apikey))

$header = @{
"Authorization"=$authVal
}

$response = Invoke-RestMethod -Uri $url -Headers $header -Method Get -ContentType 'application/json'
$results = $response.items

$oData = @()

foreach($company in $results)
{
$oAddress = $company.address

$oData += [pscustomobject]@{
CompanyName = $company.title
CompanyType = $company.company_type
CompanyNumber = $company.company_number
Date = $company.date_of_creation
Premises = $oAddress.premises
Town = $oAddress.address_line_1
Locality = $oAddress.locality
PostCode = $oAddress.postal_code

}
}

$oData

虽然在 pscustomobject 中,我不得不删除 .invoke(0).并创建对象 $oAddress在for循环中。

更新

我已经走得更远了。这个特定 API 的问题是每页(或请求)有 100 条记录的限制,因此当记录超过 100 条时,代码必须遍历页面。

我最初的示例使用“JCB”(是的,黄色挖掘机!!)作为搜索词。虽然 API 说有 448 个结果,但实际上似乎没有,所以我得到了奇怪的结果。我改为搜索“amazon”,返回 372 条记录,一切似乎都很好。

我本可以每页请求 1 个结果,这会使我的生活更简单,但这意味着 448 个单独的请求,减慢了我的代码,正如我发现的那样,我很快收到了来自服务器的错误“请求太多”,所以有一定是某个地方的天花板。显然,这个特定 API 的开发人员已经考虑到这个项目的每页限制,可以阅读关于 here 的内容。 .就个人而言,我不同意,他们担心的服务器资源占用必须不超过毫秒。如果一个人可以在一个请求中提取所有记录,或者将限制提高到一个更合理的数量,那会让生活变得更加轻松,但这是一个政府部门,他们的想法与其他人不同(恕我直言)。

无论如何,作为一个学习练习,它很有用。我已经把(无证) code on GitHub对于任何有兴趣的人。如果您有时间/倾向,请随时改进。我真的应该把这段代码放到一个模块中,但那是另一天的事了。

欢迎任何改进。

TIA。

关于rest - 如何从 PSMethod 类型返回有意义的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45236449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com