Indy HTTP отправляет только цифры и останавливается на буквах

Я использую Indy с Lazarus

Вот мой код:

IdHTTP1.Request.ContentType  := 'text/plain' ;
IdHTTP1.Response.ContentType :=  'text/plain' ;
IdHTTP1.Response.Charset :=  'ISO-8859-1,utf-8;q=0.7,*;q=0.3'   ;
IdHTTP1.Request.CharSet:=    'ISO-8859-1,utf-8;q=0.7,*;q=0.3 '  ;
IdHTTP1.HTTPOptions := IdHTTP1.HTTPOptions + [hoNoProtocolErrorException];      
IdHTTP1.Get('http://192.168.25.965:8541/rest/SearchCard('+MYCARD+')',Stream)  ; 

Если я начну MYCARD с буквы, сервер получит всю строку. Однако, если я начну с числа, оно остановится на первой букве.

MYCARD:= '12366854';     //works 

MYCARD:= 'A125ASD555';   //Works 

MYCARD:= '123YH963';   // The server only sees 123 

Что я делаю не так?


person Yon    schedule 12.07.2016    source источник
comment
Мне кажется, что вы пытаетесь поместить javascript в URL...   -  person Jerry Dodge    schedule 13.07.2016


Ответы (1)


Во-первых, два свойства Request, которые вы устанавливаете, не имеют смысла в запросе GET, и вы вообще не должны устанавливать какие-либо свойства Response.

// get rid of these assignments
//IdHTTP1.Request.ContentType  := 'text/plain' ;
//IdHTTP1.Response.ContentType :=  'text/plain' ;
//IdHTTP1.Response.Charset :=  'ISO-8859-1,utf-8;q=0.7,*;q=0.3'   ;
//IdHTTP1.Request.CharSet:=    'ISO-8859-1,utf-8;q=0.7,*;q=0.3 '  ;

IdHTTP1.HTTPOptions := IdHTTP1.HTTPOptions + [hoNoProtocolErrorException];      
IdHTTP1.Get('http://192.168.25.965:8541/rest/SearchCard('+MYCARD+')', Stream); 

Во-вторых, используя текущую версию Indy, я не могу воспроизвести вашу проблему. TIdHTTP.Get() отправляет указанный URL как есть, он не делает никаких предположений о символах в нем (вы несете ответственность за кодировку URL). В моем тестировании 123YH963 работает просто отлично. Вот реальный отправляемый HTP-запрос:

GET /rest/SearchCard(123YH963) HTTP/1.1
Хост: 192.168.25.965:8541
Принять: text/html,application/xhtml+xml,application/xml;q=0.9 ,/;q=0.8
Агент пользователя: Mozilla/3.0 (совместимый; Indy Library)

Как видите, полный текст MYCARD находится в запрошенном ресурсе, как и ожидалось. Таким образом, любое усечение должно происходить на стороне сервера, а не в самом TIdHTTP.

Вы уверены, что правильно форматируете URL-адрес? Вы уверены, что на самом деле это должно быть отправлено так:

/rest/SearchCard(123YH963)

А не что-то подобное вместо этого?

/rest/SearchCard%28123YH963%29

/rest/SearchCard/123YH963

/rest/SearchCard?param=123YH963
person Remy Lebeau    schedule 12.07.2016
comment
Изменение кода на /rest/SearchCard/123YH963 помогло! - person Yon; 13.07.2016