查询字符串适用于 URL,但不适用于 http.get() delphi 7

Query string works in the URL, but not work in http.get() delphi 7

这是我的查询字符串:


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里http.get()不行 7、错误是:

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);

......

您必须确保传递给 TIdHTTP 的 URL 已正确编码。网络浏览器会自动为您处理。如果您将原始 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 中,您必须手动对原始 URL 进行编码:

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;