HTTP Client Error 403

I have the following problem, when I click a button on the site ( http://domain-location.com

), I get back information and the url is changed to http://domain-location.com?key=value

. I want to create a sample http client to get information easily. Here is my code:

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;

      

EDIT After the first answer, I edited my function (still not working):

 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;

      

And after the result of the query: HTTP1.1 403 Forbidden

. I checked the page and the button I click looks like this:

<form action="http:/domiain.com" method="GET">
   <input type="text" name="key">
   <input type="submit" value="Click">
</form>

      

When I type http://domain-location.com?key=value

, there is no problem. Any idea how to fix this?

+3


source to share


3 answers


The problem was 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;

      

+5


source


If cookies are used, then you need the GET

original HTML page so that the server can send all the cookies that need to be sent back when the button is clicked, and then you can the GET

next page and let it TIdHTTP

publish all the cookies it received.

Try the following:



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;

      

+4


source


Check the actual request sent by your browser. 403 assumes some authentication is happening. It could be a token or a cookie that your browser has and sends with a request, but your test client application may not have. Open the browser debug panel to check the pull request made by your browser and compare it with the one made by your application. I bet there will be some difference.

+3


source







All Articles