Pascal WHMCS API addticketreply不处理消息

Pascal WHMCS API addticketreply不处理消息,pascal,indy,whmcs,Pascal,Indy,Whmcs,我已经尝试了我所能想到的一切,但不能让换行符与WHMCS的API的addticketreply命令一起使用。它来自窗口的应用程序,而不是PHP或其他任何东西。简单查询字符串,所有字符都包含在第一个换行符之前。在该行中断之后,消息的其他内容将不包括在内 我尝试了一种urlencode方法,不需要,API只是插入所有文本,包括编码部分ha,而不需要取消编码。我试着用替换换行符\n,但WHMCS仍然只显示ha 如何通过API(包括新行)获取完整消息,有什么线索吗?这方面确实缺乏文档 此外,变量admi

我已经尝试了我所能想到的一切,但不能让换行符与WHMCS的API的addticketreply命令一起使用。它来自窗口的应用程序,而不是PHP或其他任何东西。简单查询字符串,所有字符都包含在第一个换行符之前。在该行中断之后,消息的其他内容将不包括在内

我尝试了一种urlencode方法,不需要,API只是插入所有文本,包括编码部分ha,而不需要取消编码。我试着用

替换换行符
\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请求发送值,请确保您使用的是最新版本的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;
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