簡體   English   中英

奇怪的Indy重定向帖子

[英]Weird indy redirect post

我正在嘗試使用Indy發送發帖請求,但遇到了一些問題。 在某種形式下,我具有TIdHTTP,TIdSSLIOHandlerSocketOpenSSL和TIdCookieManager,它們具有以下屬性:

TIdHTTP:

IdHTTP1.IOHandler := FSSLIO;
IdHTTP1.AllowCookies := True;
IdHTTP1.HandleRedirects := True;
IdHTTP1.ProxyParams.BasicAuthentication := False;
IdHTTP1.ProxyParams.ProxyPort := 0;
IdHTTP1.Request.ContentLength := -1;
IdHTTP1.Request.Accept := 'text/html, */*';
IdHTTP1.Request.BasicAuthentication := False;
IdHTTP1.Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
IdHTTP1.HTTPOptions := [hoKeepOrigProtocol, hoForceEncodeParams];
IdHTTP1.OnRedirect := IdHTTP1Redirect;
IdHTTP1.CookieManager := IdCookieManager1;        

TIdSSLIOHandlerSocketOpenSSL:默認值

TIdCookieManager:默認值

OnRedirect程序:

Handled := True;

在一個按鈕中,以下請求:

Params := TStringStream.Create('asdf=asdf',TEncoding.UTF8);    
edtmemo1.Text := IdHTTP1.Post('https://www.detran.mg.gov.br/habilitacao/1-habilitacao-quero-ser-condutor/consultar-resultado-exame-legislacao/-/busca_resultado_exames/', Params);
Params.Free;

但是返回響應代碼為301的錯誤,但更奇怪的是該位置與我嘗試發送的網址相同,因此它進入了無限循環。

響應

HTTP/1.1 301 Moved Permanently
Date: Thu, 31 Aug 2017 20:23:32 GMT
Server: Apache
X-Powered-By: PHP/5.3.5
P3P: CP="A politica de privacidade deve estar disponivel no site ou pode ser solicitada via fale conosco."
Set-Cookie: SECCCAKEPHP=e19ttp30m5380ih41qal0gipg2; expires=Sat, 09-Sep-2017 04:23:32 GMT; path=/
Location: https://www.detran.mg.gov.br/habilitacao/1-habilitacao-quero-ser-condutor/consultar-resultado-exame-legislacao/-/busca_resultado_exames/
Cache-Control: max-age=604800
Expires: Thu, 07 Sep 2017 20:23:32 GMT
Content-Length: 0
Content-Type: text/html; charset=utf-8

卷曲測試:

curl -vv -X POST -F 'asdf=asdf' https://www.detran.mg.gov.br/habilitacao/1-habilitacao-quero-ser-condutor/consultar-resultado-exame-legislacao/-/busca_resultado_exames/

我使用curl嘗試了相同的請求,並使用了響應代碼200。可能會發生什么的任何想法?

如果閱讀curl文檔 ,您將看到-F選項以multipart/form-data格式發布數據:

-F,--form

(HTTP)這使curl可以模擬用戶按下提交按鈕時所填寫的表單。 這會導致使用RFC 2388的Content-Type multipart / form-data卷曲到POST數據 這樣可以上傳二進制文件等。

但是,您的TIdHTTP代碼TIdHTTP發布application/x-www-form-urlencoded格式的數據。 更重要的是,您沒有將TIdHTTP.Request.ContentType屬性設置為'application/x-www-form-urlencoded'以匹配數據。 如果發布TStream ,則必須相應地設置ContentType

TIdHTTP傾向於使用TStrings派生的對象(例如TStringList )而不是TStream來發布application/x-www-form-urlencoded數據,因此它可以確保數據正確編碼和格式化,例如:

var
  Params: TStringList;
begin
  ...
  Params := TStringList.Create;
  try
    Params.Add('asdf=asdf'); // <-- DO NOT url-encode the values here!
    // the TStrings version of Post() will set the Request.ContentType
    // to 'application/x-www-form-urlencoded' by default...
    edtmemo1.Text := IdHTTP1.Post('https://www.detran.mg.gov.br/habilitacao/1-habilitacao-quero-ser-condutor/consultar-resultado-exame-legislacao/-/busca_resultado_exames/', Params);
  finally
    Params.Free;
  end;
  ...
end;

TIdHTTP寧願使用TIdMultipartFormDataStream對象來發布multipart/form-data數據(除非您傳遞給它另一個包含預格式化的MIME數據的TStream )。

因此,要匹配curl命令發送的內容,請嘗試以下操作:

uses
  ..., IdMultipartFormData;

var
  Params: TIdMultipartFormDataStream;
begin
  ...
  Params := TIdMultipartFormDataStream.Create;
  try
    Params.AddFormField('asdf', 'asdf', 'utf-8');
    // the TIdMultipartFormDataStream version of Post() will set the
    // Request.ContentType to 'multipart/form-data' with a suitable
    // MIME 'boundary' attribute for you...
    edtmemo1.Text := IdHTTP1.Post('https://www.detran.mg.gov.br/habilitacao/1-habilitacao-quero-ser-condutor/consultar-resultado-exame-legislacao/-/busca_resultado_exames/', Params);
  finally
    Params.Free;
  end;
  ...
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM