HTTP中常用的4种请求方式——前端如何发送?后端怎么接受?

一.Get请求:

1.什么是Get请求?

2.前后端如何使用Get交互?

2.1.Query参数格式的Get请求

2.2.Path参数格式的Get请求

二.Post请求:

1.什么是Post请求?

2.前后端如何使用Post交互?

三.Put请求:

1.什么是Put请求?

2.前后端如何使用Put请求?

四.Delete请求:

1.什么是Delete请求?

2.前后端如何使用Delete请求?


 

一.Get请求:

1.什么是Get请求?

        GET请求是‌HTTP协议中的一种请求方法,主要用于从服务器获取资源。它是一种简单、安全且可缓存的请求方式,常用于在Web浏览器中访问网页或发送数据。GET请求通过将请求参数附加到URL中,以查询字符串的形式出现,以便将信息发送给服务器。这种请求方法适用于获取数据,而不是修改数据,因此它通常用于查询操作,如获取网页内容、图片、视频等资源。

GET请求的特点包括:

  • 参数暴露在URL中,存在安全隐患
  • 受到URL长度的限制,无法传输大量数据。
  • 具有幂等性,多次请求得到的结果是相同的。
  • 响应结果可以被浏览器缓存。

GET请求的适用场景包括:

  • 访问网页或获取网页上的信息。
  • 通过URL参数获取特定资源,如查询数据库中的记录。
  • 在浏览器回退时无害,因为GET请求不会修改服务器上的数据。

        需要注意的是,由于GET请求将参数暴露在URL中,因此不适合传输敏感信息,如密码或信用卡信息等。此外,由于URL长度限制,GET请求也不适合传输大量数据。‌

2.前后端如何使用Get交互?

        Get请求是将数据存放到请求行中进行的请求,没有请求体。因此我们前端发送的Get请求的请求参数有两种格式:Query参数Path参数

2.1.Query参数格式的Get请求

什么是Query参数格式?

形如:http://localhost:8080/user/article/page?page=1&pageSize=5

前端:

例如:使用Get请求回显文章分页查询

import request from '@/utils/request.js'

//文章列表查询
export const articleListService = (params)=>{
   return  request.get('/user/article/page',{params:params})
}
import {articleListService } from '@/api/userArticle.js'
// 回显文章列表
const articleList = async()=>{
    let params = {
        page: page.value,
        pageSize: pageSize.value
      
    }
    let result = await articleListService(params);
    // 渲染视图
    total.value = result.data.total;
    articles.value = result.data.records;
}
articleList();

后端:

27a5cd3cc45c43c0a9d9eefcb5a07b73.png

2.2.Path参数格式的Get请求

什么是Path参数格式?

形如:http://localhost:8080/user/1

前端:

例如:根据用户id查询用户信息

import request from '@/utils/request.js'

//用户查询
export const userQueryService = (userId)=>{
   return  request.get('/user/'+userId)
}

后端:

//用户查询
@GetMapping("/user/{userId}")
public Result<User> queryUser(@PathVariable Long userId) {
        log.info("查询用户:{}",userId);
        User user = userService.getById(userId);
        return Result.success(user);
}

对于路径参数,我们需要使用@PathVariable注解来获取路径参数

二.Post请求:

1.什么是Post请求?

        POST请求是一种HTTP方法,用于向服务器提交数据并创建新资源或修改现有资源。它通过将数据包含在请求体中而不是URL中,与GET请求相比,POST请求具有以下特点:

  • 数据安全性:POST请求将数据包含在请求体中,而不是直接放在URL中,因此数据对于用户来说是不可见的,这提高了数据的安全性,特别是当传输敏感信息(如密码、信用卡信息等)时。‌
  • 数据量限制:由于数据包含在请求体中,POST请求没有URL长度的限制,可以传输比GET请求更大的数据量,适合传输大量数据或上传文件等场景。
  • 幂等性:GET请求是幂等的,即多次请求相同的URL会得到相同的结果,不会对服务器产生副作用;而POST请求不是幂等的,多次提交可能会导致服务器状态的变化,如创建重复的资源或发送重复的消息。‌

用途:POST请求通常用于提交表单数据、上传文件或在服务器上执行某些操作。与GET请求不同,POST请求更适合用于需要创建或修改服务器上资源的场景。‌

