2013-04-08 1 views
2

В настоящее время я работаю над проектом, требующим нескольких веб-приложений, написанных в Prolog, и я решил использовать известную библиотеку PWP для SWI-Prolog. Который анализирует script with prolog queries inside an HTML file.Обработка строки запроса HTTP внутри страницы HTML PWP в Prolog

У меня есть страница в ответ на следующий пример запроса:

/user?id=N 

Где N представляет собой целое значение.

Но у меня возникли проблемы с чтением строки запроса ID запроса внутри HTML-файла.

У меня есть файл .pl:

showUser(UserId, Request) :- 
    reply_pwp_file(mydir('user_page.html'), [mime_type('text/html')], Request). 

Я не знаю, как я могу читать UserId или Request снова восстановить UserId в строках запроса.

Я попробовал этот путь в HTML разметке:

<span pwp:ask="http_parameters(Request, [id(UserId, [optional(true)])])." pwp:use="UserId" /> 

Кто-то имел такого рода проблемы раньше?

спасибо.

Вот некоторые интересные ссылки, которые могут помочь нам:

+0

Действительно ли «знаменитая» библиотека PWP? Если я google 'pwp library', я никогда не получаю ни одного URL-адреса ... Это безумие ... – CapelliC

ответ

0

Это действительно из голубой, так как я не месили Пролог в течение длительного времени, но я немного удивлен усилиями по написанию веб-приложений в Prolog, и потому, что я сочувствую (длинный рассказ: я пробовал себя много лет назад, но это был не чистый Prolog), я подумал, что могу просто воспользоваться своим шансом указать вам что я заметил, прочитав e документация. Его ясность и экстенсивность, кстати, составляют , а не, почему PWP является «знаменитым», я полагаю.

Тем не менее, похоронен где-то на странице PWP, с которой вы связались, есть рекламный ролик об атрибуте pwp:use, который, как говорят, принимает значение Term.

Term - срок пролога; переменные в Term связаны контекстом. Пустое значение Term считается отсутствующим значением для этого атрибута. Переменная Prolog CONTEXT относится ко всему контексту, список Name = Value, где Name - это пролог, содержащий имя переменной контекста, а Value - произвольный термин Пролога.

Похоронен где еще, а именно documentation page для reply_pwp_page/3 (ой, нет reply_pwp_file/3 там на странице вы связаны, на самом деле, даже если вы использовали его), есть еще один интересный фрагмент листинга содержимое SO- называется исходный контекст, и в частности:

QUERY [это] Var=Value список, представляющий параметры запроса-

Поскольку нет подсказки или предположения или даже примера использования списка параметров запроса, но это вряд ли является наихудшей проблемой для тех, кто вынужден писать веб-приложения в Prolog в любом случае - мой личный подход заключается в том, что имя для параметра запроса id только id (надеясь, что Var - это просто неправильное имя для Param, а не настоящая переменная Prolog) и что это значение, ну, просто значение, но тогда мы ничего не знаем о конверсиях или что-то еще, что может произойти автоматически во время разбора запроса string, так как в строке запроса все есть, ну, строка, но вам может понадобиться числовое значение id, и вы, вероятно, останетесь на своем собственном преобразовании этой строки в число. Наверное, там какой-то волшебный предикат делает именно это. Разве Пролог не замечательный?

Итак, без какой-либо другой подсказки и с большой благодарностью за тех, кто пишет документацию этого ... материала, моя дикая догадка заключается в том, что вам нужен где-то следующий элемент, но пустой span, тем не менее, что является незаконным в любом разумно действительный HTML документ:

<span pwp:ask="..."/> 

, где, как значение ask, вы должны предоставить запрос, который пересекают CONTEXT список (с помощью member/2, может быть?) до тех пор, пока не найдет член вида 'QUERY'=QueryParameters; то в QueryParameters у вас должен быть список фактических параметров запроса, поэтому вам нужно пройти его таким же образом, как и список CONTEXT, и когда вы найдете здесь термин «id=N», вы, наконец, N должны содержать значение вашего вряд ли заработал идентификатор пользователя.

Теперь я действительно надеюсь, что это проще, чем то, что я изложил. Помните, это просто дикая догадка, глядя на документацию, на которую вы указали. Но, в то время как другие, вероятно, будут заняты путём голосования по этому вопросу по ряду причин (и, надеюсь, потому, что это просто неправильно, а решение проще), мое последнее предложение о разводе - это обсуждение ограничений вашего проекта опять же с тем, кто отвечает за них, потому что писать веб-приложения в Prolog - это действительно необоснованная вещь, когда есть много из фреймворков (frameworks, я говорю, не только какой-то модуль брошен в стандартную библиотеку для " больше хорошего "), написанные на других языках, которые невероятно хорошо документированы, гораздо проще понять и, конечно же, использовать.

1

Мне понадобилось некоторое время, но, по крайней мере, мне удалось запустить demo_pwp.pl, который я нашел в ~/pl-devel/packages/http/examples.Теперь, после того, как

?- server(1234). 

Я ссылка открывалась

http://localhost:1234/user_id.pwp?user_id=1&user_name=carlo 

где я писал в ~/pl-devel/packages/http/examples/pwp/user_id.pwp файле

<?xml version="1.0"?> 
<!DOCTYPE html> 

<html xmlns:pwp="http://www.cs.otago.ac.nz/staffpriv/ok/pwp.pl"> 

<head> 
    <title>Context variables for PWP scripts</title> 
</head> 
<body> 
    <p>This PWP demo lists the context-parameters that are passed into 
    the script. 
    </p> 
    <ul> 
    <li pwp:ask="member(Name=Value, CONTEXT)"> 
     <span class=name pwp:use="Name"/> 
     = 
     <span class=value pwp:use="writeq(Value)"/> 
    </li> 
    </ul> 
    <!-- here is the specific part for my answer --> 
    <p pwp:ask="memberchk('QUERY'=Q, CONTEXT),memberchk(user_id=UID,Q),memberchk(user_name=NAME,Q)"> 
    UID : <span pwp:use="UID"/>/NAME : <span pwp:use="NAME"/> 
    </p> 
    <!-- nested access is well thought --> 
    <p pwp:ask="member('QUERY'=Q,CONTEXT)"> 
    UID : <span pwp:use="UID" pwp:ask="member(user_id=UID,Q)"/> 
/NAME : <span pwp:use="NAME" pwp:ask="member(user_name=NAME,Q)"/> 
    </p> 
</body> 

</html> 

(это копия context.pwp, с добавленным мою информацию в нижней части) и я получаю

This PWP demo lists the context-parameters that are passed into the script. 
...  
- QUERY = [user_id='1',user_name=carlo] 
...  
UID : 1/NAME : carlo 
UID : 1/NAME : carlo 

Тогда я могу подтвердить, что рекомендации, предложенные Джулио, в порядке.

+0

Спасибо! По меньшей мере 'memberchk/2' упрощает операции перемещения списка. –

+0

@GiulioPiancastelli: Я не знал о PWP, теперь должен сказать, что мне это нравится, и я буду использовать. Спасибо, что намекнул и прямо сказал, о чем вы думаете. Конечно, я не согласен :) – CapelliC

+1

Несогласие делает все более интересным или, по крайней мере, сложным, и это не так уж плохо. ;) –

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