2014-05-15 4 views
1

Delphi 2007 코드에서 인증 토큰을 얻으려고 보안 웹 서비스에 게시하고 있습니다. 우편 배달부 또는 .net 언어로 된 요청은 모두 잘 작동합니다. 하지만 델파이 2007을 사용하여이 WS에 접근 할 필요가 ... 그럼이 코드를 만들어 :이 코드는 아주 잘 작동TIdHttp POST는 json이 예상되는 XML 만 반환합니다.

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 응답)하지 JSON에서, XML 형식으로되어 . 누군가가 이것을 도와 줄 수 있기를 바랍니다. XML을 구문 분석하고 싶지는 않습니다. 도움을 주셔서 감사합니다!

답변

3

전적으로 귀하가 게시하는 URL에 따라 다릅니다. JSON에서 요청을 보낸다 고해서 반드시 JSON으로 답장을 보내야한다는 의미는 아닙니다. 웹 서비스가 항상 JSON을 반환하도록 코딩되어 있지 않거나 웹 서비스에서 원하는 답장 형식을 쿼리 문자열 매개 변수와 함께 지정할 수있는 경우 URL 자체 또는 요청의 Accept 헤더 또는 게시 데이터의 매개 변수

웹 서비스가 다른 유형의 클라이언트에 다른 내용/형식을 보내는 UserAgent에 민감 할 수도 있습니다. 대부분의 UserAgent에 민감한 사이트는 기본값 인 TIdHTTP.Request.UserAgent 값을 인식/허용하지 않으므로 Internet Explorer, Firefox 또는 Safari와 같은 다른 클라이언트를 모방 한 것으로 변경해야 할 수도 있습니다.

Wireshark와 같은 패킷 스니퍼 또는 Fiddler와 같은 HTTP 프록시/디버거를 사용하여 Postman과 DotNet이 보내는 HTTP 요청을 분석 한 다음 필요에 따라 TIdHTTP으로 요청을 복제하십시오. 나는 단순히이 줄을 추가하는이 키를 덮어 한

내가 델파이에 의해 만들어지고 헤더에 승인 응답으로 XML을 지정하는 키 있다는 것을 발견 요청을 탐구 한 레미 Lebeau 제안에

+0

빠른 응답을 보내 주셔서 감사합니다. 이미 WS가 JSON 만 사용하여 응답하도록했습니다 ...하지만이 방법은 약간 추한 것 같습니다. 나는 당신의 제안을 시도 할 것입니다. – ful03

1

감사합니다 ... 코드의 :

IdHTTP1.Request.Accept := '*/*'; 

그리고 지금 내 webservice 예상대로 응답합니다.

관련 문제