【问题标题】:Query string works in the URL, but not work in http.get() delphi 7查询字符串在 URL 中有效,但在 http.get() delphi 7 中无效
【发布时间】:2015-12-23 15:29:17
【问题描述】:

这是我的查询字符串:


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

......

【问题讨论】:

  • 感谢编辑。迦勒。
  • 请显示一些代码。
  • 日期是正确的波斯(shamsi)日期。
  • 尝试对 URL 进行 URL 编码,至少在 ? 之后的部分
  • 当我使用 urlencode 时,错误是:服务器错误...找不到路径。 proxy setting 上的 isp 生效了吗?如何检查它。在某些isp 中,这项工作是正确的,但在其他一些则不起作用。

标签: delphi indy


【解决方案1】:

您必须确保传递给 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;

【讨论】:

  • 感谢雷米勒博。 两个带空格 是错误的。 URL 不允许包含未编码的空格。非常感谢。我的问题已解决。
猜你喜欢
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2020-06-06
  • 2013-01-24
  • 2014-07-30
  • 2016-07-04
相关资源
最近更新 更多