Java 将json数据传递给spring boot应用程序的Curl POST命令不起作用

Java 将json数据传递给spring boot应用程序的Curl POST命令不起作用,java,json,curl,post,spring-boot,Java,Json,Curl,Post,Spring Boot,我看过其他相关的帖子,但似乎没有任何效果 基本上,我正在尝试找出如何将数据传递到我的restful spring启动应用程序 下面是我正在使用的curl命令: $ curl -iX POST -H 'Content-Type: application/json' -d @args.json http://localhost:8080/myapp/dummyApi json包含以下内容: 文件:args.json: { "arg1": "hello", "arg2": 10, "a

我看过其他相关的帖子,但似乎没有任何效果

基本上,我正在尝试找出如何将数据传递到我的restful spring启动应用程序

下面是我正在使用的curl命令:

$ curl -iX POST -H 'Content-Type: application/json' -d @args.json http://localhost:8080/myapp/dummyApi
json包含以下内容:

文件:args.json:

{
  "arg1": "hello",
  "arg2": 10, 
  "arg3": {
    "a": "1",
    "b": "2" 
  }
}
api在MyController.java中定义如下:

文件:MyController.java

@RestController
@RequestMapping("/myapp")
public class MyController {

//...

static class DummyRet {
    private String foo;
    public DummyRet(String f) {
        foo = f;
    }
    public String getFoo() {
        return foo;
    }
    public void setFoo(String foo) {
        this.foo = foo;
    }
}

@RequestMapping(value="/dummyApi", method=RequestMethod.POST)
public DummyRet dummyApi(@RequestParam(value = "arg1", required = false, defaultValue = "") String arg1,
                               @RequestParam(value = "arg2", required = false, defaultValue = "") Long arg2,
                               @RequestParam(value = "arg3", required = false) Map<String, String> arg3) {
    LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    LOGGER.info("Arguments received:");
    LOGGER.info("arg1: " + arg1);
    LOGGER.info("arg2: " + arg2);
    LOGGER.info("arg3: " + arg3);
    LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    return new DummyRet("foo");
}

//...
}
服务器控制台如下所示:

2017-06-04 18:17:56.818 DEBUG 32258 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing POST request for [/myapp/dummyApi]
2017-06-04 18:17:56.818 DEBUG 32258 --- [nio-8080-exec-7] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /myapp/dummyApi
2017-06-04 18:17:56.818 DEBUG 32258 --- [nio-8080-exec-7] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public com.xx.controllers.MyController$DummyRet com.xx.controllers.MyController.dummyApi(java.lang.String,java.lang.Long,java.util.Map<java.lang.String, java.lang.String>)]
2017-06-04 18:17:56.819  INFO 32258 --- [nio-8080-exec-7] c.p.controllers.MyController       : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2017-06-04 18:17:56.819  INFO 32258 --- [nio-8080-exec-7] c.p.controllers.MyController       : Arguments received:
2017-06-04 18:17:56.819  INFO 32258 --- [nio-8080-exec-7] c.p.controllers.MyController       : arg1: 
2017-06-04 18:17:56.819  INFO 32258 --- [nio-8080-exec-7] c.p.controllers.MyController       : arg2: null
2017-06-04 18:17:56.819  INFO 32258 --- [nio-8080-exec-7] c.p.controllers.MyController       : arg3: null
2017-06-04 18:17:56.819  INFO 32258 --- [nio-8080-exec-7] c.p.controllers.MyController       : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2017-06-04 18:17:56.819 DEBUG 32258 --- [nio-8080-exec-7] m.m.a.RequestResponseBodyMethodProcessor : Written [com.xx.controllers.MyController$DummyRet@c35d46f] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@301ec38b]
2017-06-04 18:17:56.819 DEBUG 32258 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2017-06-04 18:17:56.819 DEBUG 32258 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet        : Successfully completed request
2017-06-04 18:17:56.818调试32258---[nio-8080-exec-7]o.s.web.servlet.DispatcherServlet:DispatcherServlet,名称为“DispatcherServlet”处理[/myapp/dummyApi]的POST请求
2017-06-04 18:17:56.818调试32258---[nio-8080-exec-7]s.w.s.m.m.a.RequestMappingHandlerMapping:查找路径/myapp/dummyApi的处理程序方法
2017-06-04 18:17:56.818调试32258---[nio-8080-exec-7]s.w.s.m.m.a.RequestMappingHandlerMapping:返回处理程序方法[public com.xx.controllers.MyController$DummyRet com.xx.controllers.MyController.dummyApi(java.lang.String,java.lang.Long,java.util.Map)]
2017-06-04 18:17:56.819信息32258---[nio-8080-exec-7]c.p.Controller.MyController:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2017-06-04 18:17:56.819信息32258---[nio-8080-exec-7]c.p.controllers.MyController:收到的参数:
2017-06-04 18:17:56.819信息32258---[nio-8080-exec-7]c.p.Controller.MyController:arg1:
2017-06-04 18:17:56.819信息32258---[nio-8080-exec-7]c.p.controllers.MyController:arg2:null
2017-06-04 18:17:56.819信息32258---[nio-8080-exec-7]c.p.controllers.MyController:arg3:null
2017-06-04 18:17:56.819信息32258---[nio-8080-exec-7]c.p.Controller.MyController:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2017-06-04 18:17:56.819调试32258---[nio-8080-exec-7]m.m.a.RequestResponseBodyMethodProcessor:编写[com.xx.controllers.MyController]$DummyRet@c35d46f]使用[org.springframework.http.converter.json]作为“application/json”。MappingJackson2HttpMessageConverter@301ec38b]
2017-06-04 18:17:56.819调试32258---[nio-8080-exec-7]o.s.web.servlet.DispatcherServlet:Null ModelAndView返回给名为“DispatcherServlet”的DispatcherServlet:假设HandlerAdapter完成了请求处理
2017-06-04 18:17:56.819调试32258---[nio-8080-exec-7]o.s.web.servlet.DispatcherServlet:已成功完成请求
我希望我没有遗漏任何重要的细节,但如果遗漏了什么,请告诉我。

