首先,回顾并详细说明一下在快速入门中使用的@Controller@RestController@RequestMapping注解。如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建议先看一下快速入门的内容。

  • @Controller:修饰class,用来创建处理http请求的对象
  • @RestController:Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。
  • @RequestMapping:配置url映射

下面我们尝试使用Spring MVC来实现一组对User对象操作的RESTful API,配合注释详细说明在Spring MVC中如何映射HTTP请求、如何传参、如何编写单元测试。

RESTful API具体设计如下:

 

POM.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <groupId>com.wls</groupId>
  7. <artifactId>project</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10.  
  11. <name>project</name>
  12. <description>project</description>
  13.  
  14. <parent>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-parent</artifactId>
  17. <version>1.5.6.RELEASE</version>
  18. <relativePath/> <!-- lookup parent from repository -->
  19. </parent>
  20.  
  21. <properties>
  22. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  23. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  24. <java.version>1.8</java.version>
  25. </properties>
  26.  
  27. <dependencies>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-web</artifactId>
  35. </dependency>
  36.  
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-test</artifactId>
  40. <scope>test</scope>
  41. </dependency>
  42.  
  43. <!-- mybatis依赖 -->
  44. <dependency>
  45. <groupId>org.mybatis.spring.boot</groupId>
  46. <artifactId>mybatis-spring-boot-starter</artifactId>
  47. <version>1.1.1</version>
  48. </dependency>
  49. <!-- MySql驱动 -->
  50.  
  51. <dependency>
  52. <groupId>org.springframework.boot</groupId>
  53. <artifactId>spring-boot-starter-jdbc</artifactId>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.apache.tomcat</groupId>
  57. <artifactId>tomcat-jdbc</artifactId>
  58. </dependency>
  59. <dependency>
  60. <groupId>mysql</groupId>
  61. <artifactId>mysql-connector-java</artifactId>
  62. <!--<version>5.1.21</version>-->
  63. </dependency>
  64. <!--Json库的依赖 -->
  65. <dependency>
  66. <groupId>com.alibaba</groupId>
  67. <artifactId>fastjson</artifactId>
  68. <version>1.1.43</version>
  69. </dependency>
  70. <!-- jpa -->
  71. <dependency>
  72. <groupId>org.springframework.boot</groupId>
  73. <artifactId>spring-boot-starter-data-jpa</artifactId>
  74. </dependency>
  75. <dependency>
  76. <groupId>com.alibaba</groupId>
  77. <artifactId>druid</artifactId>
  78. <version>1.1.2</version>
  79. </dependency>
  80. <!-- devtools -->
  81. <dependency>
  82. <groupId>org.springframework.boot</groupId>
  83. <artifactId>spring-boot-devtools</artifactId>
  84. <optional>true</optional>
  85. </dependency>
  86. <!-- mysql -->
  87. <dependency>
  88. <groupId>mysql</groupId>
  89. <artifactId>mysql-connector-java</artifactId>
  90. </dependency>
  91. <!-- aop -->
  92. <dependency>
  93. <groupId>org.springframework.boot</groupId>
  94. <artifactId>spring-boot-starter-aop</artifactId>
  95. </dependency>
  96.  
  97. <!-- redis -->
  98. <!--<dependency>
  99. <groupId>org.springframework.boot</groupId>
  100. <artifactId>spring-boot-starter-data-redis</artifactId>
  101. </dependency>-->
  102.  
  103. <dependency>
  104. <groupId>org.springframework.boot</groupId>
  105. <artifactId>spring-boot-starter-redis</artifactId>
  106. <version>1.4.7.RELEASE</version>
  107. </dependency>
  108. <dependency>
  109. <groupId>org.springframework.session</groupId>
  110. <artifactId>spring-session-data-redis</artifactId>
  111. </dependency>
  112.  
  113. <!-- activemq -->
  114. <dependency>
  115. <groupId>org.springframework.boot</groupId>
  116. <artifactId>spring-boot-starter-activemq</artifactId>
  117. </dependency>
  118.  
  119. <!-- thymeleaf -->
  120. <dependency>
  121. <groupId>org.springframework.boot</groupId>
  122. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  123. </dependency>
  124.  
  125. <!-- mail -->
  126. <dependency>
  127. <groupId>org.springframework.boot</groupId>
  128. <artifactId>spring-boot-starter-mail</artifactId>
  129. </dependency>
  130.  
  131. <!-- swagger2 -->
  132. <dependency>
  133. <groupId>io.springfox</groupId>
  134. <artifactId>springfox-swagger2</artifactId>
  135. <version>2.7.0</version>
  136. </dependency>
  137. <dependency>
  138. <groupId>io.springfox</groupId>
  139. <artifactId>springfox-swagger-ui</artifactId>
  140. <version>2.7.0</version>
  141. </dependency>
  142. <dependency>
  143. <groupId>org.springframework.boot</groupId>
  144. <artifactId>spring-boot-test</artifactId>
  145. </dependency>
  146. <dependency>
  147. <groupId>junit</groupId>
  148. <artifactId>junit</artifactId>
  149. </dependency>
  150. <dependency>
  151. <groupId>org.springframework</groupId>
  152. <artifactId>spring-test</artifactId>
  153. <version>4.3.10.RELEASE</version>
  154. </dependency>
  155. </dependencies>
  156.  
  157. <build>
  158. <plugins>
  159. <plugin>
  160. <groupId>org.springframework.boot</groupId>
  161. <artifactId>spring-boot-maven-plugin</artifactId>
  162. </plugin>
  163. <plugin>
  164. <groupId>org.mybatis.generator</groupId>
  165. <artifactId>mybatis-generator-maven-plugin</artifactId>
  166. <version>1.3.2</version>
  167. <configuration>
  168. <verbose>true</verbose>
  169. <overwrite>true</overwrite>
  170. </configuration>
  171. </plugin>
  172.  
  173. </plugins>
  174.  
  175. </build>
  176.  
  177. </project>

  

