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找出原因。你已经发布的代码不会引发异常,所以这是徒劳的,以捕捉任何。 (和它的愚蠢的“处理”他们你这样做反正的方式。不要捕捉异常,你还不知道如何解决。让一切上去给调用者,或来电者的来电,等。)
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页