1. fastjson介绍 2
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模块
maven依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
1.1 简单例子 2-3
依赖
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bjpowernode</groupId>
<artifactId>ready-01-fastjson</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<!-- 单元测试 2-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
创建对象Student
package com.bjpowernode.model;
//实体类 2
public class Student {
private Integer id;
private String name;
private Integer age;
//对象类型
private School school;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}
}
测试方法MyTest
//将一个student对象转为json 2
@Test
public void testToJson(){
Student student = new Student();
student.setId(2001);
student.setName("李四");
student.setAge(20);
//student-json, 使用fastjson -- JSONObject 提供了静态方法
String json = JSONObject.toJSONString(student);
//{"age":20,"id":2001,"name":"李四"}
System.out.println("student转为json="+json);
}
//json->student对象 2
@Test
public void testToObject(){
String json="{\"age\":30,\"id\":5671,\"name\":\"周畅\"}";
//转为对象
Student student = JSONObject.parseObject(json, Student.class);
//Student{id=5671, name='周畅', age=30}
System.out.println("student="+student);
System.out.println("name="+student.getName());
}
//获取 name key 的值 3
@Test
public void testAccessValue(){
String json="{\"age\":30,\"id\":5671,\"name\":\"周畅\"}";
JSONObject jsonObject = JSONObject.parseObject(json);
//JSONObject是一个map
String name = jsonObject.getString("name");
System.out.println("name="+name);
int age = jsonObject.getIntValue("age");
System.out.println("age = " + age);
}
1.2 解析json 4
在创建一个实体类
实体类School
package com.bjpowernode.model;
//实体类 4
public class School {
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
测试类TestJSON 4
@Test
public void test01(){
Student student = new Student();
student.setId(1001);
student.setName("李四");
student.setAge(20);
School school = new School();
school.setName("北京大学");
school.setAddress("北京的海淀区");
student.setSchool(school);//将学校设置进学生的属性 4
//student - json
String json = JSONObject.toJSONString(student);
//{"age":20,"id":1001,"name":"李四","school":{"address":"北京的海淀区","name":"北京大学"}}
System.out.println("json = " + json);
}
//json->student 4
@Test
public void test02(){
String json="{\"age\":22,\"id\":2001,\"name\":\"李四\",\"school\":{\"address\":\"北京的海淀区\",\"name\":\"北京大学\"}}";
//转为Student
Student student = JSONObject.parseObject(json, Student.class);
System.out.println("student="+student.toString());
}
//拿到地址 4
@Test
public void testRead(){
String json="{\"age\":22,\"id\":2001,\"name\":\"李四\",\"school\":{\"address\":\"北京的海淀区\",\"name\":\"北京大学\"}}";
JSONObject jsonObject = JSONObject.parseObject(json);
/* JSONObject schoolObject = jsonObject.getJSONObject("school");
String address = schoolObject.getString("address");
System.out.println("address = " + address);*/
//将上述代码合起来 4
String string = JSONObject.parseObject(json).getJSONObject("school").getString("address");
System.out.println("string = " + string);
}
2. HttpClient是什么 5
HttpClient是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。
HttpClient 是一个HTTP通信库、一个工具包,它只提供一个通用浏览器应用程序所期望的功能子集,与浏览器相比是没有界面的。
把HttpClient 看做是 ajax 中的 XMLHttpRequest对象
2.1 HttpClient能做什么
HttpClient的功能包括但不限于:
模拟浏览器发送HTTP请求,发送请求参数,并接收响应。
RPC接口调用
爬取网页源码
2.2 HttpClient优点 5
基于标准、纯净的java语言。实现了HTTP1.0和HTTP1.1;
以可扩展的面向对象的结构实现了HTTP全部的方法(GET, POST等7种方法);
支持HTTPS协议;
通过HTTP代理建立透明的连接
2.3 怎么用 6
创建一个新模块
文档: http://hc.apache.org/httpcomponents-client-5.0.x/
代码在ready-02-httpclient
1)pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bjpowernode</groupId>
<artifactId>ready-02-httpclient</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
2.4 get请求 6
TestClient
//向url发起get请求 6
@Test
public void testGet(){
//发起get请求,编程方式处理http请求。
String url="https://restapi.amap.com/v3/ip?key=0113a13c88697dcea6a445584d535837&ip=60.25.188.64";
//1.创建HttpClient对象
CloseableHttpClient client = HttpClients.createDefault();
//2.创建HttpGet对象
HttpGet httpGet = new HttpGet(url);
//3.执行请求,使用client对象的方法,执行请求后获取返回结果
//CloseableHttpResponse是返回结果,相当于HttpServletResponse
try{
CloseableHttpResponse response = client.execute(httpGet);
//从response获取应答信息
//getStatusCode获取状态码 HttpStatus.SC_OK 200 状态码的常量
if( response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
//4.获取数据
//response.getEntity().getContent();//数据
String json = EntityUtils.toString(response.getEntity());
System.out.println("访问ip的应答结果:"+json);
}
}catch (Exception e){
e.printStackTrace();
} finally {
//5.关闭资源
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.5 Post请求 7-8
//post请求 7
@Test
public void testHttpPost(){
//1.创建HttpClient对象
CloseableHttpClient client = HttpClients.createDefault();
//2.创建HttpPost对象,表示post请求
String url = "https://restapi.amap.com/v3/ip";
HttpPost httpPost = new HttpPost(url);
//3.准备post请求的参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
//添加参数 BasicNameValuePair类,实现了NameValuePair接口
// BasicNameValuePair(参数名,参数值);
params.add( new BasicNameValuePair("key","0113a13c88697dcea6a445584d535837"));
//params.add( new BasicNameValuePair("ip","60.25.188.64"));
params.add( new BasicNameValuePair("ip","111.201.50.56"));
//4.设置HttpPost使用参数
try{
httpPost.setEntity( new UrlEncodedFormEntity(params));
//5.执行请求
CloseableHttpResponse res = client.execute(httpPost);
//6.读取数据
if( res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
String json = EntityUtils.toString(res.getEntity());
System.out.println("json="+json);
}
} catch (Exception e){
e.printStackTrace();
} finally {
//关闭资源
try{
client.close();
}catch (Exception ex){
ex.printStackTrace();
}
}
}
3. Swagger是做什么的 9
代码在ready-03-swagger
创建一个新模块,本来要创建一个springboot项目的,我们直接手动添加springboot的依赖即可
Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧密集成到服务器。
Swagger能够在线自动生成 RESTFul接口的文档,同时具备测试接口的功能。
简单点来讲就是说,swagger是一款可以根据RESTFul风格生成的生成的接口开发文档,并且支持做测试的一款中间软件。不是RESTFul风格也能生成文档。
特点是在线的,及时的,最新的。
3.1 Swagger优点和作用
• 服务器端只需要定义好接口,会自动生成文档,接口功能、参数一目了然
• 联调方便,如果出问题,直接测试接口,实时检查参数和返回值,就可以快速定位是前端还是后端的问题
• 对于某些没有前端界面UI的功能,可以用它来测试接口
• 操作简单,不用了解具体代码就可以操作
3.2 Swagger动态生成API
首先通过SpringBoot创建Web项目。选择web依赖。
maven的pom.xm.加入swagger依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bjpowernode</groupId>
<artifactId>ready-03-swagger</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--Swagger依赖 9-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
controller
MyController
package com.bjpowernode.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
//演示swagger的使用 9
@RestController
public class MyController {
@GetMapping("/hello")
public String helloSwagger(String name,Integer id){
return "Swagger在线生成接口文档,同时具有测试接口的功能";
}
}
application.properties
server.port=8000
server.servlet.context-path=/myweb
最后在启动上加入@EnableSwagger2
package com.bjpowernode;
//启动类 9
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableSwagger2 //表示启用swagger 10
@SpringBootApplication
public class SwaggerApp {
public static void main(String[] args) {
SpringApplication.run(SwaggerApp.class,args);
}
}
启动报错,是因为swagger跟springboot新版版本有关,需要改一些配置
3.2.1 修改配置 10
如果使用SpringBoot 2.6以上版本,需要在application.properties加入
#解决springboot2.6.2使用swagger的问题
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
server.port=8000
server.servlet.context-path=/myweb
#路径匹配规则 10
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
浏览器访问:http://localhost:8000/myweb/swagger-ui.html
测试
3.3 自定义文档 11
3.3.1 设置文档的头
package com.bjpowernode.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
//配置接口文档 的头 11
@Configuration
public class SwaggerConfigruationSettings {
//创建Docket对象
@Bean
public Docket docket(){
//1创建Docket对象
Docket docket = new Docket(DocumentationType.SWAGGER_2);
//2创建APi信息,接口文档的总体描述
ApiInfo apiInfo = new ApiInfoBuilder()
.title("一个金融项目")//标题
.version("1.0")//版本
.description("前后端分离的项目,前端Vue,后端Spring Boot+Dubbo分布式项目")//描述
.contact(new Contact("bj2114","http://www.bjpowernode.com","bj@bjpowernode"))//联系人
.license("2.0")//协议
.build();
//3.设置使用ApiInfo
docket = docket.apiInfo(apiInfo);
return docket;
}
}
3.3.2 设置哪些controller参与生成 12
//4. 设置哪些controller参与生成 12
docket = docket.select().apis(RequestHandlerSelectors.basePackage("com.bjpowernode.controller")).build();
3.3.3 换一个ui
<!--换一个swagger ui 12-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.6</version>
</dependency>
在启动类添加注解
浏览器输入http://localhost:8000/myweb/doc.html
3.3 Swagger中注解列表: 13
3.3.1 @Api 13
用在类上,说明该类的作用。可以标记一个 Controller 类作为 Swagger 文档资源
例如:
@Api(tags={"用户接口"})
@RestController
public class UserController {
}
3.3.2 @ApiModel 14
用在类上,表示对类进行说明,用于实体类中的参数接收说明。
@ApiModel(value = "com.bjpowernode.AddUserParam",
description = "新增用户参数")
public class AddUserParam {
}
3.3.3 @ApiModelProperty 14
用于字段,表示对 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;
}
3.3.4 @ApiOperation 13
用在 Controller 里的方法上,说明方法的作用,每一个接口的定义
@ApiOperation(value="新增用户", notes="详细描述")
public UserDto addUser( AddUserParam param) {
}
3.3.5 @ApiImplicitParam 和 @ApiImplicitParams 13
用于方法上,为单独的请求参数进行说明
@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:默认值。
3.3.6 @ApiResponse 和 @ApiResponses 14
用于方法上,说明接口响应的一些信息;@ApiResponses 组装了一个或多个 @ApiResponse
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = UserDto.class) })
@PostMapping("/user")
public UserDto addUser(AddUserParam param) {
}
新建一个实体类
package com.bjpowernode.model;
public class Student {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@ApiOperation(value = "查询学生",notes = "根据主键查询学生信息")
@ApiImplicitParams({ //说明参数 14
@ApiImplicitParam(name = "id",value = "主键")
})
@ApiResponses({//描述返回结果 14
@ApiResponse(code=200,message = "接口访问成功", response =Student.class ),
@ApiResponse(code=404,message = "接口没找到" )
})
@PostMapping("/query/id")
public Student queryStudent(String name, Integer id){
Student student = new Student();
student.setId(1001);
student.setName("李四");
return student;
}
标签:String,项目,id,json,student,准备,public,name
From: https://blog.51cto.com/u_15784725/6950020