在我的Delphi 2007代码中,我将发布到安全的Web服务中以获取身份验证令牌。一切都适用于Postman或以.net语言发出的请求。
但是我需要使用Delphi 2007访问此WS ...然后我编写了以下代码:
var
IdHTTP1 : TIdHTTP;
LHandler: TIdSSLIOHandlerSocketOpenSSL;
jsonSend : TStringStream;
SourceString, RetString : String;
begin
SourceString := '{"MyJsonStuff": "blabla"'}';
try
IdHTTP1:=TIdHTTP.Create(nil);
//IdHTTP1.Request.Charset := 'utf-8';
//IdHTTP1.HandleRedirects := True;
IdHTTP1.Request.ContentType := 'application/json';
try
LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
LHandler.SSLOptions.Method := sslvSSLv23;
try
IdHTTP1.IOHandler:=LHandler;
jsonSend := TStringStream.Create(SourceString);
RetString := IdHTTP1.Post('myUrl', jsonSend));
jsonSend.free;
except
end;
LHandler.Free;
finally
IdHTTP1.Free;
end;
except
end;
end;
该代码可以很好地工作,但是RetString(WS响应)为XML格式,而不是预期的jSon。
我希望有人可以帮助我,我真的不想解析XML ...
谢谢你的帮助!
最佳答案
这完全取决于您要发布到的URL。仅仅因为您以JSON发送请求并不一定意味着您将得到JSON答复,除非将Web服务编码为始终返回JSON,或者如果Web服务允许您在查询中使用查询字符串参数指定所需的答复格式URL本身,或在请求的Accept
标头中,或在post数据中的参数。
Web服务也可能是UserAgent敏感的,向不同类型的客户端发送不同的内容/格式。许多对UserAgent敏感的网站无法识别/接受默认的TIdHTTP.Request.UserAgent
值,因此您可能需要更改它以模仿其他客户端,例如Internet Explorer,Firefox或Safari。
使用数据包嗅探器(例如Wireshark)或HTTP代理/调试器(例如Fiddler)来分析Postman和DotNet发送的HTTP请求,然后根据需要使用TIdHTTP
复制这些请求。
关于json - TIdHttp POST仅返回期望使用json的XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23682452/