2012-05-22 95 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。其实,你不应该是