Indy Post 到 discord webhook 给出了错误的请求 400

Posted

技术标签:

【中文标题】Indy Post 到 discord webhook 给出了错误的请求 400【英文标题】:Indy Post to discord webhook gives bad request 400 【发布时间】:2018-10-19 15:28:54 【问题描述】:

我正在尝试使用 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;

我不知道我做错了什么。

【问题讨论】:

【参考方案1】:

您没有使用正确的TIdHTTP.Post() 方法发布您的数据。

您正在使用将TStrings 作为输入的重载Post() 方法。该方法旨在以application/x-www-webform-urlencoded 格式发送 HTML 网络表单。但是您将Request.ContentType 属性设置为'multipart/form-data',因此您发送的请求格式错误。

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

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() 方法执行此操作),那么您可以使用'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;

【讨论】:

以上是关于Indy Post 到 discord webhook 给出了错误的请求 400的主要内容,如果未能解决你的问题,请参考以下文章

如何忽略 Indy 中 POST 请求的响应?

Delphi Indy 以西里尔文发送 POST 数据

在没有 Indy 或其他 3rd 方模块的情况下执行 Delphi POST [重复]

关于XE10下Indy发送字符串编码的问题

如何向 Discord Webhooks C# 发送 POST 请求

如何使用 Indy http 或 ipworks http 模拟登录?