HTTP與HTTPS不同請求的區別
阿新 • • 發佈:2018-12-22
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找出原因。你已經發布的程式碼不會引發異常,所以這是徒勞的,以捕捉任何。 (和它的愚蠢的“處理”他們你這樣做反正的方式。不要捕捉異常,你還不知道如何解決。讓一切上去給呼叫者,或來電者的來電,等。)