2012-01-19 34 views
4

我需要從我的Delphi應用程序發佈一些數據到Web服務。總之什麼I'm做的是這個德爾福的utf8encode包括字符串末尾的 r n

http := TIdHTTP.Create(nil); 
params := TIdMultiPartFormDataStream.Create; 
params.AddFormField('param', utf8encode('value')); 
http.Post('myurl', params); 

在服務器日誌中我得到這個

{"param"=>"value\r\n"} 

我不知道這是否是utf8encode或TidHTTP.post被包括在該CRLF字符串的結尾。任何想法如何防止這種情況發生?

+5

這不是'UTF8Encode'。 –

+0

要驗證,請嘗試使用param輸入字段的簡單手寫HTML表單。或者使用Synapse發送相同的請求,並查看服務器是否仍有額外的字符。或者使用Fiddler。 – mjn

+0

@mjn我使用curl做了測試,服務器沒有包含'\ r \ n',並且如Andreas所說,它不是utf8encode,所以它只保留TidHTTPClient ...我想這是它添加\ r \ n。不知道爲什麼 –

回答

3

TIdHTTPTIdMultipartFormDataStream不會不必要地增加額外換行符。此外,您手動編碼文本的事實告訴我,您可能會使用舊版本的Indy。在當前10.5.8的SVN版本,AddFormField()ACharset參數,該參數設置TIdFormDataField.CharSet財產,所以TIdMultipartFormDataStream可以在內部爲您在需要時編碼的文字,如:

http := TIdHTTP.Create(nil); 
params := TIdMultiPartFormDataStream.Create; 
params.AddFormField('param1', 'value1', 'utf-8'); 
params.AddFormField('param2', 'value2', 'utf-8'); 
params.AddFormField('param3', 'value3', 'utf-8'); 
http.Post('myurl', params); 
0

進一步調查顯示,TidHTTPClient和TIdMultiPartFormDataStream包含'\ r \ n'到最後添加的參數。例如

http := TIdHTTP.Create(nil); 
params := TIdMultiPartFormDataStream.Create; 
params.AddFormField('param1', utf8encode('value1')); 
params.AddFormField('param2', utf8encode('value2')); 
params.AddFormField('param3', utf8encode('value3')); 
http.Post('myurl', params); 

結果

{"param1"=>"value1", "param2"=>"value2", "param3"=>"value3\r\n"} 

添加

params.AddFormField('', ''); 

所有PARAMS解決了這個問題之後。不是理想的解決方案,但現在可以。

+1

也許您的Indy版本不是最新版本(當前是10.5.8) – mjn

+0

似乎是HTTP,SMTP和其他RFC協議工作方式的標準工件。您畢竟發送和接收一段文本,並將其分割成多行,並且可能在另一側接收數據的代碼依賴於現有的cr + lf。 –

+0

如果你寫的curl POST(使用-d參數)沒有發生同樣的情況,我想這是你Indy版本中的一個bug。也許Indy在捲曲使用\ n時發送尾部\ r \ n,或類似的東西。 – mjn