2016-12-18 3 views
1

Я пытаюсь отправить JSON после использования этого запроса: http://localhost:8080/json_test?id=1 Это мой код до сих пор:Ответ с JSON на запрос HTTP

:- use_module(library(http/thread_httpd)). 
:- use_module(library(http/http_dispatch)). 
:- use_module(library(http/http_parameters)). 

:- http_handler('/json_test', json_test, []). 

nomeEdificio(1, "Torre dos Clérigos"). 
nomeEdificio(2, "Fonte dos Leões"). 

anoConstrucao(1, 1754). 
anoConstrucao(2, 1882). 

anoInauguracao(1, 1763). 
anoInauguracao(2, 1884). 

server(Port) :-      
    http_server(http_dispatch, [port(Port)]). 

json_test(Request) :- 
http_parameters(Request, 
       [ id(Id, [])] 
       ), 
    compute_request(Id,PrologOut), 
    prolog_to_json(PrologOut,JSonOut), 
    reply_json(JSonOut). 

compute_request(Id,PrologOut):- 
    nomeEdificio(Id,N), anoConstrucao(Id,Ac), anoInauguracao(Id,Ai), % Some consulting operations 
    PrologOut = json([ name=N, 
     dates=json([yearConstruction=Ac, yearInauguration=Ai]) 
    ]). 

Но я получаю эту ошибку:

"Internal server error 

goal unexpectedly failed: user:json_test([protocol(http),peer(ip(127,0,0,1)),pool(client('[email protected]',user:http_dispatch,<stream>(00000000056CE8C0),<stream>(00000000056CCD90))),input(<stream>(00000000056CE8C0)),method(get),request_uri('/json_test?id=1'),path('/json_test'),search([id='1']),http_version(1-1),host(localhost),port(8080),user_agent('Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'),accept([media(text/html,[],1.0,[]),media(application/'xhtml+xml',[],1.0,[]),media(application/xml,[],0.9,[]),media(_G3007/_G3008,[],0.8,[])]),accept_language('en-US,en;q=0.5'),accept_encoding('gzip, deflate'),connection('keep-alive'),upgrade_insecure_requests('1')])" 

Я не могу понять, что не так, документации о том, как использовать эти предикаты Пролога, мало. Любая помощь приветствуется, спасибо.

+0

Прочитайте документацию ['http_parameters/2'] (http://eu.swi-prolog.org/pldoc/doc_for?object=http_parameters/2) для преобразования типов, а также проверьте **' attribute_declarations/1' ** вариант ['http_parameters/3'] (http://eu.swi-prolog.org/pldoc/doc_for?object=http_parameters/3) для преобразования' ID' в ** целое число **, так что вы можете запросить с ней свою базу данных. – mat

+0

Спасибо! Я не знал о разных типах. Он работает с параметрами http_parameters (Request, [id (Id, [integer])]). – TiagoS

ответ

1

Неполное пример

Когда я загружаю код отвечал, я получаю:

 
    catch/3: Undefined procedure: http_handler/3 

Итак, я добавил:

:- use_module(library(http/thread_httpd)). 

Диспетчерская

Далее, когда я загружаю измененный пример и запустите сервер с ?- server(4040)., а затем посетите., я получаю:

 
Internal server error 

Undefined procedure: http_dispatch/1 

Итак, я добавил:

:- use_module(library(http/http_dispatch)). 

Параметры

Затем, когда я перезагрузить и вернуться, я получаю:

 
Internal server error 

Undefined procedure: http_parameters/2 

Итак, я

 
:- use_module(library(http/http_parameters)). 

С id

Конечно, мы должны поставлять id, поэтому я посещаю, например:

 
http://localhost:4040/json_test?id=x 

Затем я получаю:

 
Internal server error 

Undefined procedure: nomeEdificio/2 

Для отладки подобных проблем, необходимо до упростить все, насколько сможете, и упростить отправку, автономный e xamples с четкими инструкциями, как запустить ваш тест   кейс.

В выше, у вас есть опущено:

  • основные директивы, которые вы, очевидно, включены в программу
  • важную информацию о том, как запустить ваш   сервер
  • определение основные предикаты, которые используются в вашей программе  .

Вы не можете ожидать, что другие заполнят такие крайние упущения.

Ответ JSON

Что касается вашего актуального вопроса, ваша главная проблема полностью затмила то, что вы вывесили. К ответ   JSON, здесь пример.

Во-первых, получение JSON:

 
:- use_module(library(http/json_convert)). 

:- json_object 
     point(x:integer, y:integer). 

Пример запроса:

 
?- prolog_to_json(point(10,30), JSON). 
JSON = json([x=10, y=30]). 

Это нужна директива выше, в противном случае она не работает! Это принимается непосредственно из документации SWI-Prolog, что является хорошим ресурсом, чтобы узнать больше об этих   темах.

Тогда, чтобы ответить с таким термином:

 
?- prolog_to_json(point(10,30), JSON), 
    reply_json(JSON). 
Content-type: application/json; charset=UTF-8 

{"x":10, "y":30} 
... 

Итак, начните с малым: После того как вы это работает без HTTP   сервера, вы можете подключить   в же   коде в фактическую отправку.

+0

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

+0

Это происходит только из-за несоответствия между ** атомами ** и ** целыми числами **. Он работает точно так, как ожидалось, если вы * либо * преобразуете * атом * 'ID' в ** целое число **, либо переписываете свои факты, чтобы использовать ** атомы **, например' '1'',' '2'' из целых чисел * '1',' 2'. Обратите внимание на различие в использовании * одинарных кавычек * для обозначения * атомов * в этом случае. Элегантный способ решить эту проблему - использовать преобразование типа [http_parameters/2] (http://eu.swi-prolog.org/pldoc/doc_for?object=http_parameters/2) или 'attribute_declarations/1' опции [ 'http_parameters/3'] (http://eu.swi-prolog.org/pldoc/doc_for?object=http_parameters/3). – mat