后端接口的查询方式

这篇具有很好参考价值的文章主要介绍了后端接口的查询方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

	在与前端对接过程中一直都会遇到一个问题,就是我们后端接口提供好了,自测也通过了,前端却说接口不通,当我们去排查时却发现大都不是接口不通,很多情况是前端使用的姿势不对,比如接口明明写的参数是放到ULR路径上,前端却传到了queryString上,接口明明写的是使用application/x-www-form-urlencoded格式,前端却传了application/json格式,所以本文总结常用的前后端传参数据格式,方便前端与后端开发人员更好的理解HTTP接口协议传参格式。
一、通过HTTP URL传参数

这种方式是最简单,也是最常用的传参方式,通常用于前端从后端获取数据,通过URL传参分为两种,一种是将参数放在URL路径上,另一种是将参数放在QueryString上,也就是URL的?后面

HTTP报文格式GET /user/1?userName=admin&arrays=a,b,c,d&ids=1&ids=2&ids=3&ids=4注意事项:1.路径 /user/1 上的1是通过URL路径传参数,这种RestFul风格的传参方式,有些前端会搞错
2.userName=admin 这种就是简单的QueryString传参,是最常见的,一般不会搞错
3.arrays=a,b,c,d 这种是通过QueryString传数组,其实就是使用,分隔4.ids=1&ids=2&ids=3&ids=4这种也是传数组参数的一种方式,一般用的比较少,容易出错

后端接口代码

我们使用SpringMVC框架编写接口,可以通过@PathVariable和@RequestParam两个注解来接收上面参数,主要有三种方法:
1.第一种是在方法上一个一个的来接收参数;
2.第二种是使用Map<String,Object>接收来参数;
3.第三种是封装个UserDTO对象来接收。

@GetMapping("/user/{id}")
    public UserDTO request(@PathVariable Long id, String userName, String[] arrays,@RequestParam List<Long> ids) {
        return UserDTO.builder().id(id).build();
    }

    @GetMapping("/user2/{id}")
    public Map<String,Object> user2(@PathVariable Long id,@RequestParam Map<String,Object> map)    {
        return map;
    }

    @GetMapping("/user3/{id}")
    public UserDTO user3(@PathVariable Long id, UserDTO user) {
        return user;
    }

    @Data
    public class UserDTO {
        private Long id;
        private String userName;
        private String[] arrays;
        private List<Long> ids;
    }

注意事项:
1.接收数组参数时可以使用String[]和List两种数据类型;
2.使用Map<String,Object> map接收参数时 Value的类型要是Object类型,并且要增加@RequestParam
3.使用User对象接收参数时不要增加@RequestParam注解

前端调用接口代码

前端对于这种传参数方式直接把所有参数拼接到URL上就好了

var request = new XMLHttpRequest();
        request.open('GET', 'http://localhost/user/1?userName=admin&arrays=a,b,c,d&ids=1&ids=2&ids=3&ids=4', true);
        request.responseType = 'json';
        request.onload = function () {
            var data = this.response;
            console.log(data);
        };
        request.send();

注意事项:

1.如果传的参数不是URL安全的需要进行URLEncode
2.POST、PUT、DELETE方法也是支持通过URL传参的
3.使用这种URL拼接不同浏览器支持的最大参数长度是不一样的,以下是不同浏览器支持参数的最大长度:

浏览器 URL长度限制
IE浏览器 2048字节
360极速浏览器 65536字节
Firefox(Browser) 2118字节
Safari(Browser) 80000字节
Opera(Browser) 190000字节
Google(chrome) 8182字节

二、通过HTTP Body传参数

通过HTTP Body传参数主要用于前端向服务端提交数据,如添加数据、修改数据、上传文件等等,通过Body传参常用的数据格式主要有以下3种:1.application/x-www-form-urlencoded 也就是表单提交,body报文中使用key=value拼接参数;
2.application/json 将数据转成JSON格式放在Body中;
3.multipart/form-data 用于文件上传。

HTTP报文格式

application/x-www-form-urlencoded格式报文:

POST /user3/1
Content-Type: application/x-www-form-urlencoded

userName=admin&arrays=a,b,c,d&ids=1&ids=2&ids=3&ids=4

application/json格式报文:

GET /user4/1
Content-Type: application/json

{
    "id": 1,
    "userName": "admin",
    "arrays": [
        "a",
        "b",
        "c",
        "d"
    ],
    "ids": [
        1,
        2,
        3,
        4
    ]
}

