Перейти к содержанию
Fire Monkey от А до Я
  • 0

Get запросы в iOS


Anasazi

Вопрос

Всем добрый день! Получаю координаты с помощью yandex api. Использую вот такой код:

    try
    ////Запрос на Яндекс для получения координат
     MainForm.NetHTTPClient1.Get
    ('https://geocode-maps.yandex.ru/1.x/?geocode='+
    'Кунгур'+
    ',+'
    +street+
    '+улица,+дом+'+
    house, Result);

    finally
    end;

 

Код отрабатывает нормально, но если ну устройстве нет интернета, то приложение просто вылетает. Подскажите пожалуйста как поправить.

Приложение для iOS.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Пользуйтесь Try - Except

try   THttpClient.Create.Get(URL); HasConnection := true; except  HasConnection := false; end;

Ну и вместо компонента TNetHTTPClient я обычно пользуюсь классом THTTPClient в отдельном потоке

 

 

Ссылка на комментарий
  • 0
1 час назад, krapotkin сказал:

Пользуйтесь Try - Except

try   THttpClient.Create.Get(URL); HasConnection := true; except  HasConnection := false; end;

Ну и вместо компонента TNetHTTPClient я обычно пользуюсь классом THTTPClient в отдельном потоке

 

 

Можете поподробнее про  HasConnection := true;

Что это за переменная? Не могу информацию в гугле найти.

Ссылка на комментарий
  • 0
  • Модераторы

проверка интернета

function CheckInet: boolean;
var
  aResp: IHTTPResponse;
  aHTTP: THTTPClient;
begin
  Result := false;
  aHTTP := THTTPClient.Create;
  try
    try
      aResp := aHTTP.Head('http://google.com');
      Result := aResp.StatusCode < 400;
    except
      Result := false;
    end;
  finally
    FreeAndNil(aHTTP);
  end;
end;

get запрос

function HTTPGet(const aURL: string): string;
var
  aHTTP: THTTPClient;
  aResp: TStringStream;
begin
  Result := 'Error';
  aResp := TStringStream.Create('', TEncoding.UTF8);
  aHTTP := THTTPClient.Create;
  try
    try
      aHTTP.Get(aURL, aResp);
      Result := aResp.DataString;
    except
      Result := 'Error';
    end;
  finally
    FreeAndNil(aHTTP);
    FreeAndNil(aResp);
  end;
end;

 

Ссылка на комментарий
  • 0
В 22.03.2017 в 14:20, Равиль Зарипов (ZuBy) сказал:

проверка интернета


function CheckInet: boolean;
var
  aResp: IHTTPResponse;
  aHTTP: THTTPClient;
begin
  Result := false;
  aHTTP := THTTPClient.Create;
  try
    try
      aResp := aHTTP.Head('http://google.com');
      Result := aResp.StatusCode < 400;
    except
      Result := false;
    end;
  finally
    FreeAndNil(aHTTP);
  end;
end;

get запрос


function HTTPGet(const aURL: string): string;
var
  aHTTP: THTTPClient;
  aResp: TStringStream;
begin
  Result := 'Error';
  aResp := TStringStream.Create('', TEncoding.UTF8);
  aHTTP := THTTPClient.Create;
  try
    try
      aHTTP.Get(aURL, aResp);
      Result := aResp.DataString;
    except
      Result := 'Error';
    end;
  finally
    FreeAndNil(aHTTP);
    FreeAndNil(aResp);
  end;
end;

 

Спасибо большое!

Ссылка на комментарий
  • 0
В 22.03.2017 в 14:20, Равиль Зарипов (ZuBy) сказал:

проверка интернета


function CheckInet: boolean;
var
  aResp: IHTTPResponse;
  aHTTP: THTTPClient;
begin
  Result := false;
  aHTTP := THTTPClient.Create;
  try
    try
      aResp := aHTTP.Head('http://google.com');
      Result := aResp.StatusCode < 400;
    except
      Result := false;
    end;
  finally
    FreeAndNil(aHTTP);
  end;
end;

get запрос


function HTTPGet(const aURL: string): string;
var
  aHTTP: THTTPClient;
  aResp: TStringStream;
begin
  Result := 'Error';
  aResp := TStringStream.Create('', TEncoding.UTF8);
  aHTTP := THTTPClient.Create;
  try
    try
      aHTTP.Get(aURL, aResp);
      Result := aResp.DataString;
    except
      Result := 'Error';
    end;
  finally
    FreeAndNil(aHTTP);
    FreeAndNil(aResp);
  end;
end;

 

C CheckInet все получилось, спасибо большое. А вот с HTTPGet не получается, при компиляции вываливается ошибка. HTTPGet вызываю так:

    xml_result:=HTTPGet('https://geocode-maps.yandex.ru/1.x/?geocode='+
   'Кунгур'+
    ',+'
    +street+
    '+улица,+дом+'+
    house, Result);

Подскажите пожалуйста как поправить.

 

 

GetHttp.png

Ссылка на комментарий
  • 0
8 часов назад, krapotkin сказал:

нажать ОК

кликнуть два раза в строку где написано DCC Error и посмотреть, что за строка такая с ошибкой

