HTTP和RESTful API

2018-11-04  本文已影响0人  迷路的丸子

TCP/IP五层网络架构

数据链路层和物理层是设备工程师考虑的问题,而应用层、传输层、网络层是Web工程师该考虑的问题

HTTP协议

HTTP请求格式

HTTP回应格式

常见的Content-Type字段值

HTTPStatus

总结

一个HTTP请求在语义上表达对一个互联网资源(URL)的操作(GET,POST,PUT,Delete),然后Web后端返回资源操作的结果和相关信息

RESTful API

RESTful API就是基于HTTP协议对互联网的内容定义的方式提出的一套互联网应用的架构体系,其中信息以JSON的形式进行存储,对对象的资源、操作、状态
进行定义,RESTful是一种设计模式规范的指南,不是强制性的要求,所以要靠开发者自己遵守

URL基本要求

1.协议:HTTP或HTTPS
2.域名和地址一般格式:http://<域名>/api/<version>
3.域名和地址之后接资源名字统一用复数

写RESTful API步骤

1.想清楚我们的应用里可以抽象出什么样的资源,和他们的层次结构
2.想清楚对对象的基本操作:GET,POST,PUT,DELETE的含义是什么
3.组织接口代码。Spring如何去定义这些路由(URL):URL->Java类方法
4.开始实现

HTTP相关Web编程

采用了Spring框架,在Maven中配置好pom.xml即可,pom.xml相关配置在https://pandorawanz.github.io/2018/10/14/SpringBootStarted/

操作相关注解

参数相关注解

User

public class User {
    private String name;
    private String content;

    public User() {
        // default constructor for spring mapping
        // Spring中不可以省略空构造方法
    }

    public User(String name, String content) {
        this.name = name;
        this.content = content;
    }

    public String getName() {
        return name;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public void setName(String name) {
        this.name = name;
    }
}

UserController

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

// 告诉Spring这是个Controller
// 资源的控制,资源的接口合集
@RestController
public class UserController {

    // user -> User对象
    private final HashMap<String, User> users = new HashMap<>();

    // Spring 通过HTTP请求中的操作(GET, POST, PUT, DELETE) + URL确定调用方法来处理请求

    /**
     * 响应 GET /users 这样的请求
     * 查询用户列表
     * @return 所有用户列表
     */
    @GetMapping("/users")
    List<User> listUsers() {
        return new ArrayList<>(users.values());
    }

    /**
     * 响应 GET /users/{name}
     * 通过User的name查询具体User对象
     * @param name
     * @return name确定User对象
     */
    @GetMapping("/users/{name}")
    // 从path中提取出name
    ResponseEntity<User> getUser(@PathVariable String name) {
        if (users.containsKey(name)) {
            return new ResponseEntity<>(users.get(name),HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    /**
     * 响应 POST /users 这样的请求
     * 添加一个用户到我们用户列表里
     * @param user
     * @return 返回创建成功的User对象
     */

    /*
    @PostMapping("/users")
    User newUser(@RequestBody User user) {
        users.put(user.getName(),user);
        return users.get(user.getName());
    }
    */

    /**
     * 响应 POST /users 这样的请求
     * 添加一个用户到我们用户列表里
     * @param user
     * @return 返回创建成功的User对象
     */
    @PostMapping("/users")
    ResponseEntity<User> newUser(@RequestBody User user) {
        users.put(user.getName(),user);
        // 创建成功后返回User对象,以及自定义的状态值201
        return new ResponseEntity<>(users.get(user.getName()), HttpStatus.CREATED);
    }

    /**
     * 响应 PUT /users/{name} 这样的请求
     * @param name
     * @param updatedUser
     * @return 修改之后的User对象
     */
    @PutMapping("/users/{name}")
    ResponseEntity<User> updateUser(@PathVariable String name,@RequestBody User updatedUser) {
        if (users.containsKey(name)) {
            User user = users.get(name);
            user.setContent(updatedUser.getContent());
            return new ResponseEntity<>(user,HttpStatus.OK);
        } else return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }

    /**
     * 响应 DELETE /users/{name} 这样的请求
     * 删除 name 确定的User对象
     * @param name
     */
    @DeleteMapping("/users/{name}")
    ResponseEntity<Void> deleteUser(@PathVariable String name) {
        if (users.containsKey(name)) {
            users.remove(name);
            return new ResponseEntity<>(HttpStatus.OK);
        } else return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }
}

Application

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// 告诉Spring从这里启动
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读