HTTP客户端错误403

时间:2014-11-25 13:44:56

标签: delphi httpclient http-status-code-403 indy10

我遇到以下问题:当我点击网站上的按钮(http://domain-location.com)时,我会收到回复给我的信息,并且网址已更改为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时,没有问题。 知道怎么解决吗?

3 个答案:

答案 0 :(得分:5)

问题在于UserAgent:

function DoRequest(aVal: string): string;
  const DOMAIN = 'http://domain-location.com';
var
  request: TIdHTTP;
  urlRequest: string;
begin
  request := TIdHTTP.Create(nil);

  try
    try
      request.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36';
      urlRequest := DOMAIN + '?key=' + aVal;
      Result := request.Get(urlRequest);
    except on E: Exception do
      Result := e.Message;
    end;
  finally
    request.Free;
  end;
end;

答案 1 :(得分:4)

如果涉及到cookie,那么您应首先GET原始HTML页面,以便服务器可以发送任何需要回传的cookie,当按钮被点击&#34;然后你就可以了GET下一页,让TIdHTTP发布已收到的任何Cookie。

试试这个:

function DoRequest(const aVal: string): string;
const
  DOMAIN = 'http://domain-location.com';
var
  request: TIdHTTP;
begin
  try
    request := TIdHTTP.Create(nil);
    try
      request.Get(DOMAIN, TStream(nil)); // get cookies, discard HTML
      Result := request.Get(DOMAIN + '?key=' + TIdURI.ParamsEncode(aVal));
    finally
      request.Free;
    end;
  except
    on E: Exception do
      Result := e.Message;
  end;
end;

答案 2 :(得分:3)

检查浏览器发送的实际请求。 403表明正在进行某种身份验证。这可能是您的浏览器拥有的令牌或cookie,并随请求一起发送,但您的示例客户端应用程序可能没有。打开浏览器调试面板以检查浏览器发出的get请求,并将其与应用程序生成的请求进行比较。我打赌会有一些不同。