Indy Post to discord webhook 给出了错误的请求 400
Indy Post to discord webhook gives bad request 400
我正在尝试使用 Discord webhook 向 Discord 频道发送消息。唯一的问题是我不断收到 400 Bad Request
错误。
我有以下代码:
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
作为输入的重载 Post()
方法。该方法旨在以 application/x-www-webform-urlencoded
格式发送 HTML 网络表单。但是您将 Request.ContentType
属性 设置为 'multipart/form-data'
,因此您发送了格式错误的请求。
要发送 multipart/form-data
格式的数据,您需要使用重载的 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()
方法上传),那么您可以 post 使用 'application/json'
格式的文本字段 TStream
(不是TStringList
),例如:
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;
我正在尝试使用 Discord webhook 向 Discord 频道发送消息。唯一的问题是我不断收到 400 Bad Request
错误。
我有以下代码:
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
作为输入的重载 Post()
方法。该方法旨在以 application/x-www-webform-urlencoded
格式发送 HTML 网络表单。但是您将 Request.ContentType
属性 设置为 'multipart/form-data'
,因此您发送了格式错误的请求。
要发送 multipart/form-data
格式的数据,您需要使用重载的 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()
方法上传),那么您可以 post 使用 'application/json'
格式的文本字段 TStream
(不是TStringList
),例如:
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;