注意事项:
GET方法也可以通过Body传参数,这点很多人会觉得GET方法不能通过Body传参,不过只能传application/json,使用过elasticsearch应该知道,在搜索数据是就是通过GET方法传JSON数据的。

后端接口代码

在SpringMvc框架中接收Body的application/x-www-form-urlencoded类型参数和在URL的QueryString传参数是通用的,接收application/json需要使用@RequestBody注解。

@RequestMapping("/user3/{id}")
    public UserDTO user3(@PathVariable Long id, UserDTO user) {
        return user;
    }

    @RequestMapping("/user4/{id}")
    public UserDTO user4(@PathVariable Long id,@RequestBody UserDTO user) {
        return user;
    }

    @RequestMapping("/user5/{id}")
    public UserDTO user4(@PathVariable Long id,@RequestBody String user) {
        return JSONUtil.toBean(user,UserDTO.class);
    }

注意事项:@RequestBody 注解可以直接使用DTO来接收,也可以使用String来接收再手动转成DTO,这个方法在不知道要接收的数据有哪些字段时非常有用,可以将对方传的完整数据打印出来。

前端调用接口代码

function sendFormUrl() {
        var request = new XMLHttpRequest();
        request.open('POST', 'http://localhost/user3/1', true);
        request.responseType = 'json';
        request.onload = function () {
            console.log(this.response);
        };
        var formData = new FormData();
        formData.append('userName', "admin");
        formData.append('arrays', "a,b,c,d");
        formData.append('ids', "1");
        formData.append('ids', "2");
        formData.append('ids', "3");
        formData.append('ids', "4");
        request.send(formData);
    }
function sendJson() {
    var request = new XMLHttpRequest();
    request.open('POST', 'http://localhost/user4/1', true);
    request.responseType = 'json';
    request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
    request.onload = function () {
        console.log(this.response);
    };
    var body = {
        "userName": "admin",
        "arrays": [
            "a",
            "b",
            "c",
            "d"
        ],
        "ids": [
            1,
            2,
            3,
            4
        ]
    }
    request.send(JSON.stringify(body));
}

注意事项:multipart/form-data主要用于文件上传,可以参数我的另一篇文章: 《一个Demo搞定前后端大文件分片上传、断点续传、秒传》

三、通过Header传参数

通过Header传参主要用于一些通用的用户认证信息,比如常用的 Authentication: Bearer 、Cookie等

HTTP报文格式

GET /user7/1
Accept: application/json
userName : admin
Cookie: userName=admin;
arrays: a,b,c,d
ids:1
ids:2
ids:3
ids:4

注意事项

使用SpringMVC请求报java.lang.IllegalArgumentException: The HTTP header line [username : admin] does not conform to RFC 7230. The request has been rejected.因为userName这些自 定义请求头不符合RFC 7230标准所以被拒绝了,增加配置 reject-illegal-header: off可解决application.yml中增加:

server:
  port: 80
  tomcat:
    reject-illegal-header: off
后端接口代码

获取Header参数可以通过request.getHeader(header)依次获取,也可以通过@CookieValue,@RequestHeader来获取

@RequestMapping("/user6/{id}")
public User user6(@PathVariable Long id, HttpServletRequest request) {
    Enumeration<String> headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()){
        String header= headerNames.nextElement();
        log.info("{}->{}",header,request.getHeader(header));
    }
    return User.builder().id(id).build();
}

@RequestMapping("/user7/{id}")
public User user7(@PathVariable Long id, @CookieValue String userName, @RequestHeader String[] arrays, @RequestHeader List<Long> ids) {
    return User.builder().id(id).userName(userName).arrays(arrays).ids(ids).build();
}

前端调用接口代码

  function sendHeader() {
        var request = new XMLHttpRequest();
        request.open('GET', 'http://localhost/user7/1', true);
        request.responseType = 'json';
        request.setRequestHeader("arrays","a,b,c,d");
        request.setRequestHeader("ids","1");
        request.setRequestHeader("ids","2");
        request.setRequestHeader("ids","3");
        request.setRequestHeader("ids","4");
        request.onload = function () {
            console.log(this.response);
        };
        request.send();
    }

注意事项:Cookie是浏览器自动添加了,不需要通过request.setRequestHeader(“userName”,“admin”)添加

总结
本文总结了前后端通过HTTP接口协议传参的常用方法,并从HTTP协议、后端JAVA代码、前端JS代码演示每种参数的报文格式、后端获取方法和前端调用方法,当然还有一些更高级的传参方式,比如websocket、sse等基于HTTP的实时推送协议没有涉及到。文章来源地址https://www.toymoban.com/news/detail-721179.html