实体

  1. package com.wls.integrateplugs.jpa.primary.model;
  2.  
  3. /**
  4. * Created by wls on 2017/8/24.
  5. */
  6. import java.io.Serializable;
  7.  
  8. import javax.persistence.Column;
  9. import javax.persistence.Entity;
  10. import javax.persistence.GeneratedValue;
  11. import javax.persistence.Id;
  12.  
  13. @Entity
  14. public class User implements Serializable {
  15.  
  16. private static final long serialVersionUID = 1L;
  17. @Id
  18. @GeneratedValue
  19. private Long id;
  20. @Column(nullable = false, unique = true)
  21. private String userName;
  22. @Column(nullable = false)
  23. private String passWord;
  24. @Column(nullable = false, unique = true)
  25. private String email;
  26. @Column(nullable = true, unique = true)
  27. private String nickName;
  28. @Column(nullable = false)
  29. private String regTime;
  30. @Column(nullable = false)
  31. private String name;
  32. @Column(nullable = false)
  33. private Integer age;
  34.  
  35. public User() {
  36. super();
  37. }
  38.  
  39. public User(String userName, String passWord, String email, String nickName, String regTime, String name, Integer age) {
  40. this.userName = userName;
  41. this.passWord = passWord;
  42. this.email = email;
  43. this.nickName = nickName;
  44. this.regTime = regTime;
  45. this.name = name;
  46. this.age = age;
  47. }
  48.  
  49. public Long getId() {
  50. return id;
  51. }
  52. public void setId(Long id) {
  53. this.id = id;
  54. }
  55. public String getUserName() {
  56. return userName;
  57. }
  58. public void setUserName(String userName) {
  59. this.userName = userName;
  60. }
  61. public String getPassWord() {
  62. return passWord;
  63. }
  64. public void setPassWord(String passWord) {
  65. this.passWord = passWord;
  66. }
  67. public String getEmail() {
  68. return email;
  69. }
  70. public void setEmail(String email) {
  71. this.email = email;
  72. }
  73. public String getNickName() {
  74. return nickName;
  75. }
  76. public void setNickName(String nickName) {
  77. this.nickName = nickName;
  78. }
  79. public String getRegTime() {
  80. return regTime;
  81. }
  82. public void setRegTime(String regTime) {
  83. this.regTime = regTime;
  84. }
  85.  
  86. public String getName() {
  87. return name;
  88. }
  89.  
  90. public void setName(String name) {
  91. this.name = name;
  92. }
  93.  
  94. public Integer getAge() {
  95. return age;
  96. }
  97.  
  98. public void setAge(Integer age) {
  99. this.age = age;
  100. }
  101. }

  Controller

  1. package com.wls.integrateplugs.swagger;
  2.  
  3. /**
  4. * Created by wls on 2017/8/24.
  5. */
  6. import java.util.*;
  7.  
  8. import com.wls.integrateplugs.jpa.primary.repository.IUserRepository;
  9. import com.wls.integrateplugs.jpa.primary.model.User;
  10. import io.swagger.annotations.ApiImplicitParam;
  11. import io.swagger.annotations.ApiImplicitParams;
  12. import io.swagger.annotations.ApiOperation;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.web.bind.annotation.*;
  15.  
  16. @RestController
  17. @RequestMapping(value="/users") // 通过这里配置使下面的映射都在/users下,可去除
  18. public class UserController {
  19.  
  20. @Autowired
  21. private IUserRepository iUserRepository;
  22.  
  23. static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());
  24.  
  25. /*@RequestMapping("/getUser")
  26. @Cacheable(value="user-key")
  27. public User getUser() {
  28. User user=iUserRepository.findByUserName("aa");
  29. System.out.println("若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功");
  30. return user;
  31. }
  32.  
  33. @RequestMapping("/getUsers")
  34. @Cacheable(value="key-Users")
  35. public List<User> getUsers() {
  36. List<User> users=iUserRepository.findAll();
  37. System.out.println("若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功");
  38. return users;
  39. }*/
  40.  
  41. @ApiOperation(value="获取用户列表", notes="获取用户列表")
  42. @RequestMapping(value={"/"}, method=RequestMethod.GET)
  43. public List<User> getUserList() {
  44. // 处理"/users/"的GET请求,用来获取用户列表
  45. // 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递
  46. List<User> r = new ArrayList<User>(users.values());
  47. return r;
  48. }
  49.  
  50. @ApiOperation(value="创建用户", notes="根据User对象创建用户")
  51. @ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
  52. @RequestMapping(value="/", method=RequestMethod.POST)
  53. // public String postUser(@RequestBody User user) {
  54. public String postUser(@ModelAttribute User user) {
  55. // 处理"/users/"的POST请求,用来创建User
  56. // 除了@ModelAttribute绑定参数之外,还可以通过@RequestParam从页面中传递参数
  57. users.put(user.getId(), user);
  58. return "success";
  59. }
  60.  
  61. @ApiOperation(value="获取用户详细信息", notes="根据url的id来获取用户详细信息")
  62. @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long")
  63. @RequestMapping(value="/{id}", method=RequestMethod.GET)
  64. public User getUser(@PathVariable Long id) {
  65. // 处理"/users/{id}"的GET请求,用来获取url中id值的User信息
  66. // url中的id可通过@PathVariable绑定到函数的参数中
  67. return users.get(id);
  68. }
  69.  
  70. @ApiOperation(value="更新用户详细信息", notes="根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息")
  71. @ApiImplicitParams({
  72. @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long"),
  73. @ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
  74. })
  75. @RequestMapping(value="/{id}", method= RequestMethod.PUT)
  76. // public String putUser(@PathVariable Long id, @RequestBody User user) {
  77. public String putUser(@PathVariable Long id, @ModelAttribute User user) {
  78. // 处理"/users/{id}"的PUT请求,用来更新User信息
  79. User u = users.get(id);
  80. u.setName(user.getName());
  81. u.setAge(user.getAge());
  82. users.put(id, u);
  83. return "success";
  84. }
  85.  
  86. @ApiOperation(value="删除用户", notes="根据url的id来指定删除对象")
  87. @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long")
  88. @RequestMapping(value="/{id}", method=RequestMethod.DELETE)
  89. public String deleteUser(@PathVariable Long id) {
  90. // 处理"/users/{id}"的DELETE请求,用来删除User
  91. users.remove(id);
  92. return "success";
  93. }
  94. }

  

  1. package com.wls.integrateplugs.hello.controller;
  2.  
  3. /**
  4. * Created by wls on 2017/8/24.
  5. */
  6. import java.util.Locale;
  7. import java.util.UUID;
  8.  
  9. import javax.servlet.http.HttpSession;
  10.  
  11. import com.sun.org.apache.regexp.internal.RE;
  12. import org.springframework.ui.Model;
  13. import org.springframework.ui.ModelMap;
  14. import org.springframework.web.bind.annotation.RequestMapping;
  15. import org.springframework.web.bind.annotation.RequestMethod;
  16. import org.springframework.web.bind.annotation.RestController;
  17. import org.springframework.web.servlet.ModelAndView;
  18. import springfox.documentation.annotations.ApiIgnore;
  19.  
  20. @RestController
  21. public class HelloController {
  22.  
  23. @RequestMapping(value = "/hello",method = RequestMethod.GET)
  24. public String hello(Locale locale, Model model) {
  25. return "hello world";
  26. }
  27.  
  28. @RequestMapping("/helloWorld")
  29. public String index() {
  30. return "Hello World";
  31. }
  32.  
  33. /**
  34. * 使用@RestController时,则使用ModelAndView显示页面
  35. * @param map
  36. * @return
  37. */
  38. @ApiIgnore
  39. @RequestMapping(value = "/helloThymeleaf",method = RequestMethod.GET)
  40. public ModelAndView index(ModelMap map) {
  41. ModelAndView mv = new ModelAndView("index");
  42. map.addAttribute("host", "http://blog.didispace.com");
  43. return mv;
  44. }
  45.  
  46. /**
  47. * 共享session
  48. * @param session
  49. * @return
  50. */
  51. @RequestMapping(value = "/uid",method = RequestMethod.GET)
  52. String uid(HttpSession session) {
  53. UUID uid = (UUID) session.getAttribute("uid");
  54. if (uid == null) {
  55. uid = UUID.randomUUID();
  56. }
  57. session.setAttribute("uid", uid);
  58. return session.getId();
  59. }
  60.  
  61. }

  单元测试

  1. package com.wls.test.integrateplugs.swagger;
  2.  
  3. import com.wls.integrateplugs.hello.controller.HelloController;
  4. import com.wls.integrateplugs.swagger.UserController;
  5. import org.junit.Before;
  6. import org.junit.Test;
  7. import org.junit.runner.RunWith;
  8. import org.springframework.boot.test.context.SpringBootTest;
  9. import org.springframework.http.MediaType;
  10. import org.springframework.mock.web.MockServletContext;
  11. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  12. import org.springframework.test.context.web.WebAppConfiguration;
  13. import org.springframework.test.web.servlet.MockMvc;
  14. import org.springframework.test.web.servlet.RequestBuilder;
  15. import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
  16. import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
  17. import org.springframework.test.web.servlet.setup.MockMvcBuilders;
  18.  
  19. import static org.hamcrest.Matchers.equalTo;
  20. import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
  21. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
  22. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  23.  
  24. @SpringBootTest
  25. @RunWith(SpringJUnit4ClassRunner.class)
  26. @WebAppConfiguration
  27. public class SwaggerTest {
  28.  
  29. private MockMvc mvc;
  30.  
  31. @Before
  32. public void setUp() throws Exception {
  33. mvc = MockMvcBuilders.standaloneSetup(
  34. new HelloController(),
  35. new UserController()).build();
  36. }
  37.  
  38. @Test
  39. public void getHello() throws Exception {
  40. mvc.perform(get("/hello").accept(MediaType.APPLICATION_JSON))
  41. .andExpect(status().isOk())
  42. .andExpect(content().string(equalTo("hello world")));
  43. }
  44.  
  45. @Test
  46. public void testUserController() throws Exception {
  47. // 测试UserController
  48. RequestBuilder request = null;
  49.  
  50. // 1、get查一下user列表,应该为空
  51. request = get("/users/");
  52. mvc.perform(request)
  53. .andExpect(status().isOk())
  54. .andExpect(content().string(equalTo("[]")));
  55.  
  56. // 2、post提交一个user
  57. request = post("/users/")
  58. .param("id", "1")
  59. .param("name", "测试大师")
  60. .param("age", "20");
  61. mvc.perform(request)
  62. .andDo(MockMvcResultHandlers.print())
  63. .andExpect(content().string(equalTo("success")));
  64.  
  65. // 3、get获取user列表,应该有刚才插入的数据
  66. request = get("/users/");
  67. mvc.perform(request)
  68. .andExpect(status().isOk())
  69. .andExpect(content().string(equalTo("[{\"id\":1,\"userName\":null,\"passWord\":null,\"email\":null,\"nickName\":null,\"regTime\":null,\"name\":\"测试大师\",\"age\":20}]")));
  70.  
  71. // 4、put修改id为1的user
  72. request = put("/users/1")
  73. .param("name", "测试终极大师")
  74. .param("age", "30");
  75. mvc.perform(request)
  76. .andExpect(content().string(equalTo("success")));
  77.  
  78. // 5、get一个id为1的user
  79. request = get("/users/1");
  80. mvc.perform(request)
  81. .andExpect(content().string(equalTo("{\"id\":1,\"userName\":null,\"passWord\":null,\"email\":null,\"nickName\":null,\"regTime\":null,\"name\":\"测试终极大师\",\"age\":30}")));
  82.  
  83. // 6、del删除id为1的user
  84. request = delete("/users/1");
  85. mvc.perform(request)
  86. .andExpect(content().string(equalTo("success")));
  87.  
  88. // 7、get查一下user列表,应该为空
  89. request = get("/users/");
  90. mvc.perform(request)
  91. .andExpect(status().isOk())
  92. .andExpect(content().string(equalTo("[]")));
  93.  
  94. }
  95. }
  1. Swagger2配置类

  

  1. package com.wls.integrateplugs.swagger;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import springfox.documentation.builders.ApiInfoBuilder;
  6. import springfox.documentation.builders.PathSelectors;
  7. import springfox.documentation.builders.RequestHandlerSelectors;
  8. import springfox.documentation.service.ApiInfo;
  9. import springfox.documentation.spi.DocumentationType;
  10. import springfox.documentation.spring.web.plugins.Docket;
  11. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  12.  
  13. /**
  14. * @author 程序猿DD
  15. * @version 1.0.0
  16. * @date 16/4/18 下午12:02.
  17. * @blog http://blog.didispace.com
  18. */
  19. @Configuration
  20. @EnableSwagger2
  21. public class Swagger2 {
  22.  
  23. @Bean
  24. public Docket createRestApi() {
  25. return new Docket(DocumentationType.SWAGGER_2)
  26. .apiInfo(apiInfo())
  27. .select()
  28. .apis(RequestHandlerSelectors.basePackage("com.wls"))
  29. .paths(PathSelectors.any())
  30. .build();
  31. }
  32.  
  33. private ApiInfo apiInfo() {
  34. return new ApiInfoBuilder()
  35. .title("Spring Boot中使用Swagger2构建RESTful APIs")
  36. .description("更多Spring Boot相关文章请关注:http://blog.didispace.com/")
  37. .termsOfServiceUrl("http://blog.didispace.com/")
  38. .contact("程序猿DD")
  39. .version("1.0")
  40. .build();
  41. }
  42.  
  43. }

  

