当前位置: 首页 > 知识库问答 >
问题:

到ServiceNow的Powershell Rest API无法创建请求

谯阳伯
2023-03-14

这是我在Stackoverflow上的第一篇文章,如果我的文章格式化或提交不正确,请告诉我。我试图使用powershell连接到我的ServiceNow实例并发布服务目录请求。但是,我收到错误(400)错误请求:

Invoke-RestMethod : The remote server returned an error: (400) Bad Request.
At line:37 char:13
+ $response = Invoke-RestMethod -Headers $headers -Method Post -Uri $ur ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

到目前为止,我已经能够通过ServiceNow REST API Explorer使用URI:

POST https://myinstance.service-now.com/API/sn_sc/v1/serviceCatalog/items/3a05b357db2443009906540adc961945/order_now


成功发布服务目录请求,其原始响应主体为:

{“sysparm_quantity”:“1”,“variables”:{“requested_for”:“guest”,“request_type”:“new account”906540ADC96198C“}}

我还可以使用Powershell成功地将事件发送到ServiceNow。考虑到这一点,我认为我没有任何访问问题,而是代码的$body部分的语法/格式问题。任何帮助都将不胜感激!


# Eg. User name="admin", Password="admin" for this code sample.
$user = "user"
$pass = "pass"

# Build auth header
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $pass)))

# Set proper headers
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add('Authorization',('Basic {0}' -f $base64AuthInfo))
$headers.Add('Accept','application/json')
$headers.Add('Content-Type','application/json')

# Specify endpoint uri
$uri = "https://myinstance.service-now.com/api/sn_sc/servicecatalog/items/3a05b357db2443009906540adc961945/order_now"

# Variables
$RequestedFor = "Guest"
$RequestType = "New Account"
$Vendor1 = "2437ffdbdb2443009906540adc96198c"

# Specify request body
$body = @{
sysparm_quantity = "1"
Requested_For = $RequestedFor
Request_Type = $RequestType
website_login = $Vendor1
}

$bodyJson = $body | ConvertTo-Json;

#Convert to UTF8 array to support special chars such as the danish "�","�","�"
$utf8Bytes = [System.Text.Encoding]::UTf8.GetBytes($bodyJson)

# Send HTTP request
$response = Invoke-RestMethod -Headers $headers -Method Post -Uri $uri -Body $utf8Bytesn -ContentType "application/json" -UseBasicParsing

$response.RawContent



POST https://myinstance.service-now.com/api/sn_sc/v1/servicecatalog/items/3a05b357db2443009906540adc961945/order_now HTTP/1.1
Host: myinstance.service-now.com
User-Agent: Fiddler
Content-Type: application/json
Content-Length: 142
Authorization: Basic myauthorizationcode

{"sysparm_quantity":"1","variables":{"requested_for":"Guest","Request_Type":"New Account","website_login":"2437ffdbdb2443009906540adc96198c"}}

HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=ED953CDDB8BB202C5B8D55558003F9B6;Secure; Path=/; HttpOnly
Set-Cookie: glide_user="";Secure; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly
Set-Cookie: glide_user_session="";Secure; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly
Set-Cookie: glide_user_route=glide.c87651ce1f062e6286a35c971e448b2c;Secure; Expires=Thu, 04-Apr-2086 19:33:19 GMT; Path=/; HttpOnly
X-Is-Logged-In: true
Set-Cookie: glide_session_store=B598F91313FC1340B17EDB128144B0E7;Secure; Expires=Sat, 17-Mar-2018 16:49:12 GMT; Path=/; HttpOnly
Pragma: no-store,no-cache
Cache-control: no-cache,no-store,must-revalidate,max-age=-1
Expires: 0
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sat, 17 Mar 2018 16:19:13 GMT
Server: ServiceNow
Set-Cookie: BIGipServerpool_myinstance=2441092106.40510.0000; path=/
Strict-Transport-Security: max-age=63072000; includeSubDomains

59
{"result":{"request_number":"REQ0026993","request_id":"7598fd1313fc1340b17eda128144b043"}
1
}
0

共有1个答案

西门山
2023-03-14

感谢@saj为我指引了正确的方向,并建议Fiddler帮助检查我对ServiceNow的请求和响应。问题是我没有在json主体中指定什么应该定义为变量。例如。

$body = @{
'sysparm_quantity' = '1'
'variables' = @{
'requested_for' = "$RequestedFor"
'Request_Type' = $RequestType
'website_login' = $Vendor1
}}

我还删除了将json转换为UTF8数组的代码部分,因为这是不必要的。

$utf8Bytes = [System.Text.Encoding]::UTf8.GetBytes($bodyJson)
 类似资料:
  • 我正在尝试将hibernate orm映射工具配置到我的java类,并使用PostgreSQL作为我的数据库,并将密码配置为“password”。当我尝试运行该应用程序时,我在控制台日志中遇到错误:无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]。我已经在老版本的hibernate上尝试过这个方法,它很管用。我现在使用的hib

  • 我正在使用XAMPP服务器和Eclipse IDE来运行一个hibernate程序。但我得到以下错误: **2017年4月21日12:46:38 PM org.Hibernate.version logVersion Info:hhh000412:Hibernate Core{5.2.8.final}2017年4月21日12:46:38 PM org.Hibernate.cfg.Environme

  • 我的代码更长,但我没有复制所有的代码,我看到程序停在这里 对不起我的英语。

  • 问题内容: 我的程序包含以下行,并且此时就挂起了,我不太确定为什么。 在Eclipse中进行调试时,如果我尝试在“显示”视图中评估“ new PoolingHttpClientConnectionManager()”,则会出现以下错误: 我正在使用org.apache.httpcomponents中的httpclient.jar版本4.3.1。 还有其他人遇到这个问题吗?有什么办法吗?还是我在做傻

  • 当我尝试将部署创建为类型作业时,它不会提取任何图像。 下面是. yaml: 你能在这里引路吗? 问候,维卡斯

  • 问题内容: 我正在使用node.js,并将音频流式传输到我的node.js服务器。现在,我在构建音频Blob的过程中注意到: 我在新的Blob处收到ReferenceError。似乎不支持Blob。如何创建要使用node.js fs模块保存的Blob。 谢谢你们! 问题答案: 解决此问题的方法是创建一个可以在数组缓冲区和节点缓冲区之间转换的函数。 将二进制NodeJS缓冲区转换为JavaScrip