1. 程式人生 > >HTTP與HTTPS不同請求的區別

HTTP與HTTPS不同請求的區別

1. 我把所有的URL /與程式碼。我這個來自傑夫・德沃爾現在,它的精細工作:function request(const AUrl, AData: AnsiString; blnSSL: Boolean = True): AnsiString;
var
 aBuffer  : Array[0..4096] of Char;
 Header  : TStringStream;
 BufStream : TMemoryStream;
 sMethod  : AnsiString;
 BytesRead : Cardinal;
 pSession : HINTERNET;
 pConnection : HINTERNET;
 pRequest : HINTERNET;
 parsedURL : TStringArray;
 port  : Integer;
 flags  : DWord;
begin
 ParsedUrl := ParseUrl(AUrl);

 Result := '';

 pSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

 if Assigned(pSession) then
 try
 if blnSSL then
  Port := INTERNET_DEFAULT_HTTPS_PORT
 else
  Port := INTERNET_DEFAULT_HTTP_PORT;
 pConnection := InternetConnect(pSession, PChar(ParsedUrl[0]), port, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);

 if Assigned(pConnection) then
 try
  if (AData = '') then
  sMethod := 'GET'
  else
  sMethod := 'POST';

  if blnSSL then
  flags := INTERNET_FLAG_SECURE or INTERNET_FLAG_KEEP_CONNECTION
  else
  flags := INTERNET_SERVICE_HTTP;

  pRequest := HTTPOpenRequest(pConnection, PChar(sMethod), PChar(ParsedUrl[1]), nil, nil, nil, flags, 0);

  if Assigned(pRequest) then
  try
  Header := TStringStream.Create('');
  try
   with Header do
   begin
   WriteString('Host: ' + ParsedUrl[0] + sLineBreak);
   WriteString('
User-Agent
: Custom program 1.0'+SLineBreak); WriteString('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'+SLineBreak); WriteString('Accept-Language: en-us,en;q=0.5' + SLineBreak); WriteString('Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'+SLineBreak); WriteString('Keep-Alive: 300'+ SLineBreak); WriteString('Connection: keep-alive'+ SlineBreak+SLineBreak); end; HttpAddRequestHeaders(pRequest, PChar(Header.DataString), Length(Header.DataString), HTTP_ADDREQ_FLAG_ADD); if HTTPSendRequest(pRequest, nil, 0, Pointer(AData), Length(AData)) then begin BufStream := TMemoryStream.Create; try while InternetReadFile(pRequest, @aBuffer, SizeOf(aBuffer), BytesRead) do begin if (BytesRead = 0) then Break; BufStream.Write(aBuffer, BytesRead); end; aBuffer[0] := #0; BufStream.Write(aBuffer, 1); Result := PChar(BufStream.Memory); finally BufStream.Free; end; end; finally Header.Free; end; finally InternetCloseHandle(pRequest); end; finally InternetCloseHandle(pConnection); end; finally InternetCloseHandle(pSession); end; end; ParseUrl是一個函式,在分割“/和TStringArray是一個字串陣列的URL。我還是要檢查程式碼的明天,但它看起來很好,在我的嗅探器,我看到後資料被髮送了頭。 2. 我個人比較喜歡的突觸庫為我所有的TCP /
IP協議
的工作。例如,一個簡單的HTTP post可以編碼為:uses httpsend; function testpost; begin stm := tStringstream.create('param=value'); try HttpPostBinary(' CodeGo.net finally stm.free; end; end; 該庫是寫得很好,很容易修改以滿足您的特定最新發布的顛覆不工作為德爾福2009年和2010年德爾福的任何問題。這是基於,而是是一系列的類和其良好的多執行緒 3. 第三個(以HttpOpenRequest應該是你想要求的URL。這就是為什麼描述的五分之一(lpszReferer)為“一個指向一個空結束的字串,指定從哪個(獲得了在請求的URL的URL。” 已釋出的資料獲取與傳送HttpSendRequest;該lpOptional描述是這樣的: 指向包含請求頭之後傳送任何可選的
資料緩衝區
。這對於POST和PUT操作。可選的資料可以被髮送到伺服器的資源。這可以是NULL如果不存在可選的資料傳送。 第二至InternetOpen應該只是伺服器,它不應該包含的協議。你與第六指定協議 當你傳送的請求,您可以閱讀與迴應InternetReadFile和InternetQueryDataAvailable。 不要只檢查是否API函式返回零,然後繼續下一行。如果他們失敗了,呼叫GetLastError找出原因。你已經發布的程式碼不會引發異常,所以這是徒勞的,以捕捉任何。 (和它的愚蠢的“處理”他們你這樣做反正的方式。不要捕捉異常,你還不知道如何解決。讓一切上去給呼叫者,或來電者的來電,等。)