根据我之前看到的一些问题,我在Inno Setup中使用WinHttpRequest
向网络服务器GET
发出localhost:8000
请求。下面的最小代码,请求是内置的Django调试服务器(python manage.py runserver
)。
procedure InitializeWizard();
var
WinHttpReq: Variant;
url: string;
HTTPREQUEST_SETCREDENTIALS_FOR_SERVER: integer;
begin
url := 'http://localhost:8000/odbc/test/';
HTTPREQUEST_SETCREDENTIALS_FOR_SERVER := 0;
WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
WinHttpReq.Open('GET', url, false);
WinHttpReq.SetRequestHeader('Accept','application/json');
WinHttpReq.SetCredentials('username','password',HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
WinHttpReq.Send();
MsgBox(WinHttpReq.Status, mbInformation, MB_OK);
MsgBox(WinHttpReq.ResponseText, mbInformation, MB_OK);
end;
这为我提供了403,未提供身份验证凭据。
相反,Python请求库中的此代码可以成功运行。
>> import requests
>> r = requests.get('http://localhost:8000/odbc/test/', auth=('username','password'))
>> r.status_code
200
我是否误解了WinHttpRequest
对象的工作原理?因为Wireshark确认在带有Python请求的标头中发送了Authorization: Basic *hashstring*
标头,但在WinHttpRequest
情况下没有。一个可能的解决方法是自己为WinHttpRequest
对象设置标题,但我只是好奇我是否做错了。
数据包捕获的要点:https://gist.github.com/anonymous/597468ba76b59dae4a8d7809ee1c6feb
Wireshark截图:
答案 0 :(得分:1)
我的猜测是这是WinHttpRequest
和你的“Django调试服务器”之间的不兼容。
WinHttpRequest
仅在受到Authenticate
标头的服务器质询后才会发送WWW-Authenticate
标头。
您的服务器的403响应中没有此类标头。因此WinHttpRequest
不会发送Authorization
标题。
解决方案是:
让您的服务器返回WWW-Authenticate
标题(理想情况下是401状态 - 尽管WinHttpRequest
不需要这样做。)
通过以下方式明确发送Authenticate
标题:
WinHttpReq.SetRequestHeader('Authorization', 'Basic ???');