2010-05-25 73 views
0

與其他人一樣在我面前,我在使用的IdHttp在2010年德爾福(印第安納波利斯10.5.5)組件的代碼工作正常在Delphi 7的煩惱:IdHttp POST方法德爾福2010

var 
XMLString : AnsiString; 
lService : AnsiString; 

ResponseStream: TMemoryStream; 
InputStringList : TStringList; 
begin 
    ResponseStream := TMemoryStream.Create; 
    InputStringList := TStringList.Create; 

    XMLString :='<?xml version="1.0" encoding="ISO-8859-1"?> '+ 
      '<!DOCTYPE pnet_imessage_send PUBLIC "-//PeopleNet//pnet_imessage_send" "http://open.peoplenetonline.com/dtd/pnet_imessage_send.dtd"> '+ 
      '<pnet_imessage_send> '+ 
      ' <cid>username</cid> '+ 
      ' <pw>password</pw> '+ 
      ' <vehicle_number>tr01</vehicle_number> '+ 
      ' <deliver>now</deliver> '+ 
      ' <action> '+ 
      '  <action_type>reply_with_freeform</action_type> '+ 
      '  <urgent_reply>yes</urgent_reply> '+ 
      ' </action> '+ 
      ' <freeform_message>Test Message Version 2</freeform_message> '+ 
      '</pnet_imessage_send> '; 
    lService := 'imessage_send'; 

    InputStringList.Values['service'] := lService; 
    InputStringList.Values['xml'] := XMLString; 

    try 
    IdHttp1.Request.Accept := '*/*'; 
    IdHttp1.Request.ContentType := 'text/XML'; 
    IdHTTP1.Post('http://open.peoplenetonline.com/scripts/open.dll', InputStringList, ResponseStream); 
    ... 
    finally 
    ResponseStream.Free; 
    InputStringList.Free; 
    end; 

唯一的區別到目前爲止,這和D7代碼之間是我已經將字符串類型更改爲AnsiString,並添加了HTTP請求屬性。

我從服務器返回的響應是'XML無法解析。空格預計在第1行:位置:19',我假定XML在這個過程中的某個地方出現了亂碼,但我無法弄清楚我們要出錯的地方。

任何想法?

回答

1

默認情況下,Post()的TStrings版本根據'application/x-www-form-urlencoded'內容類型對輸入數據進行編碼,但是您將ContentType設置爲'text/xml',即使你實際上並沒有發佈原始XML數據。如果你沒有在你的D7代碼中設置ContentType,那麼TIdHTTP會爲你設置ContentType爲'application/x-www-form-urlencoded'。您需要在D2010代碼中反映相同的行爲,或者通過自己設置相同的ContentType值,或者再次刪除該分配,以便TIdHTTP可以再次爲您做。