我正在尝试编写一个简单的Ada(使用AWS)程序将数据发布到服务器。 curl命令的工作方式如下,并在成功登录后返回JSON中的有效响应:
curl -XPOST -d '{"type":"m.login.password", "user":"xxx", "password": "xxxxxxxxxx"}' "https://matrix.org/_matrix/client/r0/login"
我的Ada计划:
with Ada.Exceptions; use Ada.Exceptions;
with Ada.Text_Io; use Ada.Text_IO;
with AWS.Client;
with AWS.Communication.Client;
with AWS.MIME;
with AWS.Net;
with AWS.Response;
use AWS;
procedure Communicate is
Result : Response.Data;
Data : String := "{""type"":""m.login.password"", ""user"":""xxx"", ""password"": ""xxxxxxxxxx""}";
begin
Result := Client.Post
( URL => "https://matrix.org/_matrix/client/r0/login",
Data => Data,
Content_Type => AWS.MIME.Application_JSON ) ;
Put_Line ( Response.Message_Body ( Result ) ) ;
end Communicate;
引发了一个例外。我无法弄清楚这段代码有什么问题。
$ ./Communicate
raised PROGRAM_ERROR : aws-client.adb:543 finalize/adjust raised exception
要测试代码,您可以在http://matrix.org创建一个帐户并替换登录凭据。
感谢。
阿德里安
答案 0 :(得分:1)
经过一些小的改动(主要是因为我不喜欢编译器警告),以及对Debian / Jessie版AWS的改编,我得到了它的工作。
以下是改编后的版本:
with Ada.Text_IO; use Ada.Text_IO;
with AWS.Client;
-- with AWS.MIME;
with AWS.Response;
use AWS;
procedure Communicate is
Result : Response.Data;
Data : constant String :=
"{""type"":""m.login.password"", ""user"":""xxx"", " &
"""password"": ""xxxxxxxxxx""}";
begin
Result := Client.Post
(URL => "https://matrix.org/_matrix/client/r0/login",
Data => Data,
Content_Type => "application/json");
-- Content_Type => AWS.MIME.Application_JSON);
Put_Line (Response.Message_Body (Result));
end Communicate;
这是我的项目文件:
with "aws";
project Communicate is
for Main use ("communicate");
package Builder is
for Default_Switches ("Ada")
use ("-m");
end Builder;
package Compiler is
for Default_Switches ("Ada")
use ("-fstack-check", -- Generate stack checking code (part of Ada)
"-gnata", -- Enable assertions (part of Ada)
"-gnato13", -- Overflow checking (part of Ada)
"-gnatf", -- Full, verbose error messages
"-gnatwa", -- All optional warnings
"-gnatVa", -- All validity checks
"-gnaty3abcdefhiklmnoOprstux", -- Style checks
"-gnatwe", -- Treat warnings as errors
"-gnat2012", -- Use Ada 2012
"-Wall", -- All GCC warnings
"-O2"); -- Optimise (level 2/3)
end Compiler;
end Communicate;
我用以下方法构建了程序:
% gprbuild -P communicate
gnatgcc -c -fstack-check -gnata -gnato13 -gnatf -gnatwa -gnatVa -gnaty3abcdefhiklmnoOprstux -gnatwe -gnat2012 -Wall -O2 communicate.adb
gprbind communicate.bexch
gnatbind communicate.ali
gnatgcc -c b__communicate.adb
gnatgcc communicate.o -L/usr/lib/x86_64-linux-gnu -lgnutls -lz -llber -lldap -lpthread -o communicate
%
然后测试:
% ./communicate
{"errcode":"M_FORBIDDEN","error":"Invalid password"}
%
看起来问题出在您的AWS版本/安装中。
答案 1 :(得分:1)
通过使用MacPorts中的gnutls构建AWS解决了问题。 Apple自OS X Lion以来不赞成使用OpenSSL并使用CommonCrypto,因此现代macOS不附带OpenSSL。解决方案是从Mac Ports或Home Brew下载并安装OpenSSL或gnutls。
另一个问题是Apple自El Capitan以来引入了SIP(系统完整性保护)。启用SIP后,具有管理员权限的用户无法更改/ usr / include和/ usr / lib等中的内容。
Mac Ports安装到/ opt / local,因此我引用了/ opt / local / include和/ opt / local / lib,以便AWS可以使用OpenSSL或gnutl进行构建。