Rest API Explorer를 사용하여 레코드에서 정보를 검색하려는 경우

10324 단어 ServiceNow

가정



ServiceNow 내부만으로 업무가 완결되지 않고, 외부로부터 curl/shell등을 두드려, 레코드의 상태를 확인하고 싶은 경우를 상정하고(예를 들면, ST 환경과 프로덕션 환경의 설정 차이를 체크하고 싶은 경우), 조사했다 글을 쓴다.

ServiceNow 내부에서 완결하는 경우(기본형)



Rest API Exploer(system web service > rest api explorer)의 table API를 활용한다.


table api 에서는 세세하게 노코드로 설정치나 쿼리를 설정할 수 있다.
예) incident 테이블의 레코드, 필드 조건 (Number/Description/State)을 취득하는 경우

실행 결과는


중단 버튼으로 스크립트를 자동 생성해 주는 기능이 있다.


[powershell 예]

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

#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')


# Specify endpoint uri
$uri = "https://devxxxx.service-now.com/api/now/table/incident?sysparm_fields=number%2Cdescription%2Cstate&sysparm_limit=1"

# Specify HTTP method
$method = "get"

# Send HTTP request
$response = Invoke-RestMethod -Headers $headers -Method $method -Uri $uri 

# Print response
$response.RawContent

endpoint url의 구조


"https://devxxxx.service-now.com/api/now/table/incident?sysparm_fields=number%2Cdescription%2Cstate&sysparm_limit=1"
  • base_url ... h tps : // / v v t x. 세르 ゔ ぃ 세의 w. 이 m
  • table_api.../api/now/table
  • table...incident
  • target_field...?sysparm_fields=number%2Cdescription%2Cstate&
  • option...&sysparm_limit=1

  • 의 구조가 된다. 위의 조립을 GUI에서 간단하게 해주는 것이 resto api explorer의 장점. 그러나 이것은 완전하지 않고, 취득할 수 없는 테이블(sys_properties)의 존재나, 다른 환경이라고 재기록이 필요하기도 하기 때문에, 이번은 powershell로 조립한다.

    powershell



    get_incident_record.ps1
    Param (
        [parameter(mandatory)][string]$mfa
    )
    
    $conf_file = "config.json"
    $conf = Get-Content $conf_file | ConvertFrom-Json
    $user = $conf.userid
    $pass = $conf.password + $mfa
    
    $base = $conf.target_url
    $restapi = 'api/now/table'
    $table = "incident"
    $query = "?sysparm_fields=number%2Cdescription%2Cstate&"
    
    $url = $base + $restapi + $table + query
    $secpasswd = ConvertTo-SecureString $pass -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)
    
    Invoke-RestMethod $url -Credential -o datafile.txt
    

    설정 파일은 외부 파일화하여 읽어들이는 형태로 한다.

    config.json
    {
      "target_url" : "http;//(あなたのインスタンス).servicenow.com",
      "userid" : "(あなたのユーザーID)",
      "password" : "(あなたのパスワード)"
    }
    
    

    REST 인증의 MFA 대응



    REST 인증에서는, 패스워드만을 송신하는 것이 아니라, 패스워드+실시간 6자리수의 코드를 송신할 필요가 있다. 예를 들어, 계정의 패스워드가 「Pass123」이고, 현재의 6 자리 인증 코드가 「987654」인 경우, 패스워드로서 「Pass123987654」를 송신한다.
    그래서, 이번 코드의 이하 부분은 그쪽에 대응하고 있다.
    Param (
        [parameter(mandatory)][string]$mfa
    )
    ...
    $pass = $conf.password + $mfa
    

    좋은 웹페이지 즐겨찾기