Pascal WHMCS API addticketreply不处理消息
我已经尝试了我所能想到的一切,但不能让换行符与WHMCS的API的addticketreply命令一起使用。它来自窗口的应用程序,而不是PHP或其他任何东西。简单查询字符串,所有字符都包含在第一个换行符之前。在该行中断之后,消息的其他内容将不包括在内 我尝试了一种urlencode方法,不需要,API只是插入所有文本,包括编码部分ha,而不需要取消编码。我试着用Pascal WHMCS API addticketreply不处理消息,pascal,indy,whmcs,Pascal,Indy,Whmcs,我已经尝试了我所能想到的一切,但不能让换行符与WHMCS的API的addticketreply命令一起使用。它来自窗口的应用程序,而不是PHP或其他任何东西。简单查询字符串,所有字符都包含在第一个换行符之前。在该行中断之后,消息的其他内容将不包括在内 我尝试了一种urlencode方法,不需要,API只是插入所有文本,包括编码部分ha,而不需要取消编码。我试着用替换换行符\n,但WHMCS仍然只显示ha 如何通过API(包括新行)获取完整消息,有什么线索吗?这方面确实缺乏文档 此外,变量admi
替换换行符\n
,但WHMCS仍然只显示
ha
如何通过API(包括新行)获取完整消息,有什么线索吗?这方面确实缺乏文档
此外,变量adminusername根本不起作用!我试过一个全名,没有,我试过用户名和用户ID,没有,仍然插入我的登录用户名用于票据回复。我使用的用户是具有完全访问权限的超级管理员
API的查询字符串如下所示:
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
我应该提到的是,我正在用印地来做这个职位。其他一切都可以工作,任何其他传递的命令都可以工作,即使票证更新,消息也会更新。它就是过不了第一次突破
编辑代码:如上所述,我确实让IdHTTP使用post参数对我的文本进行编码,因此它应该可以工作,正如我上面所述,我尝试对其进行预编码,结果是WHMC不会取消编码,只显示%20
和其他。既然有人问我应该提一下,我用的是印地10!所以我是最新版本的
j := TStringList.Create;
ret := TStringStream.Create('');
j.Text := k+params+'action='+method+'&responsetype=json&username='+username1.Text+'&password='+password;
try
htp1.Post('http'+s+'://'+url1.Text+'/includes/api.php', j, ret);
except
on E: EIdHTTPProtocolException do
result := '{"result":"error", "message":"'+htp1.ResponseText+'"}';
end;
换行符、空格和其他保留字符需要进行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请求发送值,请确保您使用的是最新版本的IndyTIdHTTP.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;
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;
但是,如果您通过URL查询字符串发送值,则必须手动编码URL,TdHTTP
将不会为您处理该问题,例如:
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;
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;
或:
请显示您的实际代码。我还应该提到文本来自TMemo控件,并直接插入
'message='+Memo1。text
您没有正确填写TStringList。TIdHTTP.Post()希望“name=value”对是TStringList中的单个字符串,就像我向您展示的那样。设置TStringList.Text不会分隔这些对,请改用TStringList.DelimitedText。如果要对值进行预编码,必须禁用TIdHTTP的hoForceEncodeParams
选项,否则数据将被双重编码,这是不好的。仅因为您使用的是Indy 10,并不保证您使用的是最新版本的Indy 10。是的,例如:j.Delimiter:='&';j、 StrictDelimiter:=True;j、 DelimitedText:=k+params+'action='+method+'&responsetype=json&username='+username1.Text+'&password='+password代码>