2016-10-31 2 views
0

Я пытаюсь сделать запрос VoltDB используя свой API:Javascript - Запросы VoltDB апите с выборкой

const url = 'http://server:8080/api/1.0/' 
    const queryParam = encodeURIComponent('select * from table') 
    const queryURL = url + `[email protected]&Parameters=['${queryParam}']&jsonp=console.log` 

    fetch(queryURL).then(response => { 
     response.text().then(text => console.log(text)) 
    }) 

С этим кодом не выдает "No Access-Control-Allow-Origin" ошибки. Если я изменю выборки называют это:

fetch(queryURL, { mode: 'no-cors').then(response => { 
     response.text().then(text => console.log(text)) 
    }) 

Он ничего не делает

ответ

1

Это защитная функция для браузера. Если вы обслуживаете веб-страницу с одного URL-адреса и на странице, у вас есть встроенные URL-запросы на другой хост или порт, браузер не позволит этого.

Один из способов обойти это - добавить прокси на ваш веб-сервер, чтобы он мог звонить на порт 8080 и передавать ответы на веб-страницу с одного и того же источника.

Вы можете увидеть некоторые ответы на переполнение стека об использовании CORS, чтобы обойти эту ошибку, но это требует изменения заголовков, которые использует VoltDB на порту 8080, так что вы не можете делать сами, и у нас нет планов делать что.

Другим решением является использование файла voltdb.js, представленную в некоторых из наших демонстраций, таких как NBBO демонстрационной панели приборов: https://github.com/VoltDB/voltdb/tree/master/examples/nbbo/web

Я думаю, что это использует низкоуровневые яваскрипта открыть сокет, чтобы сделать вызов HTTP без использования XMLHttpRequest, поэтому он избегает ошибки No Access-Control-Allow-Origin.

В примере код, специфичный для примера NBBO, приведен в файле demo.js, voltdb-dashboard.js содержит код, который является общим для различных панелей примеров, а voltdb.js - это базовая библиотека, которая обеспечивает доступ к вызывать процедуры асинхронно.

0

Вы должны кодировать все параметры URI не только процедура параметров

$ curl --data '[email protected]&Parameters=["select count(*) from store;"]' http://127.0.0.1:8080/api/1.0/ 

{ "статус": 1, "appstatus": - 128, "statusstring": нулевой, "appstatusstring": нулевой, "результаты": [{ "статус": - 128, "схемы": [{ "имя": "C1", "тип": 6}], «данные»: [[100000]]}]}

или

$ curl --data 'Procedure=%40AdHoc&Parameters=%5B%22select+count(*)+from+store%3B%22%5D' http://127.0.0.1:8080/api/1.0/; echo 

{ "Статус": 1, "appstatus": - 128, "statusstring": нулевой, "appstatusstring": нулевой, "результаты": [{ "статус": - 128, "схема": [{"name": "C1", "type": 6}], "data": [[100000]]}]}

+0

Если я использую curl, у меня нет никаких проблем, потому что настоящая проблема - это кросс-доменный запрос. Кроме того, мне не нужно кодировать все параметры запроса, потому что я пробовал это из VMC, и он работал нормально. – aamadeo

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