2.前后端如何使用Post交互?

        Post请求是将数据存放到请求体中进行的请求。通常传递为一个对象即一个JSON串,后端服务器接收时必须使用@RequestBody注解来标识

前端:

例如:新增文章操作

import request from '@/utils/request.js'
//  发布文章
export const addArticleService = (articleData)=>{
    return  request.post('/admin/article',articleData)
 }
import {addArticleService} from '@/api/adminArticle.js'
//添加表单数据模型
const articleModel = ref({
    articleTitle: '',
    typeId: '',
    articleContent: ''
})
// 发布文章
const addArticle = async()=>{
    let result = await addArticleService(articleModel.value);
    ElMessage.success("发布成功");
    //回显
    articleList();
}

后端:

de5e93a9e554442c88948d84014a04d3.png

三.Put请求:

1.什么是Put请求?

        PUT 请求是一种HTTP方法,用于向服务器发送数据以更新已存在的资源。当你想要替换某个指定URL下的现有信息时,就使用PUT方法。它通常包含完整的资源内容,意味着服务器会在接收到请求后,完全用请求体中的数据替换原有资源。如果该资源不存在,一些服务器可能会返回404错误。PUT请求常用于更新用户资料、修改博客文章等场景。

2.前后端如何使用Put请求?

2.1.Body参数格式的Put请求

前端:

例如:修改文章

import request from '@/utils/request.js'
//  修改文章
export const updateArticleService = (articleData) =>{
    return request.put('/admin/article/',articleData);
}
import {updateArticleService} from '@/api/adminArticle.js'
// 修改文章
const updateArticle = async()=>{
    let articleData={
        articleId: articleId.value,
        articleTitle: articleModel.value.articleTitle,
        typeId: articleModel.value.typeId,
        articleContent: articleModel.value.articleContent
    }
    let result = await updateArticleService(articleData);
    ElMessage.success("修改成功");
    //回显
    articleList();
}

后端:

83b45168f9ce427d8e558a0343cb03a6.png

2.2.Path参数格式的Put请求

前端:

import request from '@/utils/request.js'
// 修改用户密码
export const userUpdatePasswordService = (userPassword) =>{
    return request.put('/user/'+userPassword);
}
import {userUpdatePasswordService} from '@/api/user.js'
const UpdatePassword = async()=>{

    let result = await userUpdatePasswordService(Password.value.newPassword);
    ElMessage.success(result.msg ? result.msg : '修改成功,请重新登录')
    
}

后端:

/**
     * 用户修改密码
     */
    @PutMapping("/{userPassword}")
    @CacheEvict(value = "userCache", allEntries = true)
    public Result updatePassword(@PathVariable("userPassword")
                                 @Length(min = 4, max = 16,message = ValidationConstant.PASSWORD_LENGTH) String userPassword,
                                 @RequestHeader("token") String token) {
        log.info("用户修改密码:{}", userPassword);
        Long userId = BaseContext.getCurrentId();
        userService.updatePassword(userPassword,userId);
        //删除redis中对应的token
        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
        operations.getOperations().delete(token);
        return Result.success();
    }

四.Delete请求:

1.什么是Delete请求?

        "Delete 请求"通常是指HTTP协议中的一个方法,用于从服务器上永久删除资源或数据。在Web开发中,当客户端想要移除某个特定的数据项(如数据库记录、文件等),就会向服务器发送一个DELETE HTTP请求到该资源的URL。这个操作是幂等的,意味着多次执行同样的DELETE请求不会改变资源的状态,除非服务器有特殊处理机制。

执行DELETE请求需要权限管理,因为它是对数据的不可逆操作。服务器接收到请求后,会验证用户身份并检查是否有权执行删除,并最终执行相应的删除操作,然后返回一个状态码来表示请求结果(例如204 No Content,表示成功删除,或404 Not Found,表示找不到请求的资源)。

2.前后端如何使用Delete请求?

        Delete请求的参数格式是Path参数,后端需要@PathVariable注解标识。

前端:

import request from '@/utils/request.js'
//  删除文章
export const deleteArticleService = (articleId)=>{
    return request.delete('/admin/article/'+articleId);
 }
// 删除文章
const deleteArticle = async(row)=>{
    let result = await deleteArticleService(row.articleId);
    ElMessage.success("删除成功");
    //回显
    clear();
    articleList();
}

