Powershell v4 Invoke-RestMethod: HTTP-статус 406

Привет, я запускаю следующую команду Invoke-RestMethed в Powershell v4, но выдает ошибку HTTP 406.

Invoke-RestMethod -Method Post -Uri $url -Headers $head -ContentType "application/xml" -Body $body -OutFile output.txt

Я внес следующие изменения в заголовок:

$head = @{"Authorization"="Basic $auth"; "Accept"="*/*"}

Насколько я понимаю, сервер принимает запрос в формате xml, но возвращается в формате JSON, и, возможно, это вызывает проблему? Я попытался изменить заголовок на "Accept" = "application / json", но получил ту же ошибку.

Полная ошибка:

Invoke-RestMethod: HTTP Status 406 - тип Описание сообщения отчета о состоянии Ресурс, идентифицированный этим запросом, способен генерировать только ответы с характеристиками, неприемлемыми в соответствии с заголовками запроса "accept".


person user3784080    schedule 12.01.2017    source источник
comment
Не зная, с каким URL-адресом вы работаете, трудно дать какое-либо предложение, поскольку, по моему опыту, проблема, вероятно, специфична для этого URL-адреса.   -  person TravisEz13    schedule 13.01.2017
comment
Это внутренний URL-адрес VMware NSX Manager $Url = "https://nsxmgr-l-01a.corp.local/api/1.0/nsx/cli?action=execute"   -  person user3784080    schedule 13.01.2017
comment
Вы пробовали удалить заголовок Accept? Если посмотреть на другие образцы, которые вызывают API NSX с помощью PowerShell, они используют только заголовок авторизации.   -  person TravisEz13    schedule 13.01.2017
comment
Да, изначально я сделал вызов api без принятия, просто авторизация в заголовке, но я получил эту ошибку, поэтому я добавил Accept, но все равно получаю ту же ошибку! Также у большинства вызовов api NSX нет тела с xml-кодом в нем, и они работают нормально, но для некоторых вызовов требуется xml-код, который не работает!   -  person user3784080    schedule 13.01.2017
comment
[ссылка] (stackoverflow.com/questions/18278977/) предполагает Since Accept header could not be specified for neither Invoke-RestMethod nor Invoke-WebRequest in PowerShell V3 Это не относится к PowerShell v4, верно?   -  person user3784080    schedule 13.01.2017
comment
Я знаю, что заголовок accept работает в PowerShell V5 для функции Invoke-WebRequest. Если вы используете Invoke-WebRequest, вам обязательно нужно указать заголовок Accept. Обновление: подтвержденный заголовок принятия работает для Invoke-RestMethod в PowerShell V5.1   -  person TravisEz13    schedule 13.01.2017


Ответы (1)


В StackOverflow есть прекрасная функция для решения этой проблемы. Вот ссылка: Execute-Request

Это должно вам помочь:

Function Execute-Request()
{
Param(
  [Parameter(Mandatory=$True)]
  [string]$Url,
  [Parameter(Mandatory=$False)]
  [System.Net.ICredentials]$Credentials,
  [Parameter(Mandatory=$False)]
  [bool]$UseDefaultCredentials = $True,
  [Parameter(Mandatory=$False)]
  [Microsoft.PowerShell.Commands.WebRequestMethod]$Method = [Microsoft.PowerShell.Commands.WebRequestMethod]::Get,
  [Parameter(Mandatory=$False)]
  [Hashtable]$Header,  
  [Parameter(Mandatory=$False)]
  [string]$ContentType  
)

   $client = New-Object System.Net.WebClient
   if($Credentials) {
     $client.Credentials = $Credentials
   }
   elseif($UseDefaultCredentials){
     $client.Credentials = [System.Net.CredentialCache]::DefaultCredentials 
   }
   if($ContentType) {
      $client.Headers.Add("Content-Type", $ContentType)
   }
   if($Header) {
       $Header.Keys | % { $client.Headers.Add($_, $Header.Item($_)) }  
   }     
   $data = $client.DownloadString($Url)
   $client.Dispose()
   return $data 
}

Использование:

Execute-Request -Url "https://URL/ticket" -UseDefaultCredentials $true

Execute-Request -Url "https://URL/ticket" -Credentials $credentials -Header @{"Accept" = "application/json"} -ContentType "application/json"
person Ranadip Dutta    schedule 13.01.2017
comment
Спасибо @ Ranadip К сожалению, я не могу добавить -Body к этой функции. - person user3784080; 17.01.2017