1

ここにあるrest-client-builderプラグインを使用しようとしています

http://grails.org/plugin/rest-client-builder

私のneo4jグラフでサイファークエリを実行するには

だから私はまさに私が望むことをするグルーヴィーなスクリプトを構築しました

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.0-RC2' )
@Grab(group='net.sf.json-lib', module='json-lib', version='2.4', classifier='jdk15' )

import groovyx.net.http.*
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*

def query(statement, params,success, error) {
def http = new HTTPBuilder( 'http://localhost:7474' )
 http.request( POST, JSON ) {
  uri.path = '/db/data/cypher/'
  headers.'X-Stream' = 'true'
  requestContentType = JSON
  body =  [ query : statement , params : params ?: [:] ]


  response.success = { resp, json ->
    if (success) success(json)
    else {
      println "Status ${resp.statusLine} Columns ${json.columns}\nData: ${json.data}"
    }
  }

  response.failure = { resp, message ->
   def result=[status:resp.statusLine.statusCode,statusText:resp.statusLine.reasonPhrase]
   result.headers = resp.headers.collect { h -> [ (h.name) : h.value ] }
   result.message = message
   if (error) {
     error(result)
   } else {
    println "Status: ${result.status} : ${result.statusText} "
    println 'Headers: ${result.headers}'
    println 'Message: ${result.message}'
    } 
  }
 }
}

query("START v=node({id}) RETURN v",[id:170],{ println "Success: ${it.data}" },{ println "Error: ${it}" })

これは、必要なjsonを返します。そのため、コントローラ メソッドでこれをレプリケートする grails で問題が発生したため、http レスト ポスト リクエストを実行するプラグインを選択しました。

だから私はと呼ばれるサービスメソッドを持っていますCypherService:

package awhinterface
import grails.converters.JSON
import grails.plugins.rest.client.RestBuilder

class CypherService {

 def query() {
     def rest = new RestBuilder()
     def resp = rest.post("http://localhost:7474"){
         contentType "application/json"
         body = [query: "START v=node(170) RETURN v"]

     }
     return resp as JSON;
  }
}

私はそれのための非常に簡単なテストを書きました:

import grails.test.mixin.*
import org.junit.*
@TestFor(CypherService)
class CypherServiceTests {
   void testquery() {
     def cypherService = new CypherService()
     def myjson = cypherService.query()
     println(myjson)
   }
}

ただし、次のエラーが残っています。

Could not write request: no suitable HttpMessageConverter found for request type   [org.springframework.util.LinkedMultiValueMap] and content type [application/json]
org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type [org.springframework.util.LinkedMultiValueMap] and content type [application/json]
at grails.plugins.rest.client.RestBuilder.doRequestInternal(RestBuilder.groovy:93)
at grails.plugins.rest.client.RestBuilder.post(RestBuilder.groovy:72)
at awhinterface.CypherService.query(CypherService.groovy:10)
at awhinterface.CypherServiceTests.testquery(CypherServiceTests.groovy:17)

私はまだhttpリクエストに非常に慣れていません。扇動した人いますか?ありがとう!

編集

現在、いくつかの提案を受けて、これを得ました

def query() {
    def rest = new RestBuilder()
    def resp = rest.post("http://localhost:7474") {
        contentType "application/json"
        uri = "/db/data/cypher/"
        body '{query: "START v=node(170) RETURN v"}'
    }
    return resp

このエラーで:

org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type [org.springframework.util.LinkedMultiValueMap] and content type [application/json]
at grails.plugins.rest.client.RestBuilder.doRequestInternal(RestBuilder.groovy:93)
at grails.plugins.rest.client.RestBuilder.post(RestBuilder.groovy:72)
4

3 に答える 3

3

@dmahapatro の回答はかなり近いものでしたが、contentType設定を省略する必要があります。サービス メソッドは次のようになります。

def query( )
{
    def rest = new RestBuilder( )
    def resp = rest.post( "http://localhost:7474/db/data/cypher" ) {
        headers.'X-Stream' = 'true'
        query = "START v=node(170) RETURN id(v)"
    }
    return resp.json;
}

data戻り値は、およびcolumnsキーを含むマップです。

補足no suitable HttpMessageConverter found for request type XXX: BuildConfig.groovy に jar 依存関係を追加してみてください:

compile 'com.fasterxml.jackson.core:jackson-databind:2.2.2'

アップデート

パラメータ化された暗号を使用する場合は、もう少し注意が必要です。中心的な問題は、RestBuilder が引数なしで内部的に JsonBuilder をインスタンス化することですが、json はツリー構造ではなくマップになっているため、その場合は引数が必要です。サービスに次のスニペットを使用します。

import grails.plugins.rest.client.RestBuilder
import groovy.json.JsonBuilder

class CypherService {

def query() {
    def rest = new RestBuilder()
    def resp = rest.post( "http://localhost:7474/db/data/cypher" ) {
        headers.'X-Stream' = 'true'
        body(new JsonBuilder( query: "START v=node({nodeId}) RETURN id(v)",params: [ nodeId: 1]).toString())
    }
    return resp.json;
}

}

于 2013-08-05T21:14:01.677 に答える
-1

ドキュメント に記載されているようにjson、メソッドの代わりにメソッドを使用しbodyてメッセージ ペイロードを作成します。

def resp = rest.post("http://localhost:7474") {
    contentType "application/json"
    json query: "START v=node(170) RETURN v"
}

編集:

メソッドを使用できますが、渡す前にbodyマップ データを次のように変換する必要があります。JSON

body([query: "..."] as JSON)

ただし、直接使用jsonする方がもう少し明確です。

于 2013-08-02T21:45:03.403 に答える