查询字符串在URL中起作用,但在http.get()delphi 7中不起作用

时间:2015-12-23 15:29:18

标签: delphi indy

这是我的查询字符串:

http://statement.dana-insurance.com/api/insurance?input=<Statement><GroupId>aseman</GroupId><Password>As1234</Password><StatementNo>87841</StatementNo><StatementSerial>92/1/n</StatementSerial><StatementType>MINIBUS-SEDAN</StatementType><DriverSmartCard1>3146339</DriverSmartCard1><DriverSmartCard2>0</DriverSmartCard2><DriverSmartCard3>0</DriverSmartCard3> <NavySmartCard>1776166</NavySmartCard><TotalRentalPrice>320000</TotalRentalPrice><CityDistance>140</CityDistance><BodyInsurancePrice>0</BodyInsurancePrice><AboardInsurancePrice>1400</AboardInsurancePrice><OriginCode>31380000</OriginCode><DestinationCode>31310000</DestinationCode><MoveDate>1394/10/09</MoveDate> <MoveTime>18:31</MoveTime><PassengerCount>4</PassengerCount><ChairCount>4</ChairCount><NavyType>SEDAN</NavyType><CompanyCode>31523</CompanyCode><PlaqueNumber>575n19</PlaqueNumber><PlaqueSerial>12</PlaqueSerial><ValidateTime>1</ValidateTime><IsTtwicePaid>0</IsTtwicePaid><CarType>NORMAL</CarType><Type>INSERT</Type></Statement>

它在浏览器中有效,但在delphi 7中的http.get()中不起作用,错误是:

server error http/1.1 400 bad request ( the date is invalid )

注意:当我更改ISP并连接到其他互联网连接时,它可以正常工作。

这是我的代码:

http:=TIdHTTP.Create(nil);
HTTP.AllowCookies:=true;
http.HandleRedirects := true;
http.ReadTimeout := 45000;
param:=TStringList.create;
Strings := TStringList.Create;
http.Request.ContentType := 'text/xml';
http.Request.Accept := 'text/xml, */*';
http.ReadTimeout:= 100000;
Memo1.Lines.Add(Req_String);
try
dana_str:=http.get(Req_String);

...

1 个答案:

答案 0 :(得分:2)

您必须确保传递给TIdHTTP的网址已正确编码。 Web浏览器会自动为您处理。如果您将原始URL提供给浏览器并使用数据包嗅探器来查看URL在传输过程中的编码方式,您会看到实际的URL是:

http://statement.dana-insurance.com/api/insurance?input=<Statement><GroupId>aseman</GroupId><Password>As1234</Password><StatementNo>87841</StatementNo><StatementSerial>92/1/n</StatementSerial><StatementType>MINIBUS-SEDAN</StatementType><DriverSmartCard1>3146339</DriverSmartCard1><DriverSmartCard2>0</DriverSmartCard2><DriverSmartCard3>0</DriverSmartCard3>%20<NavySmartCard>1776166</NavySmartCard><TotalRentalPrice>320000</TotalRentalPrice><CityDistance>140</CityDistance><BodyInsurancePrice>0</BodyInsurancePrice><AboardInsurancePrice>1400</AboardInsurancePrice><OriginCode>31380000</OriginCode><DestinationCode>31310000</DestinationCode><MoveDate>1394/10/09</MoveDate>%20<MoveTime>18:31</MoveTime><PassengerCount>4</PassengerCount><ChairCount>4</ChairCount><NavyType>SEDAN</NavyType><CompanyCode>31523</CompanyCode><PlaqueNumber>575n19</PlaqueNumber><PlaqueSerial>12</PlaqueSerial><ValidateTime>1</ValidateTime><IsTtwicePaid>0</IsTtwicePaid><CarType>NORMAL</CarType><Type>INSERT</Type></Statement>

请注意,有两个空格字符已编码为%20。 URL不允许包含未编码的空格。

TIdHTTP中,您必须手动对原始网址进行编码:

dana_str := http.get(TIdURI.URLEncode(Req_String));

可替换地:

dana_base_url := 'http://statement.dana-insurance.com/api/insurance?';
data_query = 'input=...';
dana_str := http.get(dana_base_url + TIdURI.ParamsEncode(data_query));

可替换地:

with TIdURI.Create do
try
  Protocol := 'http';
  Host := 'statement.dana-insurance.com';
  Path := '/api/insurance';
  Params := ParamsEncode('input=...');
  dana_str := http.get(URI);
finally
  Free;
end;