SpringBoot构建Restful service完成Get和Post请求
一个基本的RESTfuleservice最进场向外提供的请求Method就是Get和Post。
在Get中,常用的都会在请求上带上参数,或者是路径参数。响应Json。
在Post中,常用的会提交formdata或者jsondata作为参数,响应Json。
1.Get请求,url传参,返回json。
先准备一个请求后,响应的对象。
packagecom.example.demo; publicclassEcho{ privatefinallongid; privatefinalStringcontent; publicEcho(longid,Stringcontent){ this.id=id; this.content=content; } publiclonggetId(){ returnthis.id; } publicStringgetContent(){ returnthis.content; } }
准备一个用来接收请求的EchoController(名字可以根据实际情况写),为它增加@RestController注解,表示这是一个处理RESTful请求的响处理类。
增加@RequestMapping,为本Controller提供一个根url,当然可以不写,写这个是为了更好的将同一种处理的url归在一类,本Controller其他的处理方法对应的url中就不需要重复写。
packagecom.example.demo; importjava.util.concurrent.atomic.AtomicLong; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RequestParam; importorg.springframework.web.bind.annotation.RestController; importorg.springframework.web.bind.annotation.RequestBody; importorg.springframework.web.bind.annotation.RequestMethod; importorg.springframework.web.bind.annotation.PathVariable; importorg.springframework.web.bind.annotation.ModelAttribute; @RestController @RequestMapping("/echo") publicclassEchoController{ privatestaticfinalStringechoTemplate1="received%s!"; privatestaticfinalStringechoTemplate2="%sspeakto%s\'%s\'"; privatefinalAtomicLongcounter=newAtomicLong(); @RequestMapping(value="/getter/pattern1",method=RequestMethod.GET) publicEchogetterPattern1(Stringcontent){ returnnewEcho(counter.incrementAndGet(),String.format(echoTemplate1,content)); } @RequestMapping(value="/getter/pattern2",method=RequestMethod.GET) publicEchogetterPattern2(@RequestParam(value="content",required=false)Stringalias){ returnnewEcho(counter.incrementAndGet(),String.format(echoTemplate1,alias)); } }
getterPattern1的上面增加了@RequestMapping注解,将指定的url和处理的方法进行映射,对应这个url的请求就由该方法来处理,method可以省略,省略后就是对应所有的HttpMetho,gtterPatten1方法的参数默认就和url中的content参数进行映射。
再看getterPattern2,跟上面的方法效果一致,他们的区别就在于参数定义用了@RequestParam注解将url参数和方法参数进行了映射说明,@RequesteParam中value的值就是url中实际的参数,required说明该参数是否必须,如果是true,而实际上url中并没有带上该参数,那么会报异常,为防止异常可以增加defaultValue指定参数的默认值即可。我们会发现这里的方法参数是alias,这里当然是可以和url的参数名不同,只要RequestParam注解映射了他们的关系就没问题。
运行后,可以在浏览器中访问对应的url来看看结果,我这里是用curl来访问。
curlhttp://localhost:8080/echo/getter/pattern1?content=hello
curlhttp://localhost:8080/echo/getter/pattern2?content=hello
上面两个url的访问得到的结果除了id会自增外,其他是一致的:
{"id":6,"content":"receivedhello!"}
2.Get请求,传递url路径参数,返回json。
在EchoController中增加一个响应方法。
@RequestMapping(value="/getter/pattern3/{content}",method=RequestMethod.GET) publicEchogetterPattern3(@PathVariableStringcontent){ returnnewEcho(counter.incrementAndGet(),String.format(echoTemplate1,content)); }
可以看到,在@RequestMapping的url定义中的末尾有“{content}”,表明这里是一个路径参数,在getterPattern3的参数content增加了@PathVariable注解,将方法参数与路径参数进行了映射。
运行后,访问url。
curlhttp://localhost:8080/echo/getter/pattern3/123456
结果:
{"id":8,"content":"received123456!"}
3.Post请求,参数以Httpbody的途径提交Json数据。
先定义一个提交的Json对应的对象,这里把它定义为Message。
packagecom.example.demo; publicclassMessage{ privateStringfrom; privateStringto; privateStringcontent; publicMessage(){} publicStringgetFrom(){ returnthis.from; } publicStringgetTo(){ returnthis.to; } publicStringgetContent(){ returnthis.content; } publicvoidsetFrom(Stringvalue){ this.from=value; } publicvoidsetTo(Stringvalue){ this.to=value; } publicvoidsetContent(Stringvalue){ this.content=value; } }
在EchoController增加响应的方法,并完成映射。
@RequestMapping(value="/setter/message1",method=RequestMethod.POST) publicEchosetterMessage1(@RequestBodyMessagemessage){ returnnewEcho(counter.incrementAndGet(),String.format(echoTemplate2,message.getFrom(),message.getTo(),message.getContent())); }
在setterMessage1方法的参数中用@RequestBody将请求的HttpBody和参数messge进行了映射。
运行后,使用curl向服务端提交json数据。提交的请求头部要带上"Content-Type:application/json",表明请求体Json。
curl-i-H"Content-Type:application/json"-d"{\"from\":\"Tom\",\"to\":\"Sandy\",\"content\":\"hellobuddy\"}"http://localhost:8080/echo/setter/message1
结果:
{"id":9,"content":"TomspeaktoSandy'hellobuddy'"}
4.Post请求,参数以Httpbody的途径提交表单数据。
在EchoController增加响应的方法,并完成映射。
@RequestMapping(value="/setter/message2",method=RequestMethod.POST) publicEchosetterMessage2(@ModelAttributeMessagemessage){ returnnewEcho(counter.incrementAndGet(),String.format(echoTemplate2,message.getFrom(),message.getTo(),message.getContent())); }
在setterMessage2方法的参数中用@ModelAttribute将请求的HttpBody中的表单数据和参数messge进行了映射。
运行后,使用curl向服务端提交表单数据。提交的请求头部要带上"Content-Type:application/x-www-form-urlencoded",表明请求体是表单数据,格式是"key1=value1&key2=value2&key3=value3"。
curl-i-H"Content-Type:application/x-www-form-urlencoded"-d"from=sandy&to=aissen&content=goto"http://localhost:8080/echo/setter/message2
结果:
{"id":11,"content":"sandyspeaktoaissen'goto'"}
总结
以上所述是小编给大家介绍的SpringBoot构建Restfulservice完成Get和Post请求,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!