【发布时间】:2014-11-25 13:44:55
【问题描述】:
我遇到以下问题:当我单击站点上的按钮 (http://domain-location.com) 时,我收到了返回给我的信息,并且 URL 更改为 http://domain-location.com?key=value。
我想创建一个示例 http 客户端来轻松接收信息。这是我的代码:
function DoRequest(aVal: string): string;
const DOMAIN = 'http://domain-location.com';
var
request: TIdHTTP;
responseStream: TMemoryStream;
responseLoader: TStringList;
urlRequest: string;
begin
request := TIdHTTP.Create(nil);
responseStream := TMemoryStream.Create;
responseLoader := TStringList.Create;
try
try
// accept ranges didn't help
// request.Response.AcceptRanges := 'text/json';
// request.Response.AcceptRanges := 'text/xml';
urlRequest := DOMAIN + '?key=' + aVal;
request.Get(urlRequest, responseStream);
responseStream.Position := 0;
responseLoader.LoadFromStream(responseStream);
Result := responseLoader.Text;
except on E: Exception do
Result := e.Message;
end;
finally
responseLoader.Free;
responseStream.Free;
request.Free;
end;
end;
编辑在第一个答案之后,我编辑了我的函数(仍然无法正常工作):
function DoRequest(aVal: string): string;
const DOMAIN = 'http://domain-location.com';
var
request: TIdHTTP;
responseStream: TMemoryStream;
responseLoader: TStringList;
urlRequest: string;
uri: TIdURI;
begin
request := TIdHTTP.Create(nil);
responseStream := TMemoryStream.Create;
responseLoader := TStringList.Create;
request.CookieManager := TIdCookieManager.Create(request);
uri := TIdURI.Create(DOMAIN);
try
try
// accept ranges didn't help
// request.Response.AcceptRanges := 'text/json';
// request.Response.AcceptRanges := 'text/xml';
urlRequest := DOMAIN + '?key=' + aVal;
request.CookieManager.AddServerCookie('cookie1', uri);
request.CookieManager.AddServerCookie('cookie2', uri);
request.CookieManager.AddServerCookie('cookie3', uri);
request.Get(urlRequest, responseStream);
responseStream.Position := 0;
responseLoader.LoadFromStream(responseStream);
Result := responseLoader.Text;
except on E: Exception do
Result := e.Message;
end;
finally
responseLoader.Free;
responseStream.Free;
request.Free;
end;
end;
在我提出请求后,结果是:HTTP1.1 403 Forbidden。
我检查了页面,我点击的按钮是这样的:
<form action="http:/domiain.com" method="GET">
<input type="text" name="key">
<input type="submit" value="Click">
</form>
当我输入http://domain-location.com?key=value 时没有问题。
知道如何解决吗?
【问题讨论】:
-
传递的
aVal参数值URL是否编码?如果没有,并且需要它,请用urlRequest := DOMAIN + '?key=' + TIdURI.ParamsEncode(aVal);包装它。 -
@TLama,但如果 OP 声明
When I type http://domain-location.com?key=value there is no problem,那么网络浏览器肯定不会发送额外的application/x-www-form-urlencoded- 我假设他在网络浏览器中“输入”它。 Id 检查 cookie/UserAgent。应该嗅探 HTTP 请求以查看确切发布/接收的内容... -
@TLama 或其他一些 HTTP 标头...请参阅
403 forbidden的常见情况。 -
欢迎 :) 实际上是一条评论。而不是编辑您自己的问题,请发布答案并接受它。我也不确定,是否需要
request.Get(DOMAIN, TStream(nil));行?如果是,则还涉及 cookie。
标签: delphi httpclient http-status-code-403 indy10