Invoke-WebRequest请求http中增加Headers出现错误


PowerShell交流中心分类: QuestionsInvoke-WebRequest请求http中增加Headers出现错误
0
joyps asked 9 年 ago

请求一个网址,在headers中需要增加Date,出现“Invoke-WebRequest : 必须使用适当的属性或方法修改“Date”标头。”

PS C:\Users\TT> $test4 = Invoke-WebRequest "http://www.baidu.com" -Headers @{"Date" = "Wed, 09 Mar 2016 03:32:47 GMT"} -UseBasicParsing

请大神出手相救呀
4 Answers
1
Best Answer
Mooser Lee 管理员 answered 9 年 ago

这是PowerShell 3.0的一个bug:Invoke-WebRequest的底层调用的是.NET中的[System.Net.WebRequest]类。
在这个类中,从参数-header传过来的键值对,有的可以直接塞进属性Headers,

$request.Headers.Add('key','value')

有的却不能这样做否则就会出错:
“The ‘Date’ header must be modified using the appropriate
property or method.
不幸的是正好在开发PowerShell 3.0时,工程师就犯了这个错误。
现在你有两个选择:

  1. 升级PowerShell 的高版本,比如4.0+
  2. 直接在PowerShell中调用底层的System.Net.WebRequest.

调用System.Net.WebRequest类似的code如下,具体需要你自己更改。

Function Send-WebRequest
{
 param(
 [string]$Url,
 [string]$Data,
 [switch]$Post
 )
 $request = [System.Net.WebRequest]::Create($Url)
 $request.ContentType = "application/json"
 #关键点在这里:
 $request.Date="Wed, 09 Mar 2016 03:32:47 GMT"
 if($Post)
 {
 $request.Method = "POST"
 $requestStream = $request.GetRequestStream()
 $streamWriter = New-Object System.IO.StreamWriter($requestStream)
 $streamWriter.Write($Data)
 $streamWriter.Close()
 $requestStream.Close()
 }
 $response = $request.GetResponse()
 if($response -ne $null)
 {
 $streamReader = New-Object System.IO.StreamReader($response.GetResponseStream())
 $result = $streamReader.ReadToEnd()
 $result
 }
}

 

0
Mooser Lee 管理员 answered 9 年 ago

你的电脑是什么系统啊,我这边没有错误啊,可以直接运行的。

PS> Invoke-WebRequest "http://www.baidu.com" -Headers @{"Date" = "Wed, 09 Mar 2016 03:32
:47 GMT"} -UseBasicParsing


StatusCode : 200
StatusDescription : OK
Content : <!DOCTYPE html><!--STATUS OK--><html><head><meta
http-equiv="content-type" content="text/html;charset=utf-8"><meta
http-equiv="X-UA-Compatible" content="IE=Edge"><meta
content="always" name="referrer"...
RawContent : HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: Keep-Alive
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
Date: Wed, 09 Mar 2016 04:24:27 GMT
Set-Cookie: BAIDUID=C476A4997C0...
Forms :
Headers : {[Transfer-Encoding, chunked], [Connection, Keep-Alive], [Vary,
Accept-Encoding], [Content-Type, text/html; charset=utf-8]...}
Images : {@{outerHTML=<img hidefocus="true"
src="//www.baidu.com/img/bd_logo1.png" width="270" height="129">;
tagName=IMG; hidefocus=true; src=//www.baidu.com/img/bd_logo1.png;
width=270; height=129}, @{outerHTML=<img
src="//www.baidu.com/img/baidu_jgylogo3.gif" alt="到百度首页"
title="到百度首页">; tagName=IMG;
src=//www.baidu.com/img/baidu_jgylogo3.gif; alt=到百度首页;
title=到百度首页}}
InputFields : {}
Links : {@{outerHTML=<a href="/" id="result_logo" onmousedown="return
c({'fm':'tab','tab':'logo'})"><img
src="//www.baidu.com/img/baidu_jgylogo3.gif" alt="到百度首页"
title="到百度首页"></a>; tagName=A; href=/; id=result_logo;
onmousedown=return c({'fm':'tab','tab':'logo'})}, @{outerHTML=<a
href="javascript:;" name="ime_hw">手写</a>; tagName=A;
href=javascript:;; name=ime_hw}, @{outerHTML=<a
href="javascript:;" name="ime_py">拼音</a>; tagName=A;
href=javascript:;; name=ime_py}, @{outerHTML=<a
href="javascript:;" name="ime_cl">关闭</a>; tagName=A;
href=javascript:;; name=ime_cl}...}
ParsedHtml :
RawContentLength : 98416



PS>
0
joyps answered 9 年 ago

@Mooser Lee
发现不会在你的回答下评论,只能重开一个回答了
我的系统是Win7的,Powershell是3.0的

Mooser Lee 管理员 replied 9 年 ago

今天终于有时间搭建了一个win7+PS3.0的环境。

Mooser Lee 管理员 replied 9 年 ago

PowerShell 4.0没有问题,我在Windows Server 2012 R2上面测试通过。

0
joyps answered 9 年 ago

@Mooser Lee 我升级到4.0了,没有问题了,可能是3.0的缘故。 在F12里看到Comment的提交按钮,可在猎豹浏览器里界面上就是没有,也是醉了

Mooser Lee 管理员 replied 9 年 ago

现在找到问题的根源了,是百度云加速对JS的压缩引起的,暂时去掉了加速功能。