首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Delphi/Indy调用

使用Delphi/Indy调用
EN

Stack Overflow用户
提问于 2014-05-09 12:53:52
回答 1查看 2K关注 0票数 2

我正在开发一个简单的应用程序来与Amazon“交谈”。因为这里有很多现有的代码,所以我需要在Delphi 2010中使用Indy 10 (10.5.5)组件完成这一任务,过去我已经成功地将这些组件与许多其他API集成在一起。然而,Amazon似乎对最小的细节非常敏感,以至于我所有的调用都被已经臭名昭著的"SignatureDoesNotMatch“错误消息所拒绝。

以下是我到目前为止所取得的成就:

1)我的应用程序将组装一个请求,用HMAC- the 256(使用OpenSSL库)签名,并将其发送到Amazon端点。

2)仅HMAC签名本身就是一个挑战,但现在它已经100%正确工作(根据生成的请求进行验证)。

但是,正如我前面所指出的,MWS服务器总是拒绝我的请求,同时也会出现SignatureDoesNotMatch错误,尽管它们确实是正确的。我认为唯一可能造成问题的是Indy处理POST请求的方式,特别是文本编码过程。

是否有人成功地将Delphi/Indy客户端连接到MWS?如果是,那么使用了什么样的TIdHTTP设置?我现在拥有的是:

代码语言:javascript
运行
AI代码解释
复制
procedure TAmazon.TestGetOrder(OrderID:String);

const AwsAccessKey = 'MyAccessKey';
      AwsSecretKey = 'MySecretKey';
      MerchantID = 'MyMerchantID';
      MarketplaceID = 'MyMarketplaceID';
      ApiVersion = '2013-09-01';
      CallUri = '/Orders/2013-09-01';

var HTTP:TIdHTTP;
    SSL:TIdSSLIOHandlerSocketOpenSSL;
    SS:TStringStream;
    Params:TStringList;
    S,Timestamp,QueryString,Key,Value:String;
    i:Integer;

