>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 12859 个阅读者 刷新本主题
 * 贴子主题:  【Spring专题】RestTemplate类与RESTFul风格的请求 回复文章 点赞(0)  收藏  
作者:sunweiqin    发表时间:2021-10-09 11:31:45     消息  查看  搜索  好友  邮件  复制  引用

本文参考《精通Spring:JavaWeb开发技术详解》,作者:孙卫琴,清华大学出版社出版

在实际软件开发过程中,前端与后端的开发团队分别开发各自的软件模块。对于采用RESTFul风格的Web应用,如果要等到前端与后端均开发完成自己的模块后,才能整体调试和运行程序,这会大大影响软件开发的效率。

Spring API提供了一个org.springframework.web.client.RestTemplate类,它支持在服务器端单独测试负责处理RESTFul风格的HTTP请求的控制器类。

RestTemplate类提供了一些方法,模拟客户端发出RESTFul风格的HTTP请求:
(1)新增操作:postForEntity(String url,Object request, Class<T> responseType, Object... uriVariables)
(2)更新操作:put(String url, Object request,Object... uriVariables)
(3)删除操作:delete(String url, Object...uriVariables)
(4)查询操作:getForObject(String url,Class<T> responseType, Object... uriVariables)

以上postForEntity()、put()、delete()和getForObject()方法分别采用POST、PUT、DELETE和GET请求方式,请求服务器端执行新增、更新、删除和查询操作。以上方法的url参数指定请求访问的URL,request参数表示请求正文数据,responseType参数指定返回数据的类型,uriVariables参数设定URL变量。

以下例程1的TestController类通过RestTemplate类来访问CustomerController类的各种请求处理方法。

例程1 TestController.java
@Controller
public class TestController {
  @Autowired
  private RestTemplate restTemplate;
  private String SERVICE_URL =  "http://localhost:8080/helloapp/customer";
  
@RequestMapping("/insert")
  publicString insert() {
    Customercustomer=new Customer();
    customer.setId(null);
    customer.setName("Linda");
    customer.setAge(18);

    // 发送POST请求
    StringResult result=restTemplate.postForObject(
                 SERVICE_URL ,customer,StringResult.class);

    System.out.println(result);
    return"result";
  }  

  @RequestMapping("/update")
  publicString update() {
    Customercustomer=new Customer();
    customer.setId(Long.valueOf(1L));
    customer.setName("Linda");
    customer.setAge(18);

    // 发送PUT请求
    restTemplate.put(SERVICE_URL+"/1" , customer);
    System.out.println("更新完毕");
    return"result";
  }

  @RequestMapping("/delete")
  publicString delete() {
    // 发送DELETE请求
    restTemplate.delete(SERVICE_URL+"/1");
    System.out.println("删除完毕");
    return"result";
  }

  @RequestMapping("/findone")
  publicString findById() {
    // 发送GET请求
    Customercustomer=restTemplate.getForObject(SERVICE_URL+"/1",
                                           Customer.class);
    if(customer!=null)
     System.out.println(customer.getId()+","
                      +customer.getName()+","+customer.getAge());
    return"result";
  }

  @RequestMapping("/findall")
  publicString findAll() {
    // 发送GET请求
    Customer[] customers=restTemplate
                  .getForObject(SERVICE_URL,Customer[].class);
   System.out.println("查询到"+customers.length+"个Customer对象");

   for(Customer c : customers)
     System.out.println(c.getId()+","+c.getName()+","+c.getAge());

    return"result";
  }
}

TestController类的restTemplate实例变量由Spring框架提供,在Spring的配置文件applicationContext.xml中配置了restTemplate Bean组件:

<bean id="restTemplate"
       class= "org.springframework.web.client.RestTemplate" />

通过浏览器访问以下URL:

http://localhost:8080/helloapp/insert
http://localhost:8080/helloapp/update
http://localhost:8080/helloapp/findone
http://localhost:8080/helloapp/findall
http://localhost:8080/helloapp/delete

以上URL会访问TestController类的相关方法,而这些方法又会通过RestTemplate类发出RESTFul风格的HTTP请求,请求访问CustomerController类的相关方法。


程序猿的技术大观园:www.javathinker.net
网站系统异常


系统异常信息
Request URL: http://www.javathinker.net/WEB-INF/lybbs/jsp/topic.jsp?postID=3966&pages=4

java.lang.NullPointerException

如果你不知道错误发生的原因,请把上面完整的信息提交给本站管理人员