【问题标题】:How can I make Invoke-RestMethod use the default web proxy?如何让 Invoke-RestMethod 使用默认的 Web 代理?
【发布时间】:2013-12-09 13:10:08
【问题描述】:

以下在我不使用网络代理的机器上运行良好。

return Invoke-RestMethod 
   -Uri $server$url 
   -ContentType $contentType 
   -Headers $headers 
   -Method $method 
   -UseDefaultCredentials 

注意:$server$url 是一个 https 地址,类似于 https://somewhere.example.com/api/data

现在我正试图让它在公司环境中工作,但我收到 401 错误。

我认为这是因为有一个用 proxy.pac 文件定义的公司代理。我已经确认我可以从 Internet Explorer 访问 $server$url URI。我需要做什么才能让Invoke-RestMethod 命令使用相同的设置工作?

我已尝试添加-proxy 参数

$proxy = [System.Net.WebRequest]::GetSystemWebProxy()
$proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials

return Invoke-RestMethod 
    -Uri $server$url 
    -ContentType $contentType 
    -Headers $headers 
    -Method $method 
    -UseDefaultCredentials 
    -Proxy $proxy 
    -ProxyUseDefaultCredentials

但 -Proxy 参数需要一个 URI 而不是 IWebProxy 对象。

【问题讨论】:

    标签: rest powershell


    【解决方案1】:

    接受的答案让我开始了。这是完整版

    $headers = @{"X-My-ApiKey"=$apiKey}
    $contentType = "application/json"
    
    $proxyUri = [Uri]$null
    $proxy = [System.Net.WebRequest]::GetSystemWebProxy()
    if ($proxy)
    {
        $proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
        $proxyUri = $proxy.GetProxy("$server$url")
    }
    
    if ("$proxyUri" -ne "$server$url")
    {
        Write-Host "Using proxy: $proxyUri"
        return Invoke-RestMethod -Uri $server$url -ContentType $contentType -Headers $headers -Method $method -UseDefaultCredentials -Proxy $proxyUri -ProxyUseDefaultCredentials
    }
    else
    {
        return Invoke-RestMethod -Uri $server$url -ContentType $contentType -Headers $headers -Method $method -UseDefaultCredentials
    }
    

    【讨论】:

    • 在我的具体情况下,我所做的只是添加参数-UseDefaultCredentials 和宾果游戏。
    【解决方案2】:

    编辑:一旦提供了不正确的地址,该命令将不再起作用,并返回提供的地址而不是代理地址.. 不要使用这个: 使用this 中的代码 sn-p,我可以从 PowerShell 中检索代理 uri:

    [System.Net.WebRequest]::DefaultWebProxy.GetProxy([uri]("http://www.google.com"))
    

    改用这个:

    [System.Net.WebRequest]::GetSystemWebProxy().GetProxy("http://www.google.com")
    

    当 uri 无效时,它仍然返回提供的 URI(或抛出),但是一旦提供了正确的 uri,它就会重新开始工作。

    【讨论】:

    • 嗯...在我的例子中,URL 是一个 https 地址。然后GetSystemWebProxy().GetProxy() 返回ServicePointManager 不支持使用https 方案的代理
    • 由于某种原因,在运行此命令[System.Net.WebRequest]::GetSystemWebProxy().GetProxy("https://www.google.com") 后,我的原始代码又开始工作了。
    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2017-07-26
    • 1970-01-01
    相关资源
    最近更新 更多