到了这里,关于后端接口的查询方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb

    1.1 今天在编写代码的时候,突然想实现一个目标:怎样能够在自己的网站上发一些文章  (lingyidianke.com) 1.2 参考自己之前写的一些资料,做一做试试,那么怎么做呢?首先,我们参考一下我们之前的资料,之前写过的大事件资料: 1.2.1 从项目结构上看,我们要创两个项目 1

    2024年02月19日
    浏览(43)
  • el-table实现纯前端查询列表(不走后端接口)

    2023.8.16今天我学习了如何使用前端进行数据的查询,有时候后端会直接返回全部的数据,这时候我们就需要用前端进行查找数据。 首先elementUI有自带el-table查询的组件: Element - The world\\\'s most popular Vue UI framework  我们发现在这段代码中,使用了 filter() 方法对 tableData 进行筛选。

    2024年02月12日
    浏览(24)
  • 微信服务端接口返回信息: “errcode“ : 44002/47001解决方式

    举例接口: 接口文档: 微信官方文档·小程序 / 手机号 / getPhoneNumber 错误44002 : 说明:44002表示POST请求体中没有数据,也就是没有传参 解决:将参数 code 放入请求体中(body)进行传参,而不是在URL中 例: 其中最后一行就是请求体的内容,并且需要将 code 放在其中进行传递 错

    2024年02月12日
    浏览(23)
  • Params、form-data、x-www-form-urlencoded、raw、binary的区别及后端接收方式

    1、Params 的请求参数会出现在url中,为key=value格式,后端可以用@RequestParam接收。  2、form-data的请求是在body中,为key=value格式,同时可以传文件,Content-Type为multipart/form-data,后端可以用@RequestParam接收。 3、x-www-form-urlencoded的请求是在body中, 为key=value格式,无法传文件,Con

    2024年02月12日
    浏览(36)
  • Debian查询硬件状态

    很早以前写过一个查询树霉派硬件状态的文章,用是Python写的一个小程序。里面用到了vcgencmd这个测温度的内部命令,但这个命令在debian里面没有,debian里只有lm_sensors的外部命令,需要安装:apt-get install lm_sensors -y,然后运行sensors就可以得到下面这些信息: 我想倒数第三行应

    2024年02月12日
    浏览(23)
  • 车辆保险查询API——查询车辆保险状态及保单信息

    近年来,车辆保险成为广大车主必须购买的一项重要保障。然而,如何查询车辆保险状态及保单信息却是许多车主面临的难题。随着技术的不断发展,API的出现为我们提供了一条便捷的解决之路。本文介绍的《车辆保险查询API——查询车辆保险状态及保单信息》便是一款实用

    2024年02月05日
    浏览(37)
  • 【设计模式】订单状态流传中的状态机与状态模式

    状态模式一般是用在对象内部的 状态流转 场景中,用来实现 状态机 。 什么是状态机呢? 状态机是对状态转移的抽象,由 事件 、 状态 、 动作 组成,事件有时候也被称为 转移事件 或者 转移 ,当事件触发时,可以将状态由一个状态变更为另一个状态,并执行动作。其中,

    2024年02月12日
    浏览(31)
  • Python助力华为设备接口状态查询

    部署了对应厂商的管理设备,通过SNMP协议推送拉取设备状态也可以获取到交换机信息,但是当设备的数量较多、又没有对应厂商的管理器如何应对 安装python python下载 安装pycharm pycharm下载 -导入项目(无git) 新建python空白文件 复制源码-修改参数 安装依赖组件(paramiko组件)

    2024年01月23日
    浏览(27)
  • ElasticSearch---查询es集群状态、分片、索引

    查看es集群状态: 如果?后面加上pretty,能让返回的json格式化。 加上?v的返回结果,如下: 解释如下: 查看es分片信息: 查看es分片信息,模糊匹配,比如匹配test: 返回信息如下: 解析如下: 查看状态为unassigned的es分片信息: 查看es索引 查看es所有索引: indices表示索引,是

    2024年02月02日
    浏览(33)
  • 小程序设计模式之状态模式实践-蓝牙配网_小程序 蓝牙状态模式

    */ disconnect() {} /** * 蓝牙连接成功 * @see UnConnectState */ connectSuccess() {} /** * 蓝牙连接失败 * @see UnConnectState */ connectFail() {} /** * 路由数据接收完成 * @see ReceivedState */ received() {} /** * 认证中 * @see AuthenticatingState */ authenticating() {} /** * 认证完成 * @see AuthenticatedState */ authenticated() {} /*

    2024年04月14日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包