在我的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 ... 谢谢你的帮助!
答案 0 :(得分:3)
这完全取决于您要发布的网址。仅仅因为您使用JSON发送请求并不一定意味着您将获得JSON中的回复,除非Web服务被编码为始终返回JSON,或者如果Web服务允许您使用查询字符串参数指定所需的回复格式URL本身,或请求的Accept
标头或发布数据中的参数。
web服务也可能是UserAgent敏感的,向不同类型的客户端发送不同的内容/格式。许多对UserAgent敏感的站点无法识别/接受默认的TIdHTTP.Request.UserAgent
值,因此您可能需要将其更改为模仿其他客户端,如Internet Explorer,Firefox或Safari。
使用Wireshark之类的数据包嗅探器或像Fiddler这样的HTTP代理/调试器来分析Postman和DotNet发送的HTTP请求,然后根据需要使用TIdHTTP
复制这些请求。
答案 1 :(得分:2)
感谢Remy Lebeau的建议,我已经探索了Delphi提出的请求,并发现在Headers中有一个键将XML指定为已接受的响应......
我添加了这行代码,只是覆盖了这个键:
IdHTTP1.Request.Accept := '*/*';
现在我的网络服务按预期做出响应。