我有以下问题:当我单击网站上的按钮 ( 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 时没有问题。
知道如何修复它吗?

最佳答案

问题出在 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;

关于delphi - HTTP 客户端错误 403,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27128392/

10-10 18:24
查看更多