begin
   HTTP:=TIdHTTP.Create(nil);
   SSL:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
   Params:=TStringList.Create;
   try
      Params.Delimiter:='&';
      Params.StrictDelimiter:=True;

      // HTTP Client Options
      HTTP.HTTPOptions:=HTTP.HTTPOptions+[hoKeepOrigProtocol]-[hoForceEncodeParams];
      HTTP.ConnectTimeout:=5000;
      HTTP.ReadTimeout:=20000;
      HTTP.ProtocolVersion:=pv1_1;
      HTTP.IOHandler:=SSL;
      HTTP.HandleRedirects:=True;
      HTTP.Request.Accept:='text/plain, */*';
      HTTP.Request.AcceptLanguage:='en-US';
      HTTP.Request.ContentType:='application/x-www-form-urlencoded';
      HTTP.Request.CharSet:='utf-8';
      HTTP.Request.UserAgent:='MyApp/1.0 (Language=Delphi)';
      HTTP.Request.CustomHeaders.AddValue('x-amazon-user-agent',HTTP.Request.UserAgent);

      // generate the timestamp per Amazon specs
      Timestamp:=TIso8601.UtcDateTimeToIso8601(TIso8601.ToUtc(Now));
      // we can change the timestamp to match a value from the Scratchpad as a way to validate the signature:
      //Timestamp:='2014-05-09T20:32:28Z';

      // add required parameters from API function GetOrder
      Params.Add('Action=GetOrder');
      Params.Add('SellerId='+MerchantID);
      Params.Add('AWSAccessKeyId='+AwsAccessKey);
      Params.Add('Timestamp='+Timestamp);
      Params.Add('Version='+ApiVersion);
      Params.Add('SignatureVersion=2');
      Params.Add('SignatureMethod=HmacSHA256');
      Params.Add('AmazonOrderId.Id.1='+OrderID);
      // generate the signature using the parameters above
      Params.Add('Signature='+GetSignature(Params.Text,CallUri));

      // after generating the signature, make sure all values are properly URL-Encoded
      for i:=0 to Params.Count-1 do begin
         Key:=Params.Names[i];
         Value:=ParamEnc(Params.ValueFromIndex[i]);
         QueryString:=QueryString+Key+'='+Value+'&';
      end;
      Delete(QueryString,Length(QueryString),1);

      // there are two ways to make the call...
      // #1: according to the documentation, all parameters are supposed to be in
      // the URL, and the body stream is supposed to be empty
      SS:=TStringStream.Create;
      try
         try
            Log('POST '+CallUri+'?'+QueryString);
            S:=HTTP.Post('https://mws.amazonservices.com'+CallUri+'?'+QueryString,SS);
         except
            on E1:EIdHTTPProtocolException do begin
               Log('RawHeaders='+#$D#$A+HTTP.Request.RawHeaders.Text);
               Log('Protocol Exception:'+#$D#$A+StringReplace(E1.ErrorMessage,#10,#$D#$A,[rfReplaceAll]));
            end;
            on E2:Exception do
               Log('Unknown Exception: '+E2.Message);
         end;
         Log('ResponseText='+S);
      finally
         SS.Free;
      end;

      // #2: both the Scratchpad and the CSharp client sample provided by Amazon
      // do things in a different way, though... they POST the parameters in the
      // body of the call, not in the query string
      SS:=TStringStream.Create(QueryString,TEncoding.UTF8);
      try
         try
            SS.Seek(0,0);
            Log('POST '+CallUri+' (parameters in body/stream)');
            S:=HTTP.Post('https://mws.amazonservices.com'+CallUri,SS);
         except
            on E1:EIdHTTPProtocolException do begin
               Log('RawHeaders='+#$D#$A+HTTP.Request.RawHeaders.Text);
               Log('Protocol Exception:'+#$D#$A+StringReplace(E1.ErrorMessage,#10,#$D#$A,[rfReplaceAll]));
            end;
            on E2:Exception do
               Log('Unknown Exception: '+E2.Message);
         end;
         Log('ResponseText='+S);
      finally
         SS.Free;
      end;
   finally
      Params.Free;
      SSL.Free;
      HTTP.Free;
   end;
end;

如果我在Scratchpad中组装了一个GetOrder调用,然后将该调用的时间戳粘贴到上面的代码中,我在这里得到完全相同的查询字符串,具有相同的签名和大小等。但是我的Indy请求必须以不同的方式编码,因为MWS服务器不喜欢这个调用。

我知道MWS至少在“读取”查询字符串,因为如果我将时间戳更改为旧日期,它将返回一个“请求过期”错误。

亚马逊的技术支持是毫无头绪的,每天都会发布一条基本信息,比如“确保秘密密钥是正确的”(就像用HMAC 256和MD5获得签名时没有有效的密钥一样!)

还有一件事:如果我使用Wireshark来“观察”上面代码和示例代码中的原始请求,我也看不出有什么区别。但是,我不确定Wireshark是否区分了UTF-8和ASCII,或者显示的文本所包含的任何编码。我仍然认为这与UTC-8的错误编码或类似的事情有关。

关于如何正确编码API调用以取悦亚马逊神的想法和建议是受欢迎和赞赏的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-09 20:38:16

发现了问题: Indy (和Synapse也一样)将端口号添加到"Host“标题行中,直到我更仔细地使用Fiddler来查看标题(谢谢,@Graymatter!),我才意识到这一点。

当我将端点更改为mws.amazonservices.com:443 (而不仅仅是mws.amazonservices)时,我的签名的计算方式与AWS服务器的相同,而且一切都很完美。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23573799

复制
相关文章
Delphi 跨平台_delphi调用api接口
TCriticalSection = class(TSynchroObject) {$IFDEF POSIX} private type TCritSec = record FSync: TObject; procedure Initialize; inline; procedure Free; inline; procedure Enter; inline; procedure Leave; inline; function TryEnter: Boolean; inline; end; {$ENDIF POSIX} protected {$IFDEF MSWINDOWS} FSection: TRTLCriticalSection; {$ENDIF MSWINDOWS} {$IFDEF POSIX} FSection: TCritSec; {$ENDIF POSIX} public constructor Create; destructor Destroy; override; procedure Acquire; override; procedure Release; override; function TryEnter: Boolean; procedure Enter; inline; procedure Leave; inline; end;
全栈程序员站长
2022/08/04
2.1K0
Delphi调用驱动打印
我们做打印小票的时候除了直接对端口发送指令的方式,还有就是调用打印机驱动打印的方式,在Delphi中想要用驱动打印的方式就可以用到TPrinter类
Vaccae
2019/07/24
2.5K0
delphi调用webservice问题总结
1.把WSDL的URL地址放到了HTTPRIO的WSDLLocation参数中,然后选择service和port 2.最近一个项目用到了delphi调用C#写的web服务的功能。用了一天的时间找原因,终于测试通过了。 这是一个通过web服务把一个照片上传到网站指定位置的方法。先测试了N次都不成功,通过跟踪发现delphi根本没传过来任何值,通过查资料发现VS2005 默认是用的 SoapDocumentProtocol而Delphi 是使用的 SoapRpcProtocol.这会造成所以客户端传过去的字
Vaccae
2019/07/24
2.5K0
Delphi调用动态链接库
动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll,也有可能是drv、sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。
Vaccae
2019/07/25
2.7K0
Delphi中使用RTTI
运行期类型信息(RTTI)是一种语言特征,能使应用程序在运行时得到关于对象的信息。
Vaccae
2019/07/24
2K0
博客目录及索引,欢迎指导交流
一转眼发现博客里积累了不少文章,特别是这两年开始发现写博客也是一种提升自己技术能力的方法。这就和写代码一样,因为会让大脑思考,时间长了就会留下记忆。所以很多的高手都是通过这样的不断的重复训练来的。 也就是为什么一些快速成长的公司更容易产生大牛,因为如果初始的员工本身不够牛,业务很难大发展。底子在那里,加上各种实战自然就成长的快,时间长了不牛才怪。当然大牛的人还要会沉淀、思考、修正、分享,这或许是写博客的一个意义所在吧。 java开发相关 Tomcat shutdown执行后无法退出进程问题排查及解决 记一次
用户1105954
2018/01/12
1.8K0
技术笔记:Indy控件发送邮件
工作中有个需求需要发送邮件,因为使用的delphi6,所以自然就选择了indy组件,想想这事挺简单的。实现的过程倒是简单,看着Indy的demo很快就完了,毕竟也不是很复杂的功能。 功能要求: 1、压缩日志文件并作为邮件的附件 2、邮件正文带上一些客户端信息 组件介绍 TIdSmtp:与服务器的连接及数据发送,基于smtp协议 TIdMessage:自然就是报文的信息了,包含收件人、发件人、主题、正文,以及附件。 代码展示: function TfrmMailSend.SendMail: Boolean;
用户1105954
2018/01/12
1.6K0
Delphi语言_DELPHI
总结一下SQL语句中引号(‘)、quotedstr()、(”)、format()在SQL语句中的用法以 及SQL语句中日期格式的表示(#)、(”) 在Delphi中进行字符变量连接相加时单引号用(”’),又引号用(””)表示 首先定义变量 var AnInt:integer=123;//为了方便在此都给它们赋初值。虽然可能在引赋初值在某些情况下不对 AnIntStr:string=’456′; AStr:string=’abc’; AFieldName: string=’字符型编号’; ATableName: string=’YourTable’; ADate:Tdatetime=now; Adoquery1:tadoquery; 1,Delphi语句 adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 字符型编号=’abc’ and 整型编号=123′; 等价于 adoquery1.sql.text:= ‘select ‘+AFieldName+’ from ‘+ATableName+’ where ‘+AFieldName +’=”’+AStr+”’ and 整型编号=’+AnIntStr; 也等价于 adoquery1.sql.text:= ‘select ‘+AFieldName+’ from ‘+ATableName+’ where ‘+AFieldName +’=’+QuotedStr(AStr)+’ and 整型编号=’+Inttostr(AnInt); 传到数据库服务器为: select 字符型编号 from YourTable where 字符型编号=’abc’ and 整型编号=123 2,Delphi语句中日期表示 对于access数据库: adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段=#2003-12-01#’; 等价于: adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段=#’+FormatDateTime(‘yyyy-MM-dd’,now)+’#’; 传到服务器为: select 字符型编号 from YourTable where 日期型字段=#2003-12-01# 对于MSSQL数据库: adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段=’2003-12-01”; 等价于: adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段=”’+FormatDateTime(‘yyyy-MM-dd’,now)+””; 也等价于: 等价于: adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段=’+QuotedStr(FormatDateTime(‘yyyy-MM-dd’,now)); 传到服务器为: select 字符型编号 from YourTable where 日期型字段=’2003-12-01′ 日期字段还可以这样表示 Delphi语句 adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段>=’+QuotedStr(FormatDateTime(‘yyyy-MM-dd’,now)) +’ and 日期型字段<=’+QuotedStr(FormatDateTime(‘yyyy-MM-dd’,now+1));//明天 等价于 adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段 between ‘+QuotedStr(FormatDateTime(‘yyyy-MM-dd’,now)) +’ and ‘+QuotedStr(FormatDateTime(‘yyyy-MM-dd’,now+1)); 如果用 adoquery1.sql.add(); 形式又如何操作?请用Insert语句示例 adoquery1.sql.add(‘ insert into ‘+AtableName); adoquery1.sql.add(‘ ( ‘+AFieldName+’)’); a
全栈程序员站长
2022/11/02
1.7K0
101DIY_inoty9
前言: Indy在2006年已经开始移植到FPC下,但是由于各种原因一直更新得比较缓慢,现在官网上的最新版本发布时间是2007年底。随着Delphi2009(Tiburn)的发布,Indy团队已经将for FPC的版本合并到for Win32的版本中,Lazarus就此获得了最新Indy版本的支持。下面我们就将一步一步来探讨Indy在Lazarus0.9.26中的安装方法。   要在Lazarus中安装最新的Indy,首先我们必须获取其最新的代码,由于现在Indy的代码使用SVN作为版本控制软件,所以我们必须先安装SVN客户端的软件。这里就根据Indy官网的推荐,选择使用TortoiseSVN作为SVN客户端。(下载地址:http://tortoisesvn.tigris.org/)。 具体操作步骤:
全栈程序员站长
2022/09/20
5600
101DIY_inoty9
delphi 使用windowsmediaplayer播放视频
delphi7中原本自带的一个Tmediaplayer控件,但是发现有不少视频是无法播放的,于是就想到了用windowsmediaplayer来进行播放。
Vaccae
2019/07/25
3.1K0
delphi 使用windowsmediaplayer播放视频
Delphi使用NativeXml处理XML(四)
4.2.1.ComponentCreateFromXmlFile   unit NativeXmlObjectStorage   function ComponentCreateFromXmlFile(const FileName: string; Owner: TComponent; const Name: string): TComponent;   从文件名称为FileName的XML文件读取并创建组件。为了成功地从头开始创建组件,组件的类必须事先调用RegisterClass进行登记。添加到指定Owner组件的子组件列表。这通常是一个形式。指定Name作为创建的组件的新组件的名称。 注:它调用ComponentCreateFromXmlStream实现。 4.2.2.ComponentCreateFromXmlNode   function ComponentCreateFromXmlNode(ANode: TXmlNode; Owner: TComponent; const Name: string): TComponent;   从TXmlNode类型的ANode节点读取并创建组件。为了成功地从头开始创建组件,组件的类必须事先调用RegisterClass进行登记。添加到指定Owner组件的子组件列表。这通常是一个形式。指定Name作为创建的组件的新组件的名称。 注:它使用TsdXmlObjectReader类实现。 4.2.3.ComponentCreateFromXmlStream   function ComponentCreateFromXmlStream(S: TStream; Owner: TComponent; const Name: string): TComponent;   从XML流类型的S中读取并创建组件。为了成功地从头开始创建组件,组件的类必须事先调用RegisterClass进行登记。添加到指定Owner组件的子组件列表。这通常是一个形式。指定Name作为创建的组件的新组件的名称。 注:它调用ComponentCreateFromXmlNode实现。 4.2.4.ComponentCreateFromXmlString   function ComponentCreateFromXmlString(const Value: string; Owner: TComponent; const Name: string): TComponent;   从XML字符串类型的Value中读取并创建组件。为了成功地从头开始创建组件,组件的类必须事先调用RegisterClass进行登记。添加到指定Owner组件的子组件列表。这通常是一个形式。指定Name作为创建的组件的新组件的名称。 注:它调用ComponentCreateFromXmlStream实现。 4.2.5.ComponentSaveToXmlFile   procedure ComponentSaveToXmlFile(AComponent: TComponent; const FileName: string; AParent: TComponent);   存储组件AComponent所有公布的属性到名为FileName 的XML文件。指定AParent为了储存Parent正确的方法和事件参考。 注:它调用ObjectSaveToXmlFile实现。 4.2.6.ComponentSaveToXmlNode   procedure ComponentSaveToXmlNode(AComponent: TComponent; ANode: TXmlNode; AParent: TComponent);   存储组件AComponent所有公布的属性到TXmlNode格式的ANode中。指定AParent为了储存Parent正确的方法和事件参考。 注:它调用ObjectSaveToXmlNode实现。 4.2.7.ComponentSaveToXmlStream   procedure ComponentSaveToXmlStream(AComponent: TComponent; S: TStream; AParent: TComponent);   存储组件AComponent所有公布的属性到XML格式的流S中。指定AParent为了储存Parent正确的方法和事件参考。 注:它调用ObjectSaveToXmlStream实现。 4.2.8.ComponentSaveToXmlString   function ComponentSaveToXmlString(AComponent: TComponent; AParent: TComponent): string;   存储组件AComponent所有公布的属
Vaccae
2019/07/24
1.9K0
技术笔记:Indy的TIdSMTP改造,解决发送Html和主题截断问题
使用Indy来发邮件坑不少啊,只不过有比没有好吧,使用delphi6这种老工具没办法,只能使用了新一点的Indy版本9,公司限制。。。 1、邮件包含TIdText和TIdAttachment时会出现TIdText无法发送的问题 这个问题是因为Indy代码的bug导致的,也很奇怪这种Bug是因为没有经过测试呢?还是测试没有覆盖到? 问题出在SendBody方法上,这个在之前一篇中提到过《技术笔记:Indy控件发送邮件》 当时是解决“发送Html”的问题才使用到了TIdText这个组件,因为基类TIdMessa
用户1105954
2018/01/12
8110
Delphi使用NativeXml处理XML(二)
4.1.类(Classes) 4.1.1.TComponentAccess类   TComponentAccess = class(TComponent) 4.1.1.1.ComponentState   property ComponentState; 4.1.1.2.SetComponentState   procedure SetComponentState(const AState: TComponentState); 4.1.2.TNativeXml类   TNativeXml = class(TPersistent)   TNativeXml是XML文件的载体。创建一个TNativeXml,然后使用方法LoadFromFile、LoadFromStream或ReadFromString加载XML文档到内存中。或者从头开始使用Root.NodeNew添加节点,并最终SaveToFile和SaveToStream保存结果为一个XML文档。用属性Xmlformat = xfReadable确保缩进(易读)输出。 4.1.2.1.AbortParsing   property AbortParsing: boolean;   如果您使用一个SAX-like方式的OnNodeNew和OnNodeLoaded事件,并要中止解析过程,设置AbortParsing为True。例如:
Vaccae
2019/07/25
1.5K0
C/C++/Delphi 调用命令并且显示执行结果
* 网站名称:obaby@mars * 网址:https://h4ck.org.cn/ * 本文标题: 《C/C++/Delphi 调用命令并且显示执行结果》 * 本文链接:https://h4ck.org.cn/2011/11/cdelphi-execute-cmd-commands-and-get-result/ * 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。
obaby
2023/02/24
7410
使用Delphi编写×××类游戏 – 设
通过以上两篇关于对中心服务器和登录服务器设计的阐述,大家应该对设计它们有了一定的了解。但是中心服务器和登录服务器毕竟是游戏外围的部分,也就是说设计好了它们也还是无法实现编写一款游戏的目的啊。今天我们就来探讨一下如何设计游戏服务器。
py3study
2020/01/06
1.1K0
Delphi使用NativeXml处理XML(一)
3.1.例子A:XML的装载、存储和导出   这个例子显示如何加载一个XML文档,然后以可读格式导出到一个TMemo领域。   拖放一个TEdit(Edit1),TButton(Button1)和一个TMemo到你的窗体,然后连接到下面的按钮的OnClick事件代码。填写文件名到Edit1,然后按一下按钮,您会看到在memo控件中列出XML文件的内容。
Vaccae
2019/07/25
1.1K0
Delphi中QuotedStr介绍及使用
声明:function QuotedStr(const S: string): string;
全栈程序员站长
2022/11/02
3480
[转]Delphi中QuotedStr介绍及使用
转自:http://www.360doc.com/content/13/0524/09/7873422_287679198.shtml
全栈程序员站长
2022/11/02
5630
Delphi使用NativeXml处理XML(三)
  TXmlNode = class(TPersistent)   该TXmlNode代表在XML文件中的元素。每个TNativeXml拥有一个根(Root)元素。在根元素下面,子元素可以嵌套(没有限制有多深)。ElementType属性定义这个节点是什么类型的元素。 4.1.16.1.AttributeByName   property AttributeByName [const AName: UTF8String]: UTF8String;   AttributeByName返回的指定属性名称AName的属性的值。设置AttributeByName可以添加这个属性到属性列表,或取代现有的属性。 4.1.16.2.AttributeByNameWide   property AttributeByNameWide [const AName: UTF8String]: UnicodeString;   AttributeByName返回的指定属性名称AName的属性的UnicodeString类型值。设置AttributeByName可以添加这个属性到属性列表,或取代现有的属性。 4.1.16.3.AttributeCount   property AttributeCount: integer;   返回当前节点的属性数量。 4.1.16.4.AttributeName   property AttributeName [Index: integer]: UTF8String;   根据索引(Index)读属性的名字。注意,属性索引是从0开始的,索引(Index)值从0到AttributeCount – 1。 4.1.16.5.AttributePair   property AttributePair [Index: integer]: UTF8String;   根据索引(Index)读属性的名字与值,这个返回的UTF8String字符串中的名字(Name)与值(Value)用TAB符号(#9)分割。 注:实际上是用等号(=)分割的。这个值中的转义字符(escape)没有转换。 4.1.16.6.AttributeValue   property AttributeValue [Index: integer]: UTF8String;   根据索引(Index)读这个属性,返回UTF8String类型的属性值;写这个属性,则设置UTF8String类型的属性值。 4.1.16.7.AttributeValueAsInteger   property AttributeValueAsInteger [Index: integer]: integer;   根据索引(Index)读这个属性,返回Integer类型的属性值,如果这个值不能转换,返回0;写这个属性,则设置Integer类型的属性值。 4.1.16.8.AttributeValueAsUnicodeString   property AttributeValueAsUnicodeString [Index: integer]: UnicodeString;   根据索引(Index)读这个属性,返回UnicodeString类型的属性值;写这个属性,则设置UnicodeString类型的属性值。 4.1.16.9.AttributeValueDirect   property AttributeValueDirect [Index: integer]: UTF8String;   设置或获取这个原始属性值,可以回避转义字符转换(escape)函数。你不能在这个值中设置&和引用(quote)Ansi字符,或者XML不支持的字符。 注:这个值中的转义(escape)字符不会被转换。 4.1.16.10.BinaryEncoding   property BinaryEncoding: TBinaryEncodingType;   BinaryEncoding 属性值用于返回或设置父文档(Parent Document)的BinaryEncoding 属性值。 4.1.16.11.BinaryString   property BinaryString: RawByteString;   使用BinaryString可以读写Base64编码格式的节点值。如果是标准的文本信息,不使用这个方法,而是ValueAsString。 4.1.16.12.CascadedName   property CascadedName: UTF8String;   这个属性返回当前节点的名字及索引,并级联递归上层节点到根节点。各节点信息利用下划线(_)分割。 注:很奇怪,根节点竟然有一个父节点,而且那个节点没有写入文件。这个属性会返回那个奇怪节点的索引0。 4.1.16.1
Vaccae
2019/07/24
1.7K0
Delphi xe使用TJSONObject解析JSON数据
在Delphi 10 Seattle中重写 “ 使用TJSONObject分析JSON数据 ”。
战神伽罗
2020/06/05
3.9K0

相似问题

Delphi使用Indy 10

14

Delphi: Indy TCPServer线程的DDE调用

21

使用indy的Delphi flow

185

使用Delphi实现Indy查询

24

Delphi Indy IRC

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档