TIdHttp POST仅返回期望json的XML

时间:2014-05-15 15:21:02

标签: json delphi delphi-2007 indy10

在我的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 ... 谢谢你的帮助!

2 个答案:

答案 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 := '*/*';

现在我的网络服务按预期做出响应。