API Powershell Rest для ServiceNow, не создающий запрос

Это мое первое сообщение о Stackru, пожалуйста, дайте мне знать, если мое сообщение не отформатировано или отправлено неправильно и т. Д. Я пытаюсь использовать powershell для подключения к моему экземпляру ServiceNow и POST-запроса каталога услуг. Тем не менее я получаю сообщение об ошибке (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


До сих пор мне удавалось успешно POST запросить каталог службы через API-интерфейс REST ServiceNow, используя URI:

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

с необработанным телом ответа:

{"sysparm_quantity": "1", "variable":{"required_for":"Guest","Request_Type":"New Account","website_login":"2437ffdbdb2443009906540adc96198c"}}

Я также смог использовать Powershell для успешного POST инцидента в 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



По совету пользователя Saj я тестировал POST-запрос к ServiceNow от Fiddler. Запрос был успешно создан в ServiceNow. Пожалуйста, смотрите захваченную сессию Fiddler ниже.

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 ответ

Спасибо @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)
Другие вопросы по тегам