0

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

我试过 urlencode 方法,不行,API 只是插入所有文本,包括编码部分哈哈,并没有取消编码。我试过用换行符代替\n<br>但WHMCS仍然只显示<br>哈哈

任何线索如何通过 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

我应该提到我正在使用 Indy 作为 Post。其他一切正常,通过的任何其他命令都有效,甚至更新票证,更新消息。它只是不会超过第一个换行符。

编辑代码:正如我上面提到的,我确实让 IdHTTP 使用 post 参数对我的文本进行编码,所以它应该可以工作,并且正如我在上面也提到的,我尝试对其进行预编码,结果是 WHMCS 不会取消-然后编码,只显示%20's和other's。既然有人问我应该提一下,我正在使用 Indy 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;
4

1 回答 1

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;
于 2012-11-22T03:05:27.290 回答