随笔- 267  文章- 27  评论- 28  阅读- 10万 
复制代码
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Net.URLClient,
  System.Net.HttpClient, System.Net.HttpClientComponent, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    NetHTTPClient1: TNetHTTPClient;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    NetHTTPClient2: TNetHTTPClient;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure NetHTTPClient1RequestCompleted(const Sender: TObject;
      const AResponse: IHTTPResponse);
    procedure Button2Click(Sender: TObject);
    procedure NetHTTPClient2RequestCompleted(const Sender: TObject;
      const AResponse: IHTTPResponse);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses System.NetEncoding;

{$R *.dfm}


function UrlDecode(const AStr: AnsiString): AnsiString;
var
  Sp, Rp, Cp: PAnsiChar;
  s: AnsiString;
begin
  SetLength(Result, Length(AStr));
  Sp := PAnsiChar(AStr);
  Rp := PAnsiChar(Result);
  Cp := Sp;
  while Sp^ <> #0 do
  begin
    case Sp^ of
      '+':
        Rp^ := ' ';
      '%':
        begin
          Inc(Sp);
          if Sp^ = '%' then
            Rp^ := '%'
          else
          begin
            Cp := Sp;
            Inc(Sp);
            if (Cp^ <> #0) and (Sp^ <> #0) then
            begin
              s := AnsiChar('$') + Cp^ + Sp^;
              Rp^ := AnsiChar(StrToInt(string(s)));
            end;
          end;
          Cp := Cp;
        end;
    else
      Rp^ := Sp^;
    end;
    Inc(Rp);
    Inc(Sp);
  end;
  SetLength(Result, Rp - PAnsiChar(Result));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  vHttp: TNetHTTPClient;
  vUTF8, vGBK: TStringStream;
begin
  vHttp := TNetHTTPClient.Create(nil);
  vUTF8 := TStringStream.Create('', TEncoding.GetEncoding(65001));
  vGBK := TStringStream.Create('', TEncoding.GetEncoding(936));
  try
    Memo1.Lines.Add('----------------阻塞----------------');
    with vHttp do
    begin
      vUTF8.Clear;
      ConnectionTimeout := 2000; // 2秒
      ResponseTimeout := 10000; // 10秒
      AcceptCharSet := 'utf-8';
      AcceptEncoding := '65001';
      AcceptLanguage := 'zh-CN';
      ContentType := 'text/html';
      UserAgent := 'Embarcadero URI Client/1.0';
      try
        Get('http://offeu.com/utf8.txt', vUTF8);
        Memo1.Lines.Add('utf8:' + TNetEncoding.URL.UrlDecode(vUTF8.DataString));
      except
        on E: Exception do
          // Error sending data: (12002) 操作超时.
          // Error receiving data: (12002) 操作超时
          if Copy(E.Message, 1, Pos(':', E.Message) - 1) = 'Error sending data'
          then
            Memo1.Lines.Add('utf8:连接失败!')
          else if Copy(E.Message, 1, Pos(':', E.Message) - 1) = 'Error receiving data'
          then
            Memo1.Lines.Add('utf8:接收失败,请延长接收超时时间!')
          else
            Memo1.Lines.Add('utf8:' + E.Message);
      end;
      vGBK.Clear;
      AcceptCharSet := 'gbk';
      AcceptEncoding := '936';
      AcceptLanguage := 'zh-CN';
      ContentType := 'text/html';
      UserAgent := 'Embarcadero URI Client/1.0';
      Get('http://offeu.com/gbk.txt', vGBK);
      Memo1.Lines.Add('gbk:' + string(UrlDecode(AnsiString(vGBK.DataString))));
    end;
    Memo1.Lines.Add('----------------异步----------------');
    with NetHTTPClient1 do
    begin
      Asynchronous := true;
      ConnectionTimeout := 10000; // 10秒
      ResponseTimeout := 10000; // 10秒
      AcceptCharSet := 'utf-8';
      AcceptEncoding := '65001';
      AcceptLanguage := 'zh-CN';
      ContentType := 'text/html';
      UserAgent := 'Embarcadero URI Client/1.0';
      Get('http://offeu.com/utf8.txt');
    end;
  finally
    vUTF8.Free;
    vGBK.Free;
    vHttp.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  vHttp: TNetHTTPClient;
  vS: TStringStream;
begin
  // 这里用的 APPCODE 是阿里云市场中的api,需要申请。
  vHttp := TNetHTTPClient.Create(nil);
  vS := TStringStream.Create('', TEncoding.GetEncoding(65001));
  try
    with vHttp do
    begin
      Memo1.Lines.Add('--------------SSL阻塞--------------');
      vS.Clear;
      ConnectionTimeout := 10000; // 10秒
      ResponseTimeout := 10000; // 10秒
      CustomHeaders['Authorization'] :=
        'APPCODE 你申请的appcode';
      Accept := 'application/json;';
      ContentType := 'application/json; charset=utf-8;';
      UserAgent := 'Embarcadero URI Client/1.0';
      Get('https://dm-81.data.aliyun.com/rest/160601/ip/getIpInfo.json?'
        + 'ip=60.191.244.5', vS);
      Memo1.Lines.Add('ssl:'
        + string(TNetEncoding.URL.UrlDecode(vS.DataString)));
    end;
  finally
    vS.Free;
    vHttp.Free;
  end;
  Memo1.Lines.Add('--------------SSL异步--------------');
  with NetHTTPClient2 do
  begin
    Asynchronous := true;
    ConnectionTimeout := 10000; // 10秒
    ResponseTimeout := 10000; // 10秒
    CustomHeaders['Authorization'] :=
      'APPCODE 你申请的appcode';
    Accept := 'application/json;';
    ContentType := 'application/json; charset=utf-8;';
    UserAgent := 'Embarcadero URI Client/1.0';
    Get('https://dm-81.data.aliyun.com/rest/160601/ip/getIpInfo.json?'
      + 'ip=60.191.244.5');
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  vHttp: TNetHTTPClient;
  vS: TStringStream;
  vList: TStrings;
begin
  vHttp := TNetHTTPClient.Create(nil);
  vList := TStringList.Create;
  vS := TStringStream.Create;
  try
    Memo1.Lines.Add('----------------Post阻塞----------------');
    vS.Clear;
    with vHttp do
    begin
      ConnectionTimeout := 2000; // 2秒
      ResponseTimeout := 10000; // 10秒
      AcceptCharSet := 'utf-8';
      AcceptEncoding := '65001';
      AcceptLanguage := 'zh-CN';
      ContentType := 'text/html';
      UserAgent := 'Embarcadero URI Client/1.0';
      vList.Clear;
      vList.Values['id'] := 'test';
      vList.Values['pwd'] := 'test';
      vList.Values['cmd'] := '1';
      try
        Post('http://60.191.220.219:8090', vList, vS); // utf8进gbk出
        // Memo1.Lines.Add('post:' + TNetEncoding.URL.UrlDecode(vS.DataString));
        Memo1.Lines.Add('post:' + vS.DataString);
      except
        on E: Exception do
          // Error sending data: (12002) 操作超时.
          // Error receiving data: (12002) 操作超时
          if Copy(E.Message, 1, Pos(':', E.Message) - 1) = 'Error sending data'
          then
            Memo1.Lines.Add('post:连接失败!')
          else if Copy(E.Message, 1, Pos(':', E.Message) - 1) = 'Error receiving data'
          then
            Memo1.Lines.Add('post:接收失败,请延长接收超时时间!')
          else
            Memo1.Lines.Add('post:' + E.Message);
      end;
    end;
  finally
    vS.Free;
    vList.Free;
    vHttp.Free;
  end;
end;

procedure TForm1.NetHTTPClient1RequestCompleted(const Sender: TObject;
  const AResponse: IHTTPResponse);
begin
  Memo1.Lines.Add('utf8:' + TNetEncoding.URL.UrlDecode(
    AResponse.ContentAsString(TEncoding.GetEncoding(65001))));
end;

procedure TForm1.NetHTTPClient2RequestCompleted(const Sender: TObject;
  const AResponse: IHTTPResponse);
begin
  Memo1.Lines.Add('ssl:' + TNetEncoding.URL.UrlDecode(
    AResponse.ContentAsString(TEncoding.GetEncoding(65001))));
end;

end.
复制代码

 

 posted on   宝兰  阅读(2990)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2015-01-29 Allow Zero Length 允许空字符串 ACCESS
点击右上角即可分享
微信分享提示