WSO2 EI Dataservice как Rest API с последовательными вызовами
Я новичок в wso2 и в настоящее время пытаюсь представить сервис данных mongodb как REST API. Я следовал этому руководству и выставил свой сервис данных как ресурс Rest следующим образом:
<data>
<config>...</config>
<query id="count" useConfig="MongoDB">
<expression>myCollection.count()</expression>
<result outputType="json">{
"Documents": {
"Document": [
{
"Data": "$document"
}
]
}
}</result>
</query>
<operation name="count_op">
<call-query href="count"/>
</operation>
<resource method="GET" path="users/count">
<call-query href="count"/>
</resource>
</data>
Работает нормально, однако, когда я попытался получить доступ к ресурсу из своего проекта angular2, я наткнулся на проблему с CORS. Я прочитал несколько постов об этом и решил, что мне нужно изменить мой Rest API следующим образом:
<resource methods="OPTIONS" url-mapping="/*">
<inSequence>
<property action="set" name="HTTP_SC" scope="axis2"
type="STRING" value="200"/>
<property action="set" name="messageType" scope="axis2"
type="STRING" value="application/json"/>
<sequence key="rest_add_access_control_headers"/>
<respond/>
</inSequence>
<outSequence/>
<faultSequence>
<sequence key="rest_add_access_control_headers"/>
<respond/>
</faultSequence>
</resource>
Я пытался интегрировать этот код с моим определением службы данных (приведенным выше), но я не могу заставить его работать, и это заставляет меня задаться вопросом, является ли служба данных, предоставляемая в качестве ресурса REST, тем же, что и API отдыха? Кажется, я не могу вызвать какие-либо элементы или другие посредники в определении службы данных. Нужно ли создавать для этого актуальный Rest API? Если да, то как я могу использовать мой сервис данных mongo в качестве ресурса для моего API отдыха?
РЕДАКТИРОВАТЬ: ошибка CORS, которую я получаю из своего проекта angular2 при попытке получить доступ к сервису: "На запрашиваемом ресурсе отсутствует заголовок" Access-Control-Allow-Origin "". это другая тема. Но это привело меня к редактированию службы данных, поэтому я отредактировал элемент ресурса службы данных и добавил новый:
<resource method="GET" path="users/count">
<inSequence>
<property action="set" name="HTTP_SC" scope="axis2" type="STRING" value="200"/>
<property action="set" name="messageType" scope="axis2" type="STRING" value="application/json"/>
<sequence key="rest_add_access_control_headers"/>
<respond/>
</inSequence>
<outSequence/>
<faultSequence>
<sequence key="rest_add_access_control_headers"/>
<respond/>
</faultSequence>
<call-query href="count"/>
</resource>
<resource method="OPTIONS" path="users/count">
<inSequence>
<property action="set" name="HTTP_SC" scope="axis2"
type="STRING" value="200"/>
<property action="set" name="messageType" scope="axis2"
type="STRING" value="application/json"/>
<sequence key="rest_add_access_control_headers"/>
<respond/>
</inSequence>
<outSequence/>
<faultSequence>
<sequence key="rest_add_access_control_headers"/>
<respond/>
</faultSequence>
</resource>
последовательность rest_add_access_control_headers выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<sequence name="rest_add_access_control_headers" xmlns="http://ws.apache.org/ns/synapse">
<property name="Access-Control-Allow-Origin" scope="transport"
type="STRING" value="*"/>
<property name="Access-Control-Allow-Methods" scope="transport"
type="STRING" value="GET,POST,PUT,DELETE,OPTIONS"/>
<property name="Access-Control-Allow-Headers" scope="transport"
type="STRING" value="origin, content-type, accept, Authorization"/>
</sequence>
Первый кажется нормальным, но второй делает мой сервис данных неисправным, выдавая эту ошибку в консоли managemenet:
DS Code: UNKNOWN_ERROR Source Data Service:- Name: mongodb_dataservice Location: \MongoDB.dbs Description: N/A Default Namespace: http://ws.wso2.org/dataservice Nested Exception:- java.lang.NullPointerException at org.wso2.carbon.dataservices.core.DataServiceFactory.createDataService(DataServiceFactory.java:207) at org.wso2.carbon.dataservices.core.DBDeployer.createDBService(DBDeployer.java:797) at org.wso2.carbon.dataservices.core.DBDeployer.processService(DBDeployer.java:1152) at org.wso2.carbon.dataservices.core.DBDeployer.deploy(DBDeployer.java:201) at org.apache.axis2.deployment.repository.util.DeploymentFileData.deploy(DeploymentFileData.java:136) at org.apache.axis2.deployment.DeploymentEngine.doDeploy(DeploymentEngine.java:807) at org.apache.axis2.deployment.repository.util.WSInfoList.update(WSInfoList.java:144) at org.apache.axis2.deployment.RepositoryListener.update(RepositoryListener.java:377) at org.apache.axis2.deployment.RepositoryListener.checkServices(RepositoryListener.java:254) at org.apache.axis2.deployment.RepositoryListener.startListener(RepositoryListener.java:371) at org.apache.axis2.deployment.scheduler.SchedulerTask.checkRepository(SchedulerTask.java:59) at org.apache.axis2.deployment.scheduler.SchedulerTask.run(SchedulerTask.java:67) at org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask.runAxisDeployment(CarbonDeploymentSchedulerTask.java:93) at org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask.run(CarbonDeploymentSchedulerTask.java:138) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.NullPointerException at org.wso2.carbon.dataservices.core.engine.DataService.init(DataService.java:352) at org.wso2.carbon.dataservices.core.DataServiceFactory.createDataService(DataServiceFactory.java:190) ... 20 more
Опять же, я не уверен, должен ли я вообще помещать такой код в определение сервиса данных, так как этот код предназначен для определения Rest API, где вы используете последовательности, посредники и т. Д.
Как я могу использовать свой dataservice с ESB API? Не могли бы вы привести пример, как это сделать? Я провел небольшое исследование, но ничего не смог найти.
1 ответ
Могу ли я узнать, почему вы не можете вызвать службу данных? Вы получаете какую-либо ошибку во время вызова? если бы вы могли предоставить журналы, это будет полезно. Кроме того, DSS используется для извлечения данных из БД. Рекомендуется предоставлять API-интерфейс ESB, который будет использовать эту услугу, а не предоставлять сервис DSS для внешнего мира напрямую.