// codeart.ru / Вопрос/Ответ / Продолжаю набивать шишки со строками в Erlang Форум

Продолжаю набивать шишки со строками в Erlang rss подписка

Автор: Evgeniy Sergeev

Сегодня начал делать валидацию урлов для defaceit. Решил сделать по-простому — перед сохранением урла в базу пытаюсь получить скрипт добавляемого дефейса через httpc:request. Если скрипт получен удачно, то новый урл попадает в базу, если нет, то выдаю сообщение об ошибке. Проблема возникла где сам не ожидал, оказалось, что я очень плохо понимаю работу строк в Erlang. Далее расскажу более подробно что и как.

Итак, есть такой код:


Referer = "http://" ++ defaceit:get_host_from_url(Req:post_param("url")) ++ "/defaceit/" ++ Req:post_param("app") ++ "/" ++ Req:post_param("app") ++ ".js"

который строит полный урл до скрипта с дефейсом и кладет все это дело в переменную Referer. Естественно, что для того чтобы проверить грузится ли данный скрипт я добавляю такую строку:

{ok, _} = httpc:request(Referer) // Здесь выполняется проверка, что скрипт загружен успешно, если скрипт не загружается то вываливаемся в ошибку

и все бы ничего, но ошибка вываливается как для нормального, так и для несуществующего урла. Начинаю разбираться. Первым делом проверяю значение Referer через функцию io:format. На экране отображается корректный урл. Если его подставить вместо Referer в http:request, то загрузка скрипта происходит успешно…

Здесь начинаются пляски с бубном в попытках понять, что же не так с моим кодом. Не буду приводить описание всех действий, которые я производил, а перейду сразу к окончанию данной истории. Проблема оказалось в том, что функция defaceit:get_host_from_url возвращала не строку, а список состоящий из одной строки. Т.е., например, вместо:

"www.codeart.ru"

возвращалось

["www.codeart.ru"] // здесь уже не строка, а список.

В итоге при отображении на экране и сохранении в базе все работало корректно, а вот при запросе через http:request выдавалась ошибка.

Приведу еще небольшой кусок вывода из интерпретатора Erlang-а, чтобы суть проблемы стала окончательно ясна:


1> A = ["aaaa"].
["aaaa"]
2> B = "bbbb".
"bbbb"
3> io:format(A++B).
aaaabbbb
4> A++B.
["aaaa",98,98,98,98]

  1. Сделал бы так :
    Referer = lists:flatten([«http://», defaceit:get_host_from_url(Req:post_param(«url»)) ,»/defaceit/»,Req:post_param(«app»), «/»,Req:post_param(«app»),».js»])
    И быстрее отработает и устранит твою ошибку…

  2. egobrain, спасибо за совет. :-) Попробую так сделать.

  3. egobrain, egobrain.livejournal.com — твой журнал?

  4. Интересно. Хотелось бы увидеть еще статей про эрланг)

  5. Постараюсь больше писать про erlang, только я совсем нулевой в этом языке.

Leave a Reply

« »