1.fastjson介绍

java处理json的库: fastjson , jackson , gson

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化JSON字符串,也可以从JSON字符串反序列化到JavaBean。 fastjson是json的序列化和反序列化fastjson已经被广泛使用在各种场景,包括cache存储、RPC通讯、MQ通讯、网络协议通讯、Android客户端、Ajax服务器处理程序等等。

fastjson相对其他JSON库的特点是快,从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库超越。

maven依赖:

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.51</version>
  5. </dependency>

1.1 简单例子

创建对象Student

  1. public class Student {
  2. private String name;
  3. private String phone;
  4. private Integer age;
  5. // set | get
  6. }

测试方法

  1. @Test
  2. public void test01(){
  3. Student student = new Student();
  4. student.setName("李响");
  5. student.setAge(20);
  6. student.setPhone("1350000000");
  7. //序列化
  8. String jsonStr = JSONObject.toJSONString(student);
  9. System.out.println("student序列化为json字符串="+jsonStr);
  10. }
  11. @Test
  12. public void test02(){
  13. String jsonStr = "{\"age\":20,\"name\":\"李响\",\"phone\":\"1350000000\"}";
  14. //反序列化
  15. Student student = JSONObject.parseObject(jsonStr,Student.class);
  16. System.out.println("json字符串转为Student对象="+student);
  17. }

1.2解析json

  1. /**
  2. * {"age":20,"name":"李响","phone":"1350000000",
  3. * "school":{"address":"北京的海淀区","name":"北京大学"}
  4. * }
  5. */
  6. @Test
  7. public void test04(){
  8. String str="{\"age\":20,\"name\":\"李响\",\"phone\":\"1350000000\",\"school\":{\"address\":\"北京的海淀区\",\"name\":\"北京大学\"}}";
  9. JSONObject jsonObject = JSONObject.parseObject(str);
  10. System.out.println(jsonObject);
  11. String name = jsonObject.getString("name");
  12. int age = jsonObject.getIntValue("age");
  13. System.out.println("name="+name);
  14. System.out.println("age="+age);
  15. JSONObject schoolJson = jsonObject.getJSONObject("school");
  16. System.out.println("school name="+schoolJson.getString("name"));
  17. System.out.println("school address="+schoolJson.getString("address"));
  18. }

2 HttpClient

HttpClient是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。

HttpClient 是一个HTTP通信库、一个工具包,它只提供一个通用浏览器应用程序所期望的功能子集,与浏览器相比是没有界面的。

把HttpClient 看做是 ajax 中的 XMLHttpRequest对象

  1. var req = new XMLHttpRequest(); req.onchange()=function(){
  2. }
  3. req.open("http://localhost:8080/myweb/login?name=lisi")
  4. req.send();

2.1 HttpClient能做什么

HttpClient的功能包括但不限于:

模拟浏览器发送HTTP请求,发送请求参数,并接收响应。
RPC接口调用
爬取网页源码

2.2 HttpClient优点

基于标准、纯净的java语言。实现了HTTP1.0和HTTP1.1;
以可扩展的面向对象的结构实现了HTTP全部的方法(GET, POST等7种方法);
支持HTTPS协议;通过HTTP代理建立透明的连接

2.3怎么用

文档:http://hc.apache.org/httpcomponents-client-5.0.x/
1)pom.xml

  1. <dependency>
  2. <groupId>org.apache.httpcomponents</groupId>
  3. <artifactId>httpclient</artifactId>
  4. <version>4.5.12</version>
  5. </dependency>

