Indy Post на разногласия webhook дает неверный запрос 400 - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь отправить сообщение на канал Discord с помощью Discord webhook . Единственное, что я получаю ошибку 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 Ответ

0 голосов
/ 09 мая 2018

Вы не публикуете свои данные, используя правильный метод TIdHTTP.Post().

Вы используете перегруженный метод Post(), который принимает TStrings в качестве ввода. Этот метод предназначен для отправки веб-форм HTML в формате application/x-www-webform-urlencoded. Но вы устанавливаете для свойства 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()), вы можете опубликовать свои текстовые поля в формате '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;
...