微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Delphi 和网络服务

如何解决Delphi 和网络服务

我正在开发一个工具来集成两个系统,我需要一些有关 Delphi 和 Web 服务的帮助。

首先,我使用的是 Delphi 5.0 和 Indy 8.009B。我知道它们都很古老,但这就是我现在必须处理的问题。

我遇到的第一个问题是关于检索令牌。但是我设法找到了正确的 DLL 文件来处理我的 Indy 的 IdHTTP 组件版本(顺便说一下,2004 年版本)。

这是我的代码

slParams := TStringList.Create;
  sReturnWS := TStringStream.Create('');
  cIntercept := TIdConnectionInterceptOpenSSL.Create(nil);
  sParams := 'client_id=' + sIdClient + '&client_secret=' + sClientKey;
  sURL := sUrlAut + '?' + sParams;
  IdHTTP := TIdHTTP.Create(nil);
  IdHTTP.Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
  cIntercept.SSLOptions.Method := sslvTLSv1;
  IdHTTP.Request.Accept := '*/*';
  IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
  IdHTTP.Request.ContentEncoding := 'utf-8';
  IdHTTP.Intercept := cIntercept;
  IdHTTP.ProtocolVersion := pv1_0;
  IdHTTP.Request.Connection := 'keep-alive';
  IdHTTP.Request.AcceptEncoding := 'gzip,deflate,br';
  try
    IdHTTP.Post(sURL,slParams,sReturnWS);
    sReturn := sReturnWS.DataString;
    vJson := TlkJSON.ParseText(sReturn);

它就像一个魅力。但是现在我目前停留在第二步,即通过不记名令牌授权/身份验证向服务器发送收到的令牌。我动态地创建了我应该发送到服务器的 json,顺便说一下,这是一个 HTTPS 安全服务器。 json 文件很好,我已经使用在线 json 验证器对其进行了测试,方法是将其从内存流保存到硬盘驱动器,并且我还使用 Postman 和 SoapUI 对其进行了测试,并且它可以正常工作并得到验证。但是当我尝试通过我的 Delphi 应用程序发送它时,我总是得到同样的错误:422 Unprocessable Entity 这让我发疯,因为这是我可以从服务器的响应中读取的全部内容。它不像 Postman 或 SoapUI 那样我可以从服务器读取所有返回的消息。好吧,我相信我之所以遇到此错误,是因为我没有通过 Delphi 正确设置一些必要的授权;无论如何,这是我发送json文件代码(json是我的包含json数据的字符串变量):

JsonToSend.WriteBuffer(Pointer(Json)^,Length(Json));
JsonToSend.Position := 0;
cIntercept := TIdConnectionInterceptOpenSSL.Create(nil);
try
    IdHTTPAux.Intercept := cIntercept;
    IdHTTPAux.Request.Clear;
    IdHTTPAux.Request.ContentType := 'application/json';
    IdHTTPAux.Request.ContentEncoding := 'UTF-8';
    IdHTTPAux.Request.ExtraHeaders.Clear;
    IdHTTPAux.Request.ExtraHeaders.FoldLines := False;
    IdHTTPAux.Request.WWWAuthenticate := 'Bearer TOKEN';
    idHTTPAux.Request.ExtraHeaders.Values['Cache-Control'] := 'no-cache';
    IdHTTPAux.Request.ExtraHeaders.Values['Authorization'] := 
        Uppercase(copy(sTokenType,1,1)) + copy(sTokenType,2,length(sTokenType)-1) + ' ' + 
        sToken;
    IdHTTPAux.Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
    cIntercept.SSLOptions.Method := sslvTLSv1;
    IdHTTPAux.Request.Accept := '*/*';
    IdHTTPAux.ProtocolVersion := pv1_0;
    IdHTTPAux.Request.Connection := 'Keep-Alive';
    IdHTTPAux.Request.AcceptEncoding := 'gzip,br';
    try
        IdHTTPAux.Post(sUrl,JsonToSend,sResponse);

请有人帮助我,因为我已经坚持了好几天了,我已经尝试了我力所能及的一切,但我不知道该怎么办了。

解决方法

我解决了。事实上,在我验证了动态生成的 json 之后的某个时候,我不小心从中删除了最后一个“}”字符。代码本身没问题。它现在工作 100%。因此,如果有人需要有关如何使用 Delphi 5 和 Indy 8.009B 使用 json 和 webservice 集成系统的示例,那就是。它有效!

,

如果您不知道,有一个名为 mitmproxy 的免费产品,它可以很好地查看您的 https 流量以进行调试。它在 http://mitmproxy.org

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?