2013-08-16 39 views
5

Tôi cố gắng để thực hiện cuộc gọi RestAPI đến một dịch vụ mà quy định cụ thể trong đó là tài liệu hướng dẫn như sau:Powershell v3 Invoke-RestMethod Headers

Một Integration Server có thể đáp ứng trong định dạng XML và JSON. Sử dụng một trong các tiêu đề sau chấp nhận trong yêu cầu của bạn:

  1. chấp nhận: application/json, /.
  2. chấp nhận: application/xml, /

Nếu chấp nhận tiêu đề không bao gồm application/xml, application/json hoặc /, các máy chủ tích hợp sẽ phản ứng với một "406 phương pháp không thể chấp nhận được" mã trạng thái.

đang powershell của tôi trông như thế này Invoke-RestMethod -URI https://URL/ticket -Credential $cred -Method Get -Headers @{"Accept"="application/xml"}

Nhưng tôi nhận được lỗi sau liên quan đến tiêu đề: Invoke-RestMethod : This header must be modified using the appropriate property or method. Parameter name: name

Ai đó có thể giúp tôi với sự hiểu biết lý do tại sao PowerShell sẽ không cho tôi ghi rõ Chấp nhận tiêu đề ? Hoặc là có một phương pháp khác tôi đang thiếu ở đây?

Cảm ơn

+2

Chỉ cần một lưu ý rằng lỗi này có đã được sửa chữa trong các phiên bản PowerShell mới hơn. –

Trả lời

1

Tôi tin tiêu đề này được bảo vệ và bạn nên chỉ định tiêu đề này trong WebRequest. Theo Microsoft Connect nó là một lỗi:

Cách giải quyết của việc sử dụng -ContentType cho phép 'application/xml' được xác định nhưng điều này không giúp người sử dụng để xác định phiên bản hoặc các mặt hàng khác thường được tìm thấy trong Chấp nhận tiêu đề.

Nhưng nó chỉ hoạt động trong một số cảnh quan nhất định. Tôi không biết bạn đang cố gắng gọi dịch vụ gì, vì vậy tôi không thể kiểm tra giả định của mình.

3

Kể từ Accept header could not be specified cho không Invoke-RestMethod cũng không Invoke-WebRequest trong PowerShell V3, bạn có thể xem xét các chức năng sau đó mô phỏng chừng mực nào đó Invoke-RestMethod:

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 
} 

Ví dụ:

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

Execute-Request -Url "https://URL/ticket" -Credentials $credentials -Header @{"Accept" = "application/json"} -ContentType "application/json"