2

我希望你能帮助我让 JSON REST WSO2 数据服务工作。我使用 v 3.0.1 和示例数据服务。我怀疑我做错了......我创建了一个绑定到 productsSQL 查询的资源“产品”。XML REST 请求可以完美运行,但 JSON 不行:

  1. curl --request GET http://myserver.com:9763/services/samples/RDBMSSample.HTTPEndpoint/products -H Content-Type:"application/json"

返回

> "Fault":{"faultcode":"","faultstring":"No JSON message received
> through HTTP GET or POST","detail":""}}
  1. 从源代码看起来它期望在请求 url 中有一些请求主体(这很奇怪),所以下一个查询是

    curl --request GET http://myserver.com:9763/services/samples/RDBMSSample.HTTPEndpoint/products?q=emptyquery -H Content-Type:"application/json"

这个挂起并在几分钟后在服务器上出现以下异常:

> Feb 24, 2013 8:08:13 PM
> org.apache.tomcat.util.net.NioEndpoint$SocketProcessor run SEVERE:
> java.lang.ThreadDeath     at java.lang.Thread.stop(Thread.java:776)   at
> org.wso2.carbon.tomcat.ext.valves.CarbonStuckThreadDetectionValve.handleStuckThread(CarbonStuckThreadDetectionValve.java:121)
>   at
> org.wso2.carbon.tomcat.ext.valves.CarbonStuckThreadDetectionValve.backgroundProcess(CarbonStuckThreadDetectionValve.java:175)
>   at
> org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1387)
>   at
> org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1566)
>   at
> org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1576)
>   at
> org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1555)
>   at java.lang.Thread.run(Thread.java:680)
  1. 但是,以下查询有效:

    curl --data '{"employeesbynumber":{"employeenumber":{"$":"1002"}}}' http://myserver.com:9763/services/samples/RDBMSSample/ --header 内容类型: "application/json" --header SOAPAction:"urn:employeesByNumber"

4

2 回答 2

1

所以在调试 WSO2 DSS 和 Axis2 代码几个小时后,有一个修复:

原因:WSO2 仍然在 Axis 1.6.1 上运行,它在 JSONOMBuilder 和 JSONDataSource 中有一些严重的错误(似乎已在 1.6.2 中修复)。具体来说,它要求所有 GET 请求都具有输入参数,并且还包含在根元素 + 一些其他问题中。事实上,在内部,AXIS2 将 JSON 有效负载映射到 SOAP 主体,因此需要有根元素。

解决方案更多解决方法:对于 GET 请求,传递请求正文,其参数包含在根元素中(当然还有 url 编码)。即使您没有参数 - 无论如何都要传递它们。因此,以下查询有效:

curl --request GET http://192.168.1.10:9763/services/samples/RDBMSSample.HTTPEndpoint/employees?q=%7B%22request%22%3A%7B%22employeeNumber%22%3A%221%22%7D%7D%20 -H Content-Type:"application/json"

而这个用于不带参数的查询,但无论如何传递一个虚拟的:

curl --request GET http://192.168.1.10:9763/ervices/samples/RDBMSSample.HTTPEndpoint/products?q=%7B%22request%22%3A%7B%22employeeNumber%22%3A%221%22%7D%7D%20 -H Content-Type:"application/json"

希望 WSO2 小伙伴们能尽快更新到最新的 Axis2...

于 2013-03-01T02:38:22.287 回答
0

我认为你从 curl 调用 REST cal 的方式是错误的,如果你想玩 curl,你可以使用参考 [1]。正确的信息是

curl -i -H "Accept: application/json" http://myserver.com:9763/services/samples/RDBMSSample.HTTPEndpoint/products  

否则有一个很好的 Google chrome 插件“高级 REST 客户端”,您可以简单地使用它来调用 REST 服务。

[1]。http://blogs.plexibus.com/2009/01/15/rest-esting-with-curl/

于 2013-02-25T08:31:08.867 回答