0

Have looked at other related posts but nothing seemed to work.

Basically I'm trying to figure out how to pass data to my restful spring-boot app.

Here is the curl command I'm using:

$ curl -iX POST -H 'Content-Type: application/json' -d @args.json http://localhost:8080/myapp/dummyApi

With args.json contains:

file: args.json:

{
  "arg1": "hello",
  "arg2": 10, 
  "arg3": {
    "a": "1",
    "b": "2" 
  }
}

The api is defined in MyController.java as such:

file: 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");
}

//...
}

The return of the curl command is 200 success (since non of the arguments is required) but the values of args are not reaching over to dummyApi method

$ curl -iX POST -H 'Content-Type: application/json' -d @args.json http://localhost:8080/myapp/dummyApi
HTTP/1.1 200 
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 04 Jun 2017 15:37:42 GMT

{"foo":"foo"}

The server console looks like this:

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

I hope I haven't left out any of the important details, but please let me know if anything is missing.

has981
  • 327
  • 3
  • 18

2 Answers2

2

This worked:

I had two issues in my spring-boot java method,

  1. I'm specifying @RrequestParam for the arguments, where I should be using @RequestBody instead
  2. I have multiple of such method params where in POST it should be a single (see footnote) @RequestBody

But since I need to pass multiple arguments over to the method the solution was to wrap these arguments in a backing object, as such:

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;}
}

The receiver method would then be:

@RequestMapping(value="/dummyApi", method=RequestMethod.POST)
public DummyRet dummyApi(@RequestBody Args args) {
  LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
  LOGGER.info("Arguments received:");
  LOGGER.info("arg1: " + args.getArg1().toString());
  LOGGER.info("arg2: " + args.getArg2().toString());
  LOGGER.info("arg3: " + args.getArg3().toString());
  LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
  return new DummyRet("foo");
}

Footnote: In fact it is possible to pass multiple params through custom implementation as described in this SO response. Haven't tried it

has981
  • 327
  • 3
  • 18
0

Refer below sample,

curl -H "Content-Type: application/json" --data @body.json 
http://localhost:8080/ui/webapp/conf
RoshanKumar Mutha
  • 1,617
  • 1
  • 10
  • 13
  • thanks for the suggestion but I still get the same behaviour as before – has981 Jun 05 '17 at 12:07
  • Can you try with chrome postman extension? If you are able to get response using any post client such as postman then curl should also work as it is a client. PostMan : https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en – RoshanKumar Mutha Jun 05 '17 at 12:52
  • sorry for the delay, just tried chrome postman, still getting same behaviour, to make sure I'm not using anything funny in my spring boot app I cloned [spring-boot-tutorial](https://github.com/spring-guides/gs-spring-boot.git). Only added code related to `dummyApi` – has981 Jun 06 '17 at 12:39
  • unfortunately no :( – has981 Jun 06 '17 at 13:33
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/145981/discussion-between-has981-and-roshankumar-mutha). – has981 Jun 06 '17 at 14:15