2013-08-21 18 views
1

最近從Delphi 2006轉換到XE3的程序和我有一個TidHttp的問題。下面是代碼:TidHttp和XE3

Result := ''; 
myCurrentTime := FormatDateTime('yyyymmddhhnnss',now); 

myParams := '<params>'; 
myParams := myParams + '<licence>' + '1234567890' + '</licence>'; 
myParams := myParams + '<activationcode>' + 'abcdef' + '</activationcode>'; 
myParams := myParams + '<devicename>' + 'aaa' + '</devicename>'; 
myParams := myParams + '<deviceid>' + 'bbb' + '</deviceid>'; 
myParams := myParams + '<devicetimestamp>' + myCurrentTime + '</devicetimestamp>'; 
myParams := myParams + psRequest; 
myParams := myParams + '</params>'; 

myRequestStream := nil; 
myResponseStream := nil; 
myHTTP := nil; 
myXMLDocument := nil; 

finished := false; 
myAttempts := cAttempts; 

while finished = false do 
begin 
try 
    myRequestStream := TMemoryStream.Create; 
    myResponseStream := TMemoryStream.Create; 
    myHTTP := TIdHTTP.Create; 
    myXMLDocument := TXMLDocument.Create(nil); 

    myParams := mEncoder.Encode(myParams); 

    myRequestStream.Write(myParams[1], Length(myParams)); 
    myRequestStream.Position := 0; 

    myHTTP.Request.Method := 'POST'; 
    myHTTP.ReadTimeout := piTimeoutSeconds * 1000; 
    myHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
    myHTTP.Request.ContentLength := myRequestStream.Size; 
    myHTTP.ProtocolVersion := pv1_1; 

    myHTTP.Post(psUrl, myRequestStream, myResponseStream); 

繼後,我得到的錯誤「引發的異常是在基地64串無效字符」 - 這被報告爲「{」在錯誤處理程序。

我一直在淘網,但找不到答案。任何建議將不勝感激。

謝謝。

Steve

回答

0

您只將一半的請求細節放入流中。在德爾福2009年,string成爲一種Unicode類型,其中每個字符佔用兩個字節。 Length度量字符,而TStream.Write需要字節數。

一個簡單的解決方案是將myParams更改爲AnsiString

+1

使用'TStringStream'或Indy的WriteStringToStream()函數會更好,它們都支持Unicode字符串,並會將它們轉換爲字節。不要確定代碼(特別是如果你計劃遷移到移動設備,因爲在Embarcadero的移動編譯器中AnsiString不再存在)。 –