Как отправить запрос Indy с помощью метода DELETE и источника потока JSON в Delphi 7? - PullRequest
0 голосов
/ 27 октября 2018

У меня проблема с отправкой запроса веб-службы с использованием Delphi 7 и Indy. Мое рабочее место - государственная больница в качестве клиента и страховая третья сторона в качестве сервера. Вот каталог услуг:

   URL : {BASE URL from the insurance office}/Delete
    Method : DELETE
    Format : Json
    Content-Type: Application/x-www-form-urlencoded
    Request body : 
        {"request": {"t_obj": {"noObj": "0301X1018V001","user": "myUser"}}}
Я использую Indy 10.6, и часть кода, который я написал:
   Json := '{"request": {"t_obj": {"noObj": "0301X1018V001","user": "myUser"}}}';
   req := TStringStream.Create(Utf8Encode(Json)); 
   resp := TStringStream.Create('');

   IdHttp1.request.Source := req;
   IdHttp1.Request.ContentType := 'Application/x-www-form-urlencoded';
   IdHttp1.delete('{BASE URL from the insurance office}/Delete', resp);
   showmessage(resp.DataString);

Но, когда запрос отправлен, его не удалось удалить. Кто-нибудь может мне помочь, пожалуйста? Извините, мой английский недостаточно хорош. Спасибо.

1 Ответ

0 голосов
/ 27 октября 2018

Application/x-www-form-urlencoded не является допустимым типом носителя для отправки JSON.Вы уверены, что сервер на самом деле не ожидает application/json вместо этого?Должно быть.

Кроме того, более важная причина, по которой ваш запрос не работает, заключается в том, что метод TIdHTTP.Delete() просто не позволяет отправлять тело сообщения, поэтому сервер вообще никогда не видит JSON.Внутренне Delete() вызывает метод TIdCustomHTTP.DoRequest(), передавая nil в параметре ASource, который заменяет ваше присвоение свойства TIdHTTP.Request.Source.

Чтобы сделать то, что вы пытаетесь, вам придетсязвоните DoRequest() напрямую, например:

// TIdCustomHTTP.DoRequest() is protected,
// so use an accessor class to reach it...
type
  TIdHTTPAccess = class(TIdHTTP)
  end;

...

Json := '{"request": {"t_obj": {"noObj": "0301X1018V001","user": "myUser"}}}';
req := TStringStream.Create(UTF8Encode(Json));
try
  resp := TStringStream.Create('');
  try
    //IdHttp1.Request.Source := req;
    //IdHttp1.Request.ContentType := 'Application/x-www-form-urlencoded';
    IdHttp1.Request.ContentType := 'application/json';
    //IdHttp1.Delete('{BASE URL from the insurance office}/Delete', resp);
    TIdHTTPAccess(IdHttp1).DoRequest(Id_HTTPMethodDelete, '{BASE URL from the insurance office}/Delete', req, resp, []);
    ShowMessage(resp.DataString);
  finally
    resp.Free;
  end;
finally
  req.Free;
end;
...