2012-05-22 34 views
3

我在使用Dispatch和Scala使用JSON對象發送POST請求時遇到問題。在調度和Scala中使用JSON發送POST請求

POST請求工作正常,可以肯定的,因爲我使用curl測試它:

~/workspace $ curl -vd 'tracker={"project":"campaign","event":"home","number":"100"}' http://exampleurl:8145/test 

,我得到一個HTTP 200響應預期

但是當我嘗試做同樣的使用調度庫(http://dispatch.databinder.net/Dispatch.html )像這樣:

scala> Http(url("http://exampleurl:8145/test") << "tracker={'project':'campaign','event':'home','number':'100'}" >|) 

這就是我得到:

dispatch.StatusCode: Unexpected response code: 404 
Paramerter missing: [tracker] not found 
at dispatch.HttpExecutor$$anonfun$when$1.apply(executor.scala:53) 
at dispatch.HttpExecutor$$anonfun$when$1.apply(executor.scala:50) 
at dispatch.HttpExecutor$$anonfun$x$2.apply(executor.scala:41) 
at dispatch.HttpExecutor$$anonfun$x$2.apply(executor.scala:36) 
at dispatch.BlockingHttp$$anonfun$execute$1.apply(Http.scala:54) 
at dispatch.Http.pack(Http.scala:25) 
at dispatch.BlockingHttp$class.execute(Http.scala:53) 
at dispatch.Http.execute(Http.scala:21) 
at dispatch.HttpExecutor$class.x(executor.scala:36) 
at dispatch.Http.x(Http.scala:21) 
at dispatch.HttpExecutor$class.when(executor.scala:50) 
at dispatch.Http.when(Http.scala:21) 
at dispatch.HttpExecutor$class.apply(executor.scala:60) 
at dispatch.Http.apply(Http.scala:21) 
at .<init>(<console>:11) 
at .<clinit>(<console>) 
at .<init>(<console>:11) 
at .<clinit>(<console>) 
at $print(<console>) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704) 
at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:914) 
at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:546) 
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:577) 
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:543) 
at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:694) 
at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:745) 
at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:651) 
at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:542) 
at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:550) 
at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:822) 
at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:851) 
at xsbt.ConsoleInterface.run(ConsoleInterface.scala:57) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:57) 
at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:48) 
at sbt.Console.console0$1(Console.scala:23) 
at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:24) 
at sbt.TrapExit$.executeMain$1(TrapExit.scala:33) 
at sbt.TrapExit$$anon$1.run(TrapExit.scala:42) 

我不知道爲什麼它缺少我試圖通過的跟蹤器參數。

想到任何人?

回答

3

我想你要發佈它作爲一個名稱值對:

Http(url("http://exampleurl:8145/test") << 
    Map("tracker" -> "{'project':'campaign','event':'home','number':'100'}") >|) 
+0

謝謝!這似乎解決了它。 –

4

不確定您派遣的版本,但另一種方式來做到這一點(在0.11.0版,至少)(特別是如果不方便混搭您的數據備份到一個地圖)明確設置內容類型,就像這樣:

Http(url("http://exampleurl:8145/test").setBody(
    "tracker={'project':'campaign','event':'home','number':'100'}").setHeader(
    "Content-Type", "application/json") OK as.String) 

注:我刪除了「> |」運算符(這是從派發0.8.x並忽略響應)與「確定as.String」。隨意忽略那個響應字符串。

這是很好的情況下,你使用lift-json與案例類(或只是與AST一般搗毀)。然後,而不是

Http(url("http://someplace.com") << someAwfulTransformer(
    myCaseClassOrBigASTbasedThing) OK as.String) 

你可以做到這一點

Http(url("http://someplace.com").setBody(
    write(myCaseClassOrBigASTbasedThing)).setHeader(
    "Content-Type", "application/json") OK as.String) 

隨時與你的implicits或輔助函數來裝點這個以減少打字。但重要的是,如果你有一個直接的實體到JSON字符串映射,你不必擔心將它轉換回Map。其實,你不應該是