2

JSON REST WSO2 Data Service の作業を手伝ってくれることを願っています。v 3.0.1 とサンプル データ サービスを使用しています。私のやり方が間違っているのではないかと思います... productsSQL クエリにバインドされたリソース「products」を作成しました。XML REST リクエストは完全に機能しますが、JSON は機能しません:

  1. curl --request GET http://myserver.com:9763/services/samples/RDBMSSample.HTTPEndpoint/products -H コンテンツ タイプ:"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 コンテンツ タイプ:"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 Content-Type: "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 に答える