我已经尝试了所有我能想到的东西,并且不能使用addticketreply命令来连接WHMCS的API。它来自窗口的应用程序,而不是PHP或任何东西。简单查询字符串,所有字符都包含在第一个换行符之前。在该换行之后,不包括任何其他信息。
我尝试了一种urlencode方法,没有去,API只是插入所有文本,包括编码部分哈哈并且不会解码。我尝试用[{1}}替换换行符\n
,但WHMCS只显示<br>
哈哈
有关如何通过API获取完整消息(包括新行)的任何线索?文档真的缺乏这个。
变量adminusername也根本不起作用!我已经尝试了一个全名,不,我已经尝试过用户名和用户ID和nope,仍然插入我登录的用户名以进行故障单回复。我正在使用的用户是具有完全访问权限的超级管理员。
API的查询字符串如下所示:
<br>
我应该提到我在邮政中使用Indy。其他所有工作,任何其他命令传递工作,甚至更新票证,消息更新。它不会超过第一次突破。
编辑代码:正如我上面提到的,我让IdHTTP使用post params对我的文本进行编码,因此它应该可以工作,并且正如我在上面提到的那样,我已经尝试对其进行预编码,结果是WHMCS不会解码然后只显示accesskey=key&adminusername=Name of Person&ticketid=488&message=asdf asdf
Nothing past that first line goes :(
sad sad sad&action=addticketreply&responsetype=json&username=admin&password=mypassword
和其他的。既然有人问我应该提一下,我正在使用Indy 10!所以我最新版本。
%20
答案 0 :(得分:2)
换行符,空格和其他保留字符需要进行URL编码,例如:
accesskey=key&adminusername=Name%20of%20Person&ticketid=488&message=asdf%20asdf%0D%0ANothing%20past%20that%20first%20line%20goes%20%3A%28%0D%0Asad%20sad%20sad&action=addticketreply&responsetype=json&username=admin&password=mypassword
如果您通过POST请求发送值,请确保您使用的是Indy的最新版本。 TIdHTTP.Post(TStrings)
为您处理编码,例如:
var
Params: TStringList;
begin
Params := TStringList.Create;
try
Params.Add('accesskey=key');
Params.Add('adminusername=Name of Person');
Params.Add('ticketid=488');
Params.Add('message=asdf asdf'+CRLF+'Nothing past that first line goes :('+CRLF+'sad sad sad');
Params.Add('action=addticketreply');
Params.Add('responsetype=json');
Params.Add('username=admin');
Params.Add('password=mypassword');
IdHTTP1.Post(URL, Params);
finally
Params.Free;
end;
end;
但是,如果您通过URL查询字符串发送值,则必须手动对URL进行编码,TdHTTP
将无法为您处理,例如:
var
URL: String;
begin
URL := 'http://host/path?accesskey=key&adminusername=Name of Person&ticketid=488&message=asdf asdf'+CRLF+'Nothing past that first line goes :('+CRLF+'sad sad sad&action=addticketreply&responsetype=json&username=admin&password=mypassword';
IdHTTP1.Get(TIdURI.URLEncode(URL));
end;
或者:
var
URL: String;
Params: TStringList;
I: Integer;
begin
Params := TStringList.Create;
try
Params.Add('accesskey=key');
Params.Add('adminusername=Name of Person');
Params.Add('ticketid=488');
Params.Add('message=asdf asdf'+CRLF+'Nothing past that first line goes :('+CRLF+'sad sad sad');
Params.Add('action=addticketreply');
Params.Add('responsetype=json');
Params.Add('username=admin');
Params.Add('password=mypassword');
for I := 0 to Params.Count-1 do
Params[i] := TIdURI.ParamsEncode(Params[i]);
Params.Delimiter := '&';
Params.StrictDelimiter := True;
Params.Quotechar := #0;
URL := 'http://host/' + TIdURI.PathEncode('path') + '?' + Params.DelimitedText;
IdHTTP1.Get(URL);
finally
Params.Free;
end;
end;