后端:

/**
     * 删除文章
     * @return
     */
    @Log
    @Transactional(rollbackFor = Exception.class)
    @DeleteMapping("/{articleId}")
    @CacheEvict(value = "articleCache", allEntries = true)
    public Result deleteArticle(@PathVariable("articleId") Long articleId) {
        log.info("删除文章:{}",articleId);
        articleService.removeById(articleId);
        log.info("删除类型与文章关系:{}",articleId);
        articleTypeService.removeArticleTypeByArticleId(articleId);
        log.info("删除文章与作者关系:{}",articleId);
        adminArticleService.removeArticleAuthorByArticleId(articleId);
        log.info("删除文章与用户关系:{}",articleId);
        userarticleService.removeArticleUserByArticleId(articleId);
        return Result.success();
    }

 

 

### Java Web 前端请求后端 Controller 的处理流程 在 Java Web 开发中,从前端发送请求后端 Controller 接收并处理的过程是一个典型的分层架构体现。以下是详细的描述: #### 1. **前端发起 HTTP 请求** 前端通过 HTML 表单提交、JavaScript 或者现代框架(如 Vue.js)等方式向服务器发送 HTTP 请求。这些请求通常携带必要的参数或数据,例如 GET 请求中的查询字符串或者 POST 请求中的 JSON 数据。 ```javascript // 使用 JavaScript 发起 AJAX 请求的例子 fetch('/api/example', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key: 'value' }) }).then(response => response.json()) .catch(error => console.error('Error:', error)); ``` 此部分涉及的内容可参见[^2]。 --- #### 2. **Web 容器接收请求** 当用户的请求到达服务器时,Web 应用容器(如 Tomcat、Jetty 等)会解析该请求并将它路由至相应的控制器方法上。这一过程中,Spring MVC 框架提供了强大的支持机制来简化 URL 映射和参数绑定的工作。 --- #### 3. **Controller 层接收请求** Controller 是整个应用的第一道入口,在这里完成对客户端输入的初步验证以及将接收到的数据传递给 Service 层做进一步加工的任务。具体来说,`@RequestMapping`, `@PostMapping`, `@GetMapping` 注解用于定义哪些路径对应哪个处理器函数;而像 `@RequestBody` 和 `@RequestParam` 则帮助提取出实际需要使用的字段值。 ```java @RestController @RequestMapping("/example") public class ExampleController { @Autowired private ExampleService exampleService; @PostMapping("") public ResponseEntity<String> handlePostRequest(@RequestBody Map<String, Object> payload){ String result = exampleService.processData(payload); return new ResponseEntity<>(result, HttpStatus.OK); } } ``` 上述代码片段展示了如何利用 Spring Boot 中的标准方式构建 RESTful API 并响应来自外部系统的调用需求[^3]。 --- #### 4. **Service 层执行核心业务逻辑** 一旦进入到了服务级别,则意味着已经脱离了简单的展示层面转而专注于解决特定领域内的复杂计算问题或者是与其他子系统交互协作等工作内容。此时可能会涉及到事务管理、多线程并发控制等方面的知识点。 --- #### 5. **DAO/Repository 访问数据库或其他持久化资源** 如果当前操作还需要读写某些永久保存下来的信息的话,那么 DAO (Data Access Object) 就派上了用场——它们专门负责同底层存储引擎打交道从而获取所需记录或是更新现有状态等等动作的发生位置所在之处即为此处所指代之意也即是说在这里面包含了MyBatis这样的ORM工具是如何工作的相关内容介绍如下所示: ```xml <select id="selectUserById" parameterType="int" resultType="com.example.User"> SELECT * FROM users WHERE id=#{id}; </select> ``` 以上 XML 片段说明了一个基本的 SQL 查询语句是怎样被映射成对象形式以便于应用程序能够方便快捷地访问数据库表结构及其内部元素属性之间的关系网络图谱等内容[^1]. --- #### 总结 综上所述,从用户界面触发事件到最后得到反馈结果为止经历了多个阶段的变化发展过程形成了完整的闭环控制系统设计模式下的工作原理阐述完毕之后我们再来看几个延伸出来的思考方向供学习参考之用.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤姆大聪明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值