Delphi Indy Post to discord webhook发出错误请求400

Delphi Indy Post to discord webhook发出错误请求400,delphi,post,webhooks,indy,discord,Delphi,Post,Webhooks,Indy,Discord,我正在尝试使用一个不和谐频道发送消息。唯一的问题是我一直收到一个400错误请求 我有以下代码: procedure TForm1.btn1Click(Sender: TObject); var params: TStringList; begin httpclient1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/

我正在尝试使用一个不和谐频道发送消息。唯一的问题是我一直收到一个
400错误请求

我有以下代码:

procedure TForm1.btn1Click(Sender: TObject);
var
  params: TStringList;
begin
  httpclient1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36';
  httpclient1.Request.ContentType := 'multipart/form-data';
  params := TStringList.Create;
  try
    params.add('{"content": "Test", "username": "testname", "avatar_url": "https://i.imgur.com/ivUiaOr.png"}');
  finally
    httpclient1.Post('https://discordapp.com/api/webhooks/443763508073594880/r8Oba0ws7WeN-n57TeF6BF6CKFFjviov6XMrMVVDUY_G18zmmY7VUwZqCiAOs9nz-CyC', params);
    params.Free;
  end;
end;
我不知道我做错了什么。

您没有使用正确的
TIdHTTP.Post()
方法发布数据。 您正在使用重载的
Post()
方法,该方法将
TStrings
作为输入。该方法用于以
application/x-www-webform-urlencoded
格式发送HTML网络表单。但是您正在将
Request.ContentType
属性设置为
“多部分/表单数据”
,因此您发送的请求格式不正确

要以
multipart/formdata
格式发送数据,需要使用重载的
Post()
方法,该方法将
TIdMultipartFormDataStream
作为输入,例如:

procedure TForm1.btn1Click(Sender: TObject);
var
  params: TIdMultipartFormDataStream;
begin
  params := TIdMultipartFormDataStream.Create;
  try
    params.AddFormField('content', 'Test');
    params.AddFormField('username', 'testname');
    params.AddFormField('avatar_url', 'https://i.imgur.com/ivUiaOr.png');

    httpclient1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36';
    httpclient1.Post('https://discordapp.com/api/webhooks/443763508073594880/r8Oba0ws7WeN-n57TeF6BF6CKFFjviov6XMrMVVDUY_G18zmmY7VUwZqCiAOs9nz-CyC', params);
  finally
    params.Free;
  end;
end;
如果您没有上传实际的文件(您可以使用
TIdMultipartFormDataStream.AddFile()
方法),那么您可以使用
TStream
(而不是
TStringList
)以
'application/json'
格式发布文本字段,例如:

procedure TForm1.btn1Click(Sender: TObject);
var
  params: TStringStream;
begin
  params := TStringStream.Create('{"content": "Test", "username": "testname", "avatar_url": "https://i.imgur.com/ivUiaOr.png"}', TEncoding.UTF8);
  try
    httpclient1.Request.ContentType := 'application/json';
    httpclient1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36';
    httpclient1.Post('https://discordapp.com/api/webhooks/443763508073594880/r8Oba0ws7WeN-n57TeF6BF6CKFFjviov6XMrMVVDUY_G18zmmY7VUwZqCiAOs9nz-CyC', params);
  finally
    params.Free;
  end;
end;