首页 > 其他分享 >Delphi TNetHTTPClient使用递归方式取所有分页数据

Delphi TNetHTTPClient使用递归方式取所有分页数据

时间:2023-11-13 12:37:32浏览次数:41  
标签:begin rows end TNetHTTPClient 递归 Delphi vResponse TJSONObject log

Delphi TNetHTTPClient使用递归方式取所有分页数据

      业务系统提供的一个查询数据接口,可以通过分页方式取得数据,如果一次性取得所有数据,将页大小增大即可,但如果数据太多怕会造成内存溢出。

      综合考虑每次只取一个分页,分页数据不要太大,用递归方式来获取是比较合理的解决方案,当页码大到一个数量,取不出数据即结束递归。

具体的实践代码示例:

uses
  System.Net.URLClient, System.Net.HttpClient, System.Net.HttpClientComponent,
  DateUtils,
  System.JSON;
  
procedure httpGetCustomer(pageNum: Integer; pageSize: Integer);
var
  xh: Integer;
  s: String;
  str: String;
  url: String;
  client: TNetHTTPClient;
  // vParams: TStringList; // 参数
  vParams: TStringStream; // 接收值
  vResponse: IHTTPResponse; // 接收参数
  jsonData: TJSONObject;
  retData: String;
  code: String;
  jsonRetData: TJSONObject;
  total: Integer;
  jv: TJSONValue;
  rows: TJSONArray;
  jsonCustomer: TJSONValue; // TJSONObject;
  json2: TJSONObject;
  beginTime, endTime: String;
  token: String;
begin 
   token:=httpGetToken(); 
  beginTime := FormatDateTime('yyyy-MM-dd', incDay(now, 0));
  endTime := FormatDateTime('yyyy-MM-dd', incDay(now, 1));
//组装接
  url := 'http://localhost/sys/customer/list?pageNum=' + IntToStr(pageNum) + '&pageSize=' + IntToStr(pageSize) + '&beginTime=' + beginTime + '&endTime=' + endTime;

  log('取列表URL');
  log(url);
  client := TNetHTTPClient.Create(nil);
  vParams := TStringStream.Create(); // 接收值
  try
    client.SecureProtocols := [THTTPSecureProtocol.TLS12];
    client.ContentType := 'application/json;charset=UTF-8';
    client.CustomHeaders['Authorization'] := token;

    // vResponse := client.Get(url, vParams);
    vResponse := client.Get(url);
    if vResponse.StatusCode = 200 then
    begin
      log('取得列表返回');
      log('---------');
      log(vResponse.ContentAsString);
      log('---------');
      retData := vResponse.ContentAsString;
      if retData <> '' then
      begin
        jsonData := TJSONObject.ParseJSONValue(Trim(vResponse.ContentAsString)) as TJSONObject;
        code := '';
        code := jsonData.Get('code').JsonValue.Value;
        if code = '200' then
        begin
          s := jsonData.Get('data').ToString;
          log('取得列表');
          log('---------');

          if ((jsonData.GetValue('data') as TJSONObject).TryGetValue('rows', jv)) then
          begin
            // 如果rows节点不存在 会报异常的
            rows := ((jsonData.GetValue('data') as TJSONObject).GetValue('rows') as TJSONArray); // 不可以多级???
            if rows.Size <= 0 then
            begin
              // Showmessage('为空的列表');
              log('已取完,为空的列表');
            end;
            log('取到数据数量:' + IntToStr(rows.Size));
            if rows.Size > 0 then
            begin
              // getCustomersData(rows);
              for jsonCustomer in rows do
              begin
                application.ProcessMessages;
                xh := xh + 1;
                //log(IntToStr(xh));
                var
                  json6: TJSONObject := jsonCustomer as TJSONObject;
                log(json6.GetValue('customerId').Value);
              end;

              //递归 继续取下一页
              httpGetCustomer(pageNum + 1, pageSize);
            end;

          end;

        end;
      end;
    end
    else
    begin
      log('获取列表失败:' + IntToStr(vResponse.StatusCode));
      log('获取列表失败原因:' + vResponse.StatusText);
    end;
  finally
    client.Free;
    vParams.Free;
  end;

end;

效果

Delphi TNetHTTPClient使用递归方式取所有分页数据_json

标签:begin,rows,end,TNetHTTPClient,递归,Delphi,vResponse,TJSONObject,log
From: https://blog.51cto.com/u_12668715/8340846

相关文章

  • delphi 官方例子 simples 路径
     公用文件件可能是隐藏的若是的话则显示隐藏    ......
  • Delphi 用TDatasetToJSONBridge原生支持DataSet导出Json(转红鱼儿)
    Xalion发现data.DBJson单元,不知什么时候加的,官方帮助中也没有写。1procedureTForm18.Button2Click(Sender:TObject);2var3cV:TDatasetToJSONBridge;4jo:Tjsonobject;5begin6cV:=TDatasetToJSONBridge.Create;7try8cV.Dataset:=mt;......
  • 调用Delphi DLL 注意事项
    1.使用统一的调用约束(__stdcall)2.arrayof 调用delphi接口:procedureProcessArray(constArr:arrayofInteger);stdcall; VC:typedefvoid(__stdcall*ProcessArrayFunc)(constint*,int);ProcessArrayFuncprocessArray=(ProcessArrayFunc)GetProcAddress(......
  • 不使用递归,如何构造树结构
    原理很简单,利用对象引用特性。科普一下知识点:浅拷贝:浅拷贝又称为浅复制,浅克隆,浅拷贝是指拷贝时只拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用所指向的对象,拷贝出来的对象的所有变量的值都含有与原来对象相同的值,而所有对其他对象的引用都指向原来的对象,简单......
  • Delphi 10.x 提示脚本错误的解决方法
    Delphi10.x提示脚本错误的解决方法解决办法如下:10.1版本修改方法:打开注册表,在cmd中输入regedit,以管理员的身份运行,找到HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\18.0\KnownIDEPackages项,找到$(BDS)\Bin\CommunityToolbar240.bpl这个子项目将其内容由Embarcade......
  • python 递归上传文件到阿里云oss
    python递归上传文件到阿里云ossimportosimportoss2importjson#阿里云OSS访问信息access_key_id='xxxxxxxxx'access_key_secret='xxxxxxxxxxxxx'endpoint='xxxxxxxxxxxxx'bucket_name='bucketName'#本地目录路径local_directory......
  • 递归获取指定目录下的指定类型的文件
     1:递归获取指定目录下的指定类型的文件     public class FileTool    {        /// <summary>        ///  私有变量        ///  </summary>        private static List<FileInfo> lst = new List<FileInfo......
  • 使用递归图 recurrence plot 表征时间序列
    在本文中,我将展示如何使用递归图RecurrencePlots来描述不同类型的时间序列。我们将查看具有500个数据点的各种模拟时间序列。我们可以通过可视化时间序列的递归图并将其与其他已知的不同时间序列的递归图进行比较,从而直观地表征时间序列。递归图RecurrencePlots(RP)是一种用于......
  • C语言程序设计 函数递归调用示例
    函数递归调用示例(教材习题5.3,运行结果012345)#include<stdio.h>voidfun(intk);voidmain(){intw=5;fun(w);}voidfun(intk){if(k>0)fun(k-1);printf("%d",k);}......
  • 二叉树前中后序遍历(递归和非递归)+层次遍历
    直接看代码啦!前中后指的是跟被访问的次序!递归很好理解,重点是非递归!!!1#define_CRT_SECURE_NO_WARNINGS2#include<iostream>3#include<fstream>4usingnamespacestd;56typedefstructTreeNode7{8intdata;9intflag;10str......