Говорит что вот эта строка:

function HTTPGet(const aURL: string; const aEncoding: TEncoding = TEncoding.UTF8): string;

 

Ссылка на комментарий
  • 0

Result у Вас какого типа? Попробуйте без него:
 

    xml_result:=HTTPGet('https://geocode-maps.yandex.ru/1.x/?geocode='+
   'Кунгур'+
    ',+'
    +street+
    '+улица,+дом+'+
    house);

 

Изменено пользователем enatechno
Ссылка на комментарий
  • 0
11 часов назад, Равиль Зарипов (ZuBy) сказал:

@Anasazi исправил код, проверьте его. там всего один параметр - принимает ссылку

Все получилось, спасибо большое!

Ссылка на комментарий
  • 0
В 3/22/2017 в 10:20, Равиль Зарипов (ZuBy) сказал:

get запрос

Можно еще сокращенный вариант, без объявления TStringStream;

 Get возвращает IHTTPResponse . Там есть и StatusCode и ContentAsString.

Напомню, переменные тип которых начинаются с буквы I (Interface), как IHTTPResponse не нужно уничтожать, они самоуничтожаются при выходе из процедуры.

uses System.Net.HttpClient;

with THTTPClient.Create do
try
  Result := Get(vURL).StatusCode = ADDED_TO_DB;
finally
  Free;
end;

 

Также в этом теме описано как отправить файл.

 

Изменено пользователем ENRGY
Ссылка на комментарий
  • 0
  • Модераторы
3 минуты назад, ENRGY сказал:

Можно еще сокращенный вариант, без объявления TStringStream;

можно если не писать под iOS, а так это решение кросс

Ссылка на комментарий
  • 0
  • Модераторы
Только что, ENRGY сказал:

Разве этот код не будет работать под iOS? Под Android он работает.

Можете проверить под айос

Да Андроид и винда все норм

Ссылка на комментарий
  • 0
2 часа назад, ENRGY сказал:

Get(vURL).StatusCode = ADDED_TO_DB;

это как-то так себе
StatusCode - это HTTP коды.

тут должно бы быть просто 200

Ссылка на комментарий
  • 0
Var HTTPClient : THTTPClient;
    HTTPResponse : IHTTPResponse;
    LResultStream : TStringStream;
    LQuery, street, house : String;
    LResult : Boolean;
begin
  HTTPClient:=THTTPClient.Create;
  LResultStream:=TStringStream.Create;
  LResult:=True;
  street:='Ленина';
  house:='1';
  LQuery:='https://geocode-maps.yandex.ru/1.x/?geocode='+'Кунгур'+',+'+street+'+улица,+дом+'+house;
  try
    HTTPResponse:=HTTPClient.Get(LQuery, LResultStream);
  except
    LResult:=False;
  end;
  if LResult and (HTTPResponse.StatusCode=200) then
    if LResultStream.Size>0 then
      begin
        // Обрабатываем результат находящийся тут LResultStream.DataString
      end;
  LResultStream.Free;
  HTTPClient.Free;
end;

 

Ссылка на комментарий
  • 0
4 часа назад, krapotkin сказал:

это как-то так себе
StatusCode - это HTTP коды.

тут должно бы быть просто 200

Как вы к примеру подтверждаете из скрипта (напр. PHP) о том что запись добавилась в базу?

Есть 2 варианта - возвращать нужный код (не вижу причин почему не рекомендуется возвращать свой Custom Error Code, имхо это вполне логично), или возвращать текст (напр. ошибки или "ОК"). Возвращать пустую строку при удачном добавлении при error code 200 на мой взгляд не совсем правильно. Что то пропустите в коде скрипта - что -то отвалиться, и в итоге запись не добавиться, при этом в ответ вернется 200 и пустая строка.

 

3 часа назад, Евгений Корепов сказал:

 

Этот код работает под iOS? Равиль ведь писал что там какая то проблема с IHTTPResponse и он не возвращает код. Я к сожалению не смогу проверить в ближайшее время на iOS .

Изменено пользователем ENRGY
Ссылка на комментарий
  • 0

есть протокол HTTP, есть ваш протокол, который идет поверх HTTP

поэтому лучше оставить коды HTTP в покое и передавать все что нужно, в теле ответа. тут уже почти стандарт - к-нить JSON

{"result":true}

вот например, завтра вы вместо "запись добавилась в базу" захотите узнать, а "сколько записей удалилось из базы"? как тут быть с кодами ответа?

а если этот вызов впоследствии будет осуществляться через Web-интерфейс? тут вообще без вариантов...

поэтому вариант с JSON наиболее предпочтителен

Ссылка на комментарий
  • 0
  • Модераторы
54 минуты назад, ENRGY сказал:

Этот код работает под iOS? Равиль ведь писал что там какая то проблема с IHTTPResponse и он не возвращает код. Я к сожалению не смогу проверить в ближайшее время на iOS .

Будет работать, самое важное тут не код ответа,  а возврат данных от сервера.

По сути код ответа не нужен если вы работаете со своим сервером, как предложил Владимир общение клиент-сервер нужно строить на json/xml и тд.

