我遇到过一些使用JSON
请求和回复的网站
我遇到两种类型:
1 - application/x-www-form-urlencoded
作为请求,并返回响应application/json
内容类型
请求和响应的 2 - application/json
内容类型
在type 1
我尝试使用
更改响应内容类型
mIdHttp.Response.ContentType := 'application/json';
但是使用http分析器我可以看到它没有改变,它仍然是text/html
现在我不知道问题是因为我不能改变内容类型但我不知道如何处理json
!
关于json
的几个问题:
1 - 发布时我必须对json数据进行编码吗?怎么样?
2 - 我如何解析json响应代码?怎么弄明白?它需要某种编码或特殊转换吗?
3 - json的哪种idhttp设置随每个站点而变化并需要配置?
我理解我的问题听起来有点笼统,但所有其他问题都非常具体,并且在处理'application/json'
内容类型时无法解释基本知识。
编辑1:
感谢 Remy Lebeau 回答我能够成功地使用type 1
但我仍然无法发送JSON
请求,有人可以分享一个工作示例,这是发布信息的网站之一,请以此为例:
一个重要说明:此特定网站的帖子和请求内容完全相同!并且它让我感到困惑,因为在网站上,我指定了start date
和end date
,然后点击folder like icon
并发送此post
(您可以在上面看到的那个) ,result
应该是links
(而且是)但而不是只出现在request content
中,它们也出现在post
中! (我也试图获取链接,但在post
链接,我想要的东西,也被发送,我怎么能发布我不会发的东西!!?)< / p>
答案 0 :(得分:7)
您不能指定响应的格式,除非请求的资源为此确切目的提供显式输入参数或专用URL(即,请求将响应发送为html,xml,json等)。设置TIdHTTP.Response.ContentType
属性是没用的。它将被响应的实际Content-Type
标头覆盖。
要在请求中发送 JSON,您必须将其作为TStream
发布,例如TMemoryStream
或TStringStream
,并设置TIdHTTP.Request.ContentType
根据需要,例如:
var
ReqJson: TStringStream;
begin
ReqJson := TStringStream.Create('json content here', TEncoding.UTF8);
try
IdHTTP1.Request.ContentType := 'application/json';
IdHTTP1.Post(URL, ReqJson);
finally
ReqJson.Free;
end;
end;
要接收 JSON,TIdHTTP
可以
将其作为String
返回(使用服务器报告的字符集解码):
var
ReqJson: TStringStream;
RespJson: String;
begin
ReqJson := TStringStream.Create('json content here', TEncoding.UTF8);
try
IdHTTP1.Request.ContentType := 'application/json';
RespJson := IdHTTP1.Post(URL, ReqJson);
finally
ReqJson.Free;
end;
// use RespJson as needed...
end;
将原始字节写入您选择的输出TStream
:
var
ReqJson: TStringStream;
RespJson: TMemoryStream;
begin
RespJson := TMemoryStream.Create;
try
ReqJson := TStringStream.Create('json content here', TEncoding.UTF8);
try
IdHTTP1.Request.ContentType := 'application/json';
RespJson := IdHTTP1.Post(URL, ReqJson, RespJson);
finally
ReqJson.Free;
end;
RespJson.Position := 0;
// use RespJson as needed...
finally
RespJson.Free;
end;
end;
HTTP响应代码位于TIdHTTP.Response.ResponseCode
(和TIdHTTP.ResponseCode
)属性中。