2017-02-20 17 views
0

Я видел много примеров в Интернете, но я не могу понять, почему мой код не работает.Delphi indy получить содержимое страницы

У меня есть URL, который выглядит следующим образом:

http://www.domain.com/confirm.php?user=USERNAME&id=THEID 

confirm.php это страница, которая делает некоторые проверки в базе данных MySQL, а затем только вывод страницы является 0 или -1 (истина или ложь):

<?php 

//long code... 
if (...) { 
echo "0"; // success! 
die(); 
} else { 
echo "-1"; // fail! 
die(); 
} 

?> 

Моего Delphi FireMonkey приложение должно открыть URL выше, передавая имя пользователя и идентификатор, а затем прочитать результат страницы. Результат - только -1 или 0. Это код.

//I have created a subclass of TThread 
procedure TRegister.Execute; 
var 
    conn: TIdHTTP; 
    res: string; 
begin 

    inherited; 

    Queue(nil, 
    procedure 
    begin 
     ProgressLabel.Text := 'Connecting...'; 
    end 
); 

    //get the result -1 or 0 
    try 

    conn := TIdHTTP.Create(nil); 
    try 
     res := conn.Get('http://www.domain.com/confirm.php?user='+FUsername+'&id='+FPId); 
    finally 
     conn.Free; 
    end; 

    except 
    res := 'error!!'; 
    end; 

    Queue(nil, 
    procedure 
    begin 

     ProgressLabel.Text := res;  
    end 
); 

end; 

Значение res всегда error!! и никогда -1 или 0. Где мой код не так? Ошибка выудить из on E: Exception do является:

HTTP/1.1 406 не приемлемо

+0

Ну появляется 'ошибка !!' только происходит, когда возбуждается исключение. Вы должны прочитать исключение и сообщить нам точное исключение, которое действительно поднимает. В противном случае все, что мы можем сделать, это догадываться, и есть миллионы возможных догадок, которые мы могли бы сделать. –

+0

Таким образом, ваш исключающий блок должен быть больше похож на 'кроме E: Exception do begin res: = 'EXCEPTION:' + E.Messages; конец; end; 'Пожалуйста, сделайте это, а затем отредактируйте свой вопрос, чтобы предоставить точное исключение, которое возникает. –

+0

Также, если вы находитесь под ARC, нет необходимости снимать объект –

ответ

1

Ошибка HTTP 406 Not acceptable обычно означает, что сервер не в состоянии реагировать с содержанием типа клиент хотел. И Серверу, и Клиенту необходимо надлежащим образом использовать MIME-тип по мере необходимости. В этом случае заголовки вашего клиента Accept должны обеспечивать требуемый тип ответа, и ваш сервер также должен отвечать одинаково. В вашем случае, Content-Type, скорее всего, будет text/plain.

Короче говоря, ваш клиент ожидает тип MIME, который сервер явно не возвращает в своем ответе. Проблема может быть с обеих сторон, или, возможно, с обоими.

  1. Заголовки Accept вашего клиента должны предоставить тип (и) MIME, которые вы ожидаете и нуждаетесь. В частности, Accept, Accept-Charset, Accept-Language, Accept-Encoding. По умолчанию в Indy TIdHTTP эти заголовки должны принимать практически все, если эти заголовки не были перезаписаны. Заголовок Accept по умолчанию установлен в text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q‌​=0.8, где */* открывает дверь для любого типа MIME.
  2. Ответ вашего сервера Content-Type должен быть одним из предоставленных типов MIME, а также форматом ответа, который также желателен клиентом. Вполне вероятно, что ваш HTTP-сервер не предоставит соответствующий ответ Content-Type. Если сервер отвечает чем-либо в файле */* (который должен означает все), то клиент примет его (при условии, что сервер отвечает text/plain). Если сервер отвечает недопустимым типом контента (например, только text или plain), тогда он может быть отклонен.
+0

Итак, если сервер имеет заголовок («Content-Type: text/plain»), клиент должен иметь возможность читать текст/обычную. Верный? –

+0

@ RaffaeleRossi Заголовки 'Accept' вашего клиента также должны отражать то же самое. –

+0

Помогает ли кто-нибудь объяснить свои голоса? –

1

Я нашел решение, используя System.Net.HttpClient. Я могу просто использовать эту функцию

function GetURL(const AURL: string): string; 
var 
    HttpClient: THttpClient; 
    HttpResponse: IHttpResponse; 
begin 
    HttpClient := THTTPClient.Create; 
    try 
    HttpResponse := HttpClient.Get(AURL); 
    Result := HttpResponse.ContentAsString(); 
    finally 
    HttpClient.Free; 
    end; 
end; 

Это работает и дает мне -1 и 0, как я и ожидал.Чтобы получить пример рабочего кода, который я испытал это:

procedure TForm1.Button1Click(Sender: TObject); 

function GetURL(const AURL: string): string; 
var 
    HttpClient: THttpClient; 
    HttpResponse: IHttpResponse; 
begin 
    HttpClient := THTTPClient.Create; 
    try 
    HttpResponse := HttpClient.Get(AURL); 
    Result := HttpResponse.ContentAsString(); 
    finally 
    HttpClient.Free; 
    end; 
end; 

function GetURLAsString(const aURL: string): string; 
var 
    lHTTP: TIdHTTP; 
begin 
    lHTTP := TIdHTTP.Create; 
    try 
    Result := lHTTP.Get(aURL); 
    finally 
    lHTTP.Free; 
    end; 
end; 

begin 

Memo1.Lines.Add(GetURL('http://www.domain.com/confirm.php?user=user&id=theid')); 
Memo1.Lines.Add(GetURLAsString('http://www.domain.com/confirm.php?user=user&id=theid')) 

end; 

end. 

Первая функция работает отлично, но Indy вызывает исключение HTTP/1.1 406 не приемлемое. Кажется, что Indy не может автоматически обрабатывать тип содержимого страницы. Здесь вы можете увидеть журнал REST Debugger:

enter image description here

+0

Indy вместо этого не работал, и это было плохо, потому что это всегда давало мне HTTP/1.1 406 неприемлемым. Это решение лучше. –

+0

Indy работает просто отлично. Ошибка означает, что вы просто не настраиваете ее правильно для работы со своей страницей PHP, или наоборот. –

+0

"* Кажется, что Indy не может автоматически обрабатывать тип содержимого страницы *" - у Indy нет проблем с типом страницы. Это PHP, который сообщает об ошибке, потому что у него возникла проблема с обработкой запроса Indy. –

 Смежные вопросы

  • Нет связанных вопросов^_^