访问地址:localhost:8081/project/swagger-ui.html

spring boot☞Swagger2文档构建及单元测试的更多相关文章

  1. Swagger2 生成 Spring Boot API 文档

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.本文主要介绍了在 Spring Boot 添加 Swagger 支持, 生成可自动维护的 A ...

  2. spring boot:swagger3文档展示分页和分栏的列表数据(swagger 3.0.0 / spring boot 2.3.3)

    一,什么情况下需要展示分页和分栏的数据的文档? 分页时,页面上展示的是同一类型的列表的数据,如图: 分栏时,每行都是一个列表,而且展示的数据类型也可能不同 这也是两种常用的数据返回形式 说明:刘宏缔的 ...

  3. 【Java架构:基础技术】一篇文章搞掂:Spring Boot 官方文档解读

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文内容大部分是翻译和总结官方文档,可以到https://docs.spring.io/spring-boot/docs查看(此地 ...

  4. Java | Spring Boot Swagger2 集成REST ful API 生成接口文档

      Spring Boot Swagger2 集成REST ful API 生成接口文档 原文 简介 由于Spring Boot 的特性,用来开发 REST ful 变得非常容易,并且结合 Swagg ...

  5. Spring Boot项目使用Swagger2文档教程

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 前言 Sprin ...

  6. SpringBoot之Swagger2文档生成

    SpringBoot之Swagger2文档生成 1.Swagger2介绍 编写和维护接口文档是每个程序员的职责,前面我们已经写好的接口现在需要提供一份文档,这样才能方便调用者使用.考虑到编写接口文档是 ...

  7. Spring Boot中文文档(官方文档翻译 基于1.5.2.RELEASE)

    作者:Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, ...

  8. spring boot 中文文档地址

    spring boot 中文文档地址     http://oopsguy.com/documents/springboot-docs/1.5.4/index.html Spring Boot 参考指 ...

  9. 20191118 Spring Boot官方文档学习(4.8)

    4.8. RSocket RSocket参考 RSocket是用于字节流传输的二进制协议.它通过单个连接传递的异步消息来启用对称交互模型. Spring框架的spring-messaging模块在客户 ...