参考下面的示例

curl -H "Content-Type: application/json" --data @body.json 
http://localhost:8080/ui/webapp/conf
参考下面的示例

curl -H "Content-Type: application/json" --data @body.json 
http://localhost:8080/ui/webapp/conf
这起到了作用:

我的spring boot java方法有两个问题

  • 我正在为参数指定
    @RrequestParam
    ,在这里我应该使用
    @RequestBody
  • 我有多个这样的方法参数,在POST中它应该是一个(见脚注)
    @RequestBody
  • 但由于我需要将多个参数传递给该方法,因此解决方案是将这些参数包装到支持对象中,如下所示:

    public static class Args {
        // members
        private String arg1;
        private Long arg2;
        private Map<String, String> arg3;
        // accessors
        public String getArg1() {return arg1;}
        public void setArg1(String arg1) {this.arg1 = arg1;}
        public Long getArg2() {return arg2;}
        public void setArg2(Long arg2) {this.arg2 = arg2;}
        public Map<String, String> getArg3() {return arg3;}
        public void setArg3(Map<String, String> arg3) {this.arg3 = arg3;}
    }
    
    脚注:事实上,如SO响应中所述,可以通过自定义实现传递多个参数。没有尝试过它

    这很有效:

    我的spring boot java方法有两个问题

  • 我正在为参数指定
    @RrequestParam
    ,在这里我应该使用
    @RequestBody
  • 我有多个这样的方法参数,在POST中它应该是一个(见脚注)
    @RequestBody
  • 但由于我需要将多个参数传递给该方法,因此解决方案是将这些参数包装到支持对象中,如下所示:

    public static class Args {
        // members
        private String arg1;
        private Long arg2;
        private Map<String, String> arg3;
        // accessors
        public String getArg1() {return arg1;}
        public void setArg1(String arg1) {this.arg1 = arg1;}
        public Long getArg2() {return arg2;}
        public void setArg2(Long arg2) {this.arg2 = arg2;}
        public Map<String, String> getArg3() {return arg3;}
        public void setArg3(Map<String, String> arg3) {this.arg3 = arg3;}
    }
    

    脚注:事实上,如SO响应中所述,可以通过自定义实现传递多个参数。还没有尝试过它

    谢谢你的建议,但我仍然得到了与以前相同的行为你能尝试使用chrome postman扩展吗?如果您能够使用任何post客户机(如postman)获得响应,那么curl也应该像客户机一样工作。邮递员:很抱歉耽搁了,我刚刚试过chrome PostMan,但仍然有相同的行为,以确保我克隆的spring boot应用程序中没有使用任何有趣的东西。仅添加了与
    dummyApi
    相关的代码,遗憾的是没有:(让我们一起来吧。谢谢你的建议,但我还是得到了与以前相同的行为。你可以尝试使用chrome postman扩展吗?如果你能够使用任何post客户端(如postman)获得响应,那么curl也应该像它是客户端一样工作。postman:很抱歉延迟,刚刚尝试了chrome postman,仍然得到相同的行为,以确保我不是我们我在我的spring boot应用程序中克隆了任何有趣的东西。只添加了与
    dummyApi
    相关的代码。不幸的是,没有:(让我们看看)。