我正在尝试使用 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是否正确,有什么想法?
答案 0 :(得分:1)
发布TStringList
以application/x-www-form-urlencoded
格式发送数据,这不是服务器所期望的。
使用UTF-8编码的TStringStream
可以正常工作。 422回复并不意味着帖子本身出现问题,这意味着JSON数据存在问题,服务器无法处理它。您可能在JSON中有语法错误。
使用TMemoryStream
也可以正常使用。但是,您将JSON字符串编写为UTF-16,而不是将其编码为UTF-8。您可以使用Indy的WriteStringToStream()
函数,例如:WriteStringToStream(JsonToSend2, strPost, IndyTextEncoding_UTF8);