Ссылка на комментарий
  • 0
1 час назад, krapotkin сказал:

есть протокол HTTP, есть ваш протокол, который идет поверх HTTP

поэтому лучше оставить коды HTTP в покое и передавать все что нужно, в теле ответа. тут уже почти стандарт - к-нить JSON

Здесь вы не совсем правы. Эти коды и придуманы в том числе и для использования в своих целях.

Цитата

 RFC 2616: "HTTP status codes are extensible. HTTP applications are not required to understand the meaning of all registered status codes, though such understanding is obviously desirable. However, applications MUST understand the class of any status code, as indicated by the first digit, and treat any unrecognized response as being equivalent to the x00 status code of that class, with the exception that an unrecognized response MUST NOT be cached. For example, if an unrecognized status code of 431 is received by the client, it can safely assume that there was something wrong with its request and treat the response as if it had received a 400 status code."

Они разделены на классы.

200 это коды "удачные", 400 "не удачные" итп. Есть зарезервировнные значения, все остальное можно использовать.

Не спорю, это не так удобно как текст.  Но имхо в таких простых boolean запросах проще использовать текст 'ОК', если это не ОК, значит интепретировать как ошибку, ведь по факту какая нибудь ошибка скрипта отображается простым текстом, без json форматирования. И код станет и прозрачней и быстрее.

А если понадобится возвращать сложные данные, то это будет уже другой запрос, со своей описанной в доках структурой (json).

Изменено пользователем ENRGY
Ссылка на комментарий
  • 0
38 минут назад, ENRGY сказал:

Здесь вы не совсем правы. Эти коды и придуманы в том числе и для использования в своих целях.

Они разделены на классы.

200 это коды "удачные", 400 "не удачные" итп. Есть зарезервировнные значения, все остальное можно использовать.

Не спорю, это не так удобно как текст.  Но имхо в таких простых boolean запросах проще использовать текст 'ОК', если это не ОК, значит интепретировать как ошибку, ведь по факту какая нибудь ошибка скрипта отображается простым текстом, без json форматирования. И код станет и прозрачней и быстрее.

А если понадобится возвращать сложные данные, то это будет уже другой запрос, со своей описанной в доках структурой (json).

Не забывайте что между вашим скриптом на php и клиентом есть еще http сервер. Ваш запрос может и не дойти до модуля php, всякое бывает (обслуживание сервера, ddos атака и т.п.). В этом случае вы не сможете понять кто именно прислал вам HTTP status. Так что HTTP status codes лучше оставить в покое. Но проверять на 200 его нужно, этим вы точно определяете что ответ валидный и пришел с живого http сервера, далее уже нужно проверять содержимое ответа. Если так не хочется отдавать в ответ JSON, есть другие способы, к примеру cookie или header. Но тут тоже сложности - оперативно проверить работу сервера в браузере уже не получится, нужны специальные инструменты.

Ссылка на комментарий
  • 0

 

16 минут назад, Евгений Корепов сказал:

Не забывайте что между вашим скриптом на php и клиентом есть еще http сервер. Ваш запрос может и не дойти до модуля php, всякое бывает (обслуживание сервера, ddos атака и т.п.). В этом случае вы не сможете понять кто именно прислал вам HTTP status. 

Понять легко, если использовать не зарезервированные номера. Мануал это и рекомендует, первая цифра класс статуса, остальные 2 свои.

Другое дело что может быть проблема с прокси серверами. 

Изменено пользователем ENRGY
Ссылка на комментарий
  • 0
8 часов назад, ENRGY сказал:

 

Понять легко, если использовать не зарезервированные номера. Мануал это и рекомендует, первая цифра класс статуса, остальные 2 свои.

Другое дело что может быть проблема с прокси серверами. 

Подумайте о будущем, если проект будет развиваться и одной цифры ошибки станет не достаточно. Подумайте о наследниках-программистах (или о себе через пять лет) которые будут чесать репу и угадывать (вспоминать) что же означает каждая цифра ответа. Времена экономии каждого байта трафика прошли. Вспомните истории предшественников - 640 килобайт более чем достаточно для любого компьютера, 4294967296 ip адресов достаточно для всего человечества, размера MTU 1500 байт достаточно для TCP пакета в обозримом будущем, максимального размера файла в 4 гигабайта достаточно для любых нужд и вряд ли в будущем появятся накопители объемом более 9 терабайт (FAT32).

Отдавая данные/результат в теле ответа в формате JSON вы развязываете себе руки и делаете задел на будущее. Вначале вам достаточно будет вот такого 

{
    "status" : true,
    "error" : 0
}

потом возможно такое

{
    "status" : false,
    "error" : 123,
    "errormessage" : "mysql deadlock in tables employments",
}

а потом еще что нибудь

{
    "status" : true,
    "error" : 0,
    "errormessage" : "",
    "executiontime" : 304,
    "clastersource" : "bagama_server"
}

все эти добавления займут у вас одну-две строчки на php и одну-две строчки в приложении. При этом, вы сможете диагностировать ответ сервера, сидя на берегу моря, с помощью браузера вашего телефона.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...