0

考えられることはすべて試しましたが、WHMCS の API への addticketreply コマンドに合わせて改行を入れることができません。PHPなどではなく、ウィンドウのアプリケーションからのものです。単純なクエリ文字列。最初の改行の前にすべての文字が含まれます。その改行の後には、メッセージは何も含まれていません。

urlencode メソッドを試してみましたが、うまくいきません。API は、エンコードされた部分を含むすべてのテキストを挿入するだけで、エンコードを解除しません。改行\nを次のように置き換えてみまし<br>たが、それでも WHMCS は<br>ha 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

私は投稿にIndyを使用していることに言及する必要があります。他のすべてが機能し、渡された他のコマンドは機能します。チケットが更新されても、メッセージが更新されます。最初の改行を超えることはありません。

編集コード:上記のように、IdHTTP に post パラメーターを使用してテキストをエンコードさせるので、うまくいくはずです。また、上記でも述べたように、事前にエンコードしようとしましたが、その結果、WHMCS は un-次にエンコードし、%20とその他を表示します。と言われたので、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 に答える