【问题标题】:How to save & use a ReST response in further requests in PowerShell如何在 PowerShell 中的进一步请求中保存和使用 ReST 响应
【发布时间】:2016-03-02 05:44:29
【问题描述】:

我正在尝试在 PowerShell 中实现 ReST 请求。

请求 1:

$response = Invoke-RestMethod "my-custom-url" -Headers $headers -Method POST -Body $json -ContentType "application/json" -OutFile output.json -SessionVariable sv

请求 1 的响应:

{
  "@type": "user",
  "id": "00000703000000000010",
  "orgId": "000007",
  "name": "xxx@gmail.com",
 }

我需要保存“id”的值并将其添加到下一个请求的标头中。我怎样才能做到这一点?

----更新--添加WriteHost $response

@{@type=user; id=00000703000000000010; orgId=000007; name=xxx; createTime=2014-08-27T12:12:21.000Z; updateTime=2016-02-27
T00:40:13.000Z; createdBy=xxx@gmail.com; updatedBy=xxx; sfUsername=ppanigrahi; firstName=Pravakar; lastName=P
anigrahi; password=********; phone=9008433201; emails=xxx@gmail.com; timezone=IST; serverUrl=http://localhost:16006/saas; spiUrl
=https://localhost:8080/; icSessionId=QpXZEkqYEflJRY7h; securityQuestion=MOTHER_MAIDEN_NAME; forceChangePassword=False; uuid=C1bL60uIQqyRaF3
nXCHFkA; roles=System.Object[]; usergroups=System.Object[]}

【问题讨论】:

  • 我尝试在请求1中使用SessionVariable参数,但无法获取id的值
  • 尝试使用 Cookies.GetCookies(url) 但验证 id 的值未存储在 cookie 列表中。
  • 请编辑问题并添加您用于提出请求的代码。
  • 添加了代码sn-p

标签: rest powershell powershell-5.0


【解决方案1】:

由于您使用的是 Invoke-RestMethod,因此响应将是一个包含数据属性的对象,您可以从 $Response.id 访问 id。

我不确定您是否想尝试将“Id”作为标头值或 cookie 传递(因为您也指的是会话变量;您通常会在其中保留例如 cookie 等)。

如果您只想传递包含字段“Id”的自定义标头,您可以在下一个请求之前执行以下操作:

$headers.Add("Id",$response.id);

我假设您已经在此处预先定义了 $headers。否则,您可以直接使用 $headers = @{"Id"=$response.id}; 创建它。

然后在下一个服务调用中,就像你已经做的那样重用你的 $headers 变量。

如果您真正想要实现的是创建一个 cookie 并将其添加到您的会话(变量)中,那么您不必为每次后续调用重复自己;您应该创建一个 cookie 并执行以下操作:

$c=New-Object System.Net.Cookie;
$c.Name="Id";
$c.Path="/"
$c.Value = $response.Id;
# Make sure domain and path is matching your backend-server
$c.Domain = "foobar.com"; 
# Add cookie to your websession
$sv.Cookies.Add($c);

这将创建一个 cookie 并将其添加到您的网络会话(如果 $sv 在您的会话中)。如果您没有 webrequest 会话(在您的情况下为 $sv),您可以使用 $sv = New-Object Microsoft.PowerShell.Commands.WebRequestSession; 预先创建它;

【讨论】:

  • 尝试了同样的方法,但没有成功。它给出了 403 禁止错误。我还尝试使用-Write-Host $response.id 打印Id 的值。但这不会打印任何内容。
  • 你能打印一个例子吗?如果你写主机 $response.id 并且它是空的;那么您的服务器不会返回您编写的 JSON。如果您的第一个电话是 403;那么你没有得到任何回应。如果您不提供更多信息,我们将无法帮助您。什么版本的powershell?如果你写主机,$response 会写出什么?
  • powershell 5.0 版。修改问题以提供 $response
  • 我错过了您正在使用 -Outfile。如果您使用 outfile,结果只是保存到文件中,而不是沿管道传递。如果要将结果保存到文件并返回结果,请使用 -OutFile "Filename.something" 和 -PassThru。
  • 路径是指接受cookies的路径;例如如果您在同一个域上运行多个应用程序并希望使用路径限制 cookie。阅读更多信息,例如这里:en.wikipedia.org/wiki/HTTP_cookie(域和路径)。
【解决方案2】:

$response.id 应该包含您需要的值,因为 Powershell 会自动将 json 响应转换为 PSCustomObject。然后,您应该能够通过$headers.Add("HeaderName",$response.id) 将该值添加到您的$headers 变量中,或者使用适当的标题名称$request2Headers = @{ "HeaderName" = $response.id } 创建一个新的哈希表。

【讨论】:

  • 这有帮助。非常感谢!
猜你喜欢
  • 2013-11-17
  • 1970-01-01
  • 2016-10-05
  • 2020-01-06
  • 1970-01-01
  • 2021-08-03
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多