随机推荐

  1. 「自己开发直播」实现nginx-rtmp-module多频道输入输出与权限控制

    之前写了一篇文章,利用nginx和nginx-rtmp-module实现直播. 不过,之前只是做到了能够直播而已,只能一个人推流,并没有实现多人多频道输入输出,也没有权限控制,只要知道rtmp的URL ...

  2. python 面向对象(类的特殊成员)

    python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...

  3. 3069: [Pa2011]Hard Choice 艰难的选择

    Description Byteasar是一个很纠结的人.每次他经过Bytetown的时候都知道有至少2条不同的路径可以选择,这导致他必须花很长时间来决定走哪条路.Byteasar最近听说了Bytet ...

  4. 【学步者日记】C#使用线程

    http://note.youdao.com/noteshare?id=2810300cdfa3f4d973792dcf30a31db9 System.Threading.Thread th; th ...

  5. DataTables warning: table id=DataTables_Table_0 - Requested unknown parameter '1' for row 0. For more information about this error, please see http://datatables.net/tn/4

    今天在做后台的时候,考虑到会员模块和订单模块列表显示差不多,于是乎,偷了个懒,把会员列表显示页面的代码拷贝了过来,修改了一下,变成了订单模块.可是,在订单列表显示的时候老是报下面的错误,截图如下: 后 ...

  6. 2017百度之星初赛A-1006(HDU-6113)

    思路:在图的外面包一圈'0'字符,然后dfs统计'0'字符的个数和'1'字符的个数.结果如下(num0表示0字符的个数,num1表示1字符的个数): num0 == 1 && num1 ...

  7. SVN更新或提交时出现冲突该如何解决

    解决版本冲突的命令.在冲突解决之后,需要使用svnresolved来告诉subversion冲突解决,这样才能提交更新.冲突发生时,subversion会在WorkCopy中保存所有的目标文件版本(上 ...

  8. Nginx配置ProxyCache缓存

    利用nginx cache缓存网站数据 nginx本身就有缓存功能,能够缓存静态对象,比如图片.CSS.JS等内容直接缓存到本地,下次访问相同对象时,直接从缓存即可,无需访问后端静态服务器以及存储存储 ...

  9. 大数据,物联网(Internet of Things),万物互联网(Internet of Everything),云计算,雾计算,边缘计算(Edge Computing) 的区别和联系

    大数据是一种规模大到在获取.存储.管理.分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模.快速的数据流转.多样的数据类型,高价值性和准确性五大特征,即5V(Volume, V ...

  10. 「小程序JAVA实战」小程序和后台api通信(28)

    转自:https://idig8.com/2018/08/19/xiaochengxujavashizhanxiaochengxuhehoutaiapitongxin28/ 开发最重要的就是实操! 小 ...