Мне нужно знать, где я не прав в json объект POST с использованием TIdHTTP в Delphi - PullRequest
0 голосов
/ 10 января 2020

источник выдаёт ошибку сокета 14001, С OBJ JSON ПАРАМЕТР СООБЩЕНИЕ ДЛЯ ПОЧТЫ

jso := TlkJSONobject.Create; // (data) as TlkJSONobject;   

jso.Add('InvoiceNumber', '');
jso.Add('POSID', '910441');
jso.add('USIN', ePOSNo.Text);
jso.add('DATETIME', eDate.Text);

IdHTTP1.Request.Accept := 'application/json';
IdHTTP1.Request.ContentType := 'application/json';

{ Call the Post method of TIdHTTP and read the result into TMemo }
Memo1.Lines.Text := IdHTTP1.Post('http://localhost;8524/api/IMSFISCAL/GetInvoiceNumberByModel', JSO);

json не может быть передано как tstream

нужна помощь по нему

1 Ответ

3 голосов
/ 10 января 2020

Код, который вы показали, не может вызвать ошибку сокета (не говоря уже об ошибке 14001, которая даже не является ошибкой сокета), поскольку код даже не скомпилируется!

Метод TIdHTTP.Post() не имеет перегрузки, которая принимает TlkJSONobject в качестве ввода. Как это могло? TlkJSONobject исходит из совершенно другой сторонней библиотеки, она не является частью RTL или Indy. POST * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.

файл, указанный с помощью String имя файла

В этом случае вам необходимо использовать TStream для отправки JSON, хранящегося в памяти. Вы несете ответственность за сохранение вашего TlkJSONobject контента в подходящем TStream по вашему выбору. Это выходит за рамки Indy. Например, вы можете использовать TlkJSON.GenerateText(), чтобы получить JSON в String, а затем POST, используя TStringStream.

В примечании, URL, который вы передаете TIdHTTP.Post(), искажен. Правильный разделитель между именем хоста и номером порта - это двоеточие (:), а не точка с запятой (;).

С учетом сказанного попробуйте следующее:

jso := TlkJSONobject.Create;

jso.Add('InvoiceNumber', '');
jso.Add('POSID', '910441');
jso.add('USIN', ePOSNo.Text);
jso.add('DATETIME', eDate.Text);

IdHTTP1.Request.Accept := 'application/json';
IdHTTP1.Request.ContentType := 'application/json';

{ Call the Post method of TIdHTTP and read the result into TMemo }
PostData := TStringStream.Create(TlkJSON.GenerateText(jso), TEncoding.UTF8);
try
  Memo1.Lines.Text := IdHTTP1.Post('http://localhost:8524/api/IMSFISCAL/GetInvoiceNumberByModel', PostData);
finally
  PostData.Free;
end;
...