2.3.1 get请求

  1. public void testGet(){
  2. String url="https://restapi.amap.com/v3/ip?key=0113a13c88697dcea6a445584d535837&ip=60.25.188.64";
  3. //1.创建HttpClient对象
  4. CloseableHttpClient client = HttpClients.createDefault();
  5. //2.使用get请求,创建HttpGet对象
  6. HttpGet get = new HttpGet(url);
  7. try{
  8. //3.发起请求, 使用client对象
  9. // CloseableHttpResponse:表示访问url后,对方给你返回的结果
  10. CloseableHttpResponse response = client.execute(get);
  11. //4.通过response获取请求的数据
  12. String result = EntityUtils.toString(response.getEntity());
  13. System.out.println("访问地址后,得到结果内容:"+result);
  14. }catch (Exception e){
  15. e.printStackTrace();
  16. } finally {
  17. //关闭client
  18. try {
  19. client.close();
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }

2.3.2 Post请求

  1. @Test
  2. public void testPost() throws IOException {
  3. //测试使用HttpClient的post请求
  4. //https://restapi.amap.com/v3/ip?key=0113a13c88697dcea6a445584d535837&ip="
  5. String url = "https://restapi.amap.com/v3/ip";
  6. //1创建HttpClient对象
  7. CloseableHttpClient client = HttpClients.createDefault();
  8. //2.创建HttpPost对象
  9. HttpPost post = new HttpPost(url);
  10. //3.给post请求,指定请求的参数, 参数名称=值的方式
  11. List<NameValuePair> params = new ArrayList<>();
  12. params.add( new BasicNameValuePair("key","0113a13c88697dcea6a445584d535837"));
  13. params.add(new BasicNameValuePair("ip","39.137.95.111"));
  14. try{
  15. //添加其他的参数
  16. HttpEntity entity = new UrlEncodedFormEntity(params);
  17. post.setEntity(entity);
  18. //执行请求
  19. CloseableHttpResponse response = client.execute(post);
  20. if( response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
  21. String str = EntityUtils.toString(response.getEntity());
  22. System.out.println("str="+str);
  23. }
  24. }catch (Exception e){
  25. e.printStackTrace();
  26. }finally {
  27. client.close();
  28. }
  29. }

3.Swagger-接口文档

3.1 Swagger是做什么的

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧密集成到服务器。

Swagger能够在线自动生成RESTFul接口的文档,同时具备测试接口的功能。

简单点来讲就是说,swagger是一款可以根据RESTFul风格生成的生成的接口开发文档,并且支持做测试的一款中间软件。不是RESTFul风格也能生成文档。

特点是在线的,及时的,最新的。

3.2Swagger优点和作用

· 服务器端只需要定义好接口,会自动生成文档,接口功能、参数一目了然
· 联调方便,如果出问题,直接测试接口,实时检查参数和返回值,就可以快速定位是前端还是后端的问题
· 对于某些没有前端界面UI的功能,可以用它来测试接口
· 操作简单,不用了解具体代码就可以操作

3.3 Swagger动态生成API

首先通过SpringBoot创建Web项目。选择web依赖。

maven的pom.xm.加入swagger依赖

  1. <!--Swagger依赖-->
  2. <dependency>
  3. <groupId>io.springfox</groupId>
  4. <artifactId>springfox-swagger2</artifactId>
  5. <version>2.9.2</version>
  6. </dependency>
  7. <!--Swagger UI-->
  8. <dependency>
  9. <groupId>io.springfox</groupId>
  10. <artifactId>springfox-swagger-ui</artifactId>
  11. <version>2.9.2</version>
  12. </dependency>

下一步创建配置类,在com.bjpowernode.settings包

  1. @Configuration
  2. public class SwaggerConfiguration {
  3. @Bean
  4. public Docket docket(){
  5. // 文档类型 2.0版本
  6. Docket docket = new Docket(DocumentationType.SWAGGER_2);
  7. ApiInfo apiInfo = new ApiInfoBuilder()
  8. .title("动力节点盈利宝项目")
  9. .version("1.0")
  10. .description("盈利宝前后端分离微服务项目")
  11. .contact( new Contact("动力节点java黄埔军校", //文档发布者
  12. "http://www.bjpowernode.com", //文档发布者网站
  13. "bjpowernode@bjpowenrode.cn")) //文档发布者的联系邮箱
  14. .build();
  15. docket.apiInfo(apiInfo);
  16. // 指定注解
  17. docket = docket.select()
  18. .apis(RequestHandlerSelectors.basePackage("com.changming.controller")).build();
  19. return docket;
  20. }

最后在启动上加入@EnableSwagger2

  1. @EnableSwagger2
  2. @SpringBootApplication
  3. public class MockDataApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(MockDataApplication.class, args);
  6. }
  7. }

解决springboot2.6.2使用swagger的问题

  1. server.port=8080
  2. server.servlet.context-path=/myweb
  3. #\u8DEF\u5F84\u5339\u914D\u89C4\u5219
  4. #解决springboot2.6.2使用swagger的问题
  5. #如果使用SpringBoot 2.6以上版本,需要在application.properties加入
  6. spring.mvc.pathmatch.matching-strategy=ant_path_matcher

浏览器访问:http://ip:port/contextPath/swagger-ui.html
例如: http://localhost:8080/myweb/swagger-ui.html
image.png

Swagger中注解列表:

@Api
用在类上,说明该类的作用。可以标记一个 Controller 类作为 Swagger 文档资源
例如:
@Api(tags={“用户接口”})
@RestController
public class UserController {
}

@ApiModel
用在类上,表示对类进行说明,用于实体类中的参数接收说明。

@ApiModel(value = “com.bjpowernode.AddUserParam”, description = “新增用户参数”)
public class AddUserParam {
}

@ApiModelProperty
用于字段,表示对 model 属性的说明

@ApiModel(value = “com.bjpowernode.AddUserParam”, description = “新增用户参数”)
public class AddUserParam {
@ApiModelProperty(value = “ID”)
private String id;
@ApiModelProperty(value = “名称”)
private String name;
@ApiModelProperty(value = “年龄”)
private int age;
}

@ApiOperation
用在 Controller 里的方法上,说明方法的作用,每一个接口的定义

@ApiOperation(value=”新增用户”, notes=”详细描述”)
public UserDto addUser( AddUserParam param) {
}

@ApiImplicitParam 和 @ApiImplicitParams
用于方法上,为单独的请求参数进行说明

@ApiImplicitParams({
@ApiImplicitParam(name = “id”, value = “用户ID”, dataType = “string”, paramType = “query”, required = true, defaultValue = “1”) })
@GetMapping(“/user”)
public UserDto getUser(@RequestParam(“id”) String id) {
return new UserDto();
}

  • name:参数名,对应方法中单独的参数名称。
  • value:参数中文说明。
  • required:是否必填。
  • paramType:参数类型,取值为 path、query、body、header、form。
  • dataType:参数数据类型。
  • defaultValue:默认值。

@ApiResponse 和 @ApiResponses
用于方法上,说明接口响应的一些信息;@ApiResponses 组装了一个或多个 @ApiResponse

@ApiResponses({ @ApiResponse(code = 200, message = “OK”, response = UserDto.class) })
@PostMapping(“/user”)
public UserDto addUser(AddUserParam param) {
}