Delphi TIdHttp发布Json错误

时间:2015-11-25 19:43:57

标签: json delphi indy idhttp

我正在尝试使用 IdHttp 发布帖子,以json格式发送数据,除了我测试的每种方式都在服务器上出错,相同的数据已成功提交以测试POSTMAN工具

strPost := '{...}'; //string json
xUrlPost := 'url...'; //url to post

TIdHttp配置

IdHTTPLibSys.Request.ContentType := 'application/json';
IdHTTPLibSys.Request.AcceptCharSet := 'UTF-8';
IdHTTPLibSys.Request.CustomHeaders.Add('Authorization: Bearer xToken');
IdHTTPLibSys.Request.CustomHeaders.Add('ClientInfo: 528533378');

使用TStringList

JSonToSend3 := TStringList.Create;
JSonToSend3.Add(strPost);
sHtmlResp := IdHTTPLibSys.Post(xUrlPost, JSonToSend3);

错误:HTTP / 1.1 500内部服务器错误

使用TStringStream

JsonToSend := TStringStream.Create(strPost, TEncoding.UTF8);
sHtmlResp := IdHTTPLibSys.Post(xUrlPost, JSonToSend);

错误:HTTP / 1.1 422无法处理的实体

使用TMemoryStream

JsonToSend2 := TMemoryStream.Create;
JsonToSend2.Write(strPost[1], Length(strPost) * SizeOf(strPost[1]));
JsonToSend2.Position := 0;

错误:HTTP / 1.1 500内部服务器错误

回顾通过POSTMAN(chrome)发布的相同数据不会发生错误,json是否正确,有什么想法?

1 个答案:

答案 0 :(得分:1)

发布TStringListapplication/x-www-form-urlencoded格式发送数据,这不是服务器所期望的。

使用UTF-8编码的TStringStream可以正常工作。 422回复并不意味着帖子本身出现问题,这意味着JSON数据存在问题,服务器无法处理它。您可能在JSON中有语法错误。

使用TMemoryStream也可以正常使用。但是,您将JSON字符串编写为UTF-16,而不是将其编码为UTF-8。您可以使用Indy的WriteStringToStream()函数,例如:WriteStringToStream(JsonToSend2, strPost, IndyTextEncoding_UTF8);