CORS в Prolog не работает

#jquery #ajax #prolog #cors #swi-prolog

#jquery #ajax #пролог #cors #swi-prolog

Вопрос:

У меня проблема с cors в prolog. Я думаю, что это не работает.

Редактировать # 1

 :- module(server,[]).

:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_cors)).
:- use_module(library(http/http_json)).
:- use_module(library(http/json_convert)).
:- use_module(library(option)).
:- use_module(library(settings)).
:- http_handler(root(.),handle,[]).

:- set_setting(http:cors, [*]).
server(Port) :-
   http_server(http_dispatch,[port(Port)]).

:- json_object
        poke(pokemon:text, move:text).
handle(Request) :-
   format(user_output,"Request is: ~p~n",[Request]),
   format(user_output,"Request2 is: ~p~n",[]),
   cors_enable,
   http_read_json_dict(Request, DictIn,[json_object(term)]),
   format(user_output,"I'm here~n",[]),
   term_string(Pokemon,DictIn.pokemon),
   findall(poke(P,M),beat(P,M,Pokemon),L),
   prolog_to_json(L,J),
   format(user_output,"Pokemons are: ~p~n",[J]),
   DictOut=J,
   reply_json(DictOut).

beat(P,M,E) :-
   pokerule:beat(P,M,E).
 

Однако я использую ajax post для сервера prolog, в котором говорилось

 XMLHttpRequest cannot load http://localhost:9999/. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:1000' is therefore not allowed access. The response had HTTP status code 500.
 

Ajax, который я использую для публикации.

    let enemyName = this.item.text
   let data = {"pokemon":enemyName}
   $.ajax({
     url        : END_POINT,
     method     : 'post',
     contentType: 'application/json',
     dataType   : 'json',
     data       : JSON.stringify(data),
     success    : function (res) {
       console.log(res);
     },
     error :function (res) {
       console.log(res);
     } 
   })
 

Как я могу решить эту проблему?

-Отредактировано Теперь я исправляю часть своего кода, но он все еще не работает.

Ответ №1:

Цитирование из документации library(http/http_cors) :

Поскольку CORS является risc безопасности (см. Ссылки), по умолчанию он отключен. Он включен с помощью настройки http:cors . Значение этого параметра представляет собой список доменов, которым разрешен доступ к сервису. Поскольку * используется в качестве подстановочного знака, значение [*] разрешает доступ из любого места.

(Курсив мой.)

Таким образом, на вашем сервере вы, вероятно, должны включить параметр:

:- set_setting(http:cors , [*]).

По умолчанию ничего не записывается cors_enable/0 .

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

РЕДАКТИРОВАТЬ: в вашем отредактированном коде есть элементарные проблемы, которые не имеют ничего общего с CORS. Пожалуйста, сократите это до минимального примера. Вы можете увидеть, что не так,:

  1. Запуск сервера с ?- server(4050). помощью (например)
  2. Посещение в вашем веб-браузере http://localhost:4050 .

Вы увидите сообщения об ошибках, указывающие на проблемы.

Вот небольшой скелет handle/2 , который вы можете расширять по мере необходимости:

обработайте (запрос):- 
cors_enable,
reply_json(тест {x: 1, y: 2}).

Комментарии:

1. Я добавляю эту строку в свой код. Однако он все еще не работает.

2. Я обновил свой ответ. Обратите внимание, что несколько несвязанных проблем затмевают ваш актуальный вопрос. В следующий раз, пожалуйста, сделайте пример как можно короче.

3. Обратите внимание, что в документах prolog отсутствует тот параметр, который вы упоминаете в своем ответе. В следующий раз, пожалуйста, не делитесь своими знаниями на ровном месте, а внесите свой вклад в официальные документы.

Ответ №2:

Я мог бы каким-то образом определить проблему, которая связана с заголовком запроса, отправленным из браузера. Он отправляется application/x-www-form-urlencoded; charset=UTF-8 на сервер prolog, что приводит к сбою сервера is_json_type(String) при http_json.pl входе. Быстрое решение заключается в том, чтобы вставить следующие строки в предикат:

is_json_type(String) :-

 String = 'application/x-www-form-urlencoded; charset=UTF-8', !.
 

Вам также лучше удалить следующую строку javascript:

 contentType: 'application/json'
 

потому что он также не распознается сервером. Я рекомендую использовать только теги, тип, тип данных, URL и данные в javascript для передачи этих параметров серверу.

Мне было трудно предсказать, что содержит запрос браузера, потому что это зависит от браузеров. Таким образом, я считаю, что было бы непросто поддерживать программу prolog в актуальном состоянии, учитывая все возможные элементы информации, отправляемые из браузеров. Вам лучше проверить, какие элементы включены в запрос, когда серверу не удается выполнить задачу.