前端发请求的常用方式

前后端交互:Content-Type详解与应用

 一般我用的前后端交互有两种方式,主要通过Content-Type来区分

1.application/x-www-form-urlencoded

这种方式是需要你将要传递的参数放在data对象里,然后在传输的时候浏览器自动将data里面的属性转为key1=value1&key2=value2这样的键值对,java在接收的时候如果用对象接收,就会自动根据属性名,将键值对封装成java对象

也可以用注解@RequestParam 用于接收application/x-www-form-urlencoded格式的请求参数。使用@RequestParam注解的参数可以自动从请求参数中获取指定的参数值,也会自动根据属性名,将键值对封装成java对象

uni.request({
    header:{
        'Content-Type': 'application/x-www-form-urlencoded'
        ,...},
    data:{
        key1:value1,
        key2:value2,
        ....},
    //其他参数
     ...
})

2.application/json

这种方式也是将要传递的参数放在data对象里,然后在传输的时候浏览器自动将data里面的属性转为json字符串传输给后端,然后后端用@RequestBody接收,接收的时候如果用对象接收,也会自动根据属性名,将键值对封装成java对象

补充:

前端json对象,json字符串 

后端java对象,json字符串

前后端之间用json字符串传输,字符串和对象互相转化具体看这篇博客:

十分钟搞懂JSON(JSON对象---JSON字符串---对象 之间的区别)_json对象和json字符串的区别_待到春暖花开时的博客-优快云博客

前端json对象,json字符串  详解:

https://www.cnblogs.com/agansj/p/9053547.html

uni.request({
    header:{
        'Content-Type': 'application/json'
        ,...},
    data:{
        key1:value1,
        key2:value2,
        ....},
    //其他参数
     ...
})

举例:向服务器发送数据 {a:"a",  b:"b"}

如果头的格式是application/x-www-form-urlencoded,  则浏览器根据content-type自动转为ajax.send("a='a'&b='b'");

如果头的格式是application/json,  则浏览器根据content-type自动转为ajax.send(JSON.stringify(data));

还有x-www-form-urlencoded对于前端发送时会序列化,而在java接收时却不反序列化,因为数据通常存储在HttpServletRequest对象中。你可以通过HttpServletRequest对象的方法来获取请求参数,这些参数已经被解析为字符串,并且已经根据键值对进行了分组。因此,在接收application/x-www-form-urlencoded请求时,不需要进行反序列化操作,因为参数已经以字符串的形式存储在HttpServletRequest对象中

而在接收application/json请求时,Java会将请求参数反序列化为Java对象。这是因为application/json包含了一个JSON对象,需要将其转换为Java对象进行进一步的处理。

所以在使用@JsonSerialize和@JsonDeserialize时要注意(这俩注解一般用于在传输时自动处理一些数据,如将前端传递的‘男’‘女’字符自动转为‘0’‘1’,在返回数据时自动将‘0’‘1’自动转为‘男’‘女’)

这俩注解只有在序列化和反序列化时才会触发,即在x-www-form-urlencoded方式下发送数据时@JsonDeserialize中的自定义处理类不会被触发,而在application/json方式下会触发

回传数据时用@ResponseBody注解,会序列化,所以两种方式都会触发@JsonSerialize

使用示例:

这是在实体类的属性上加的注解,调用自定义的处理类HrOaJsonDeserializer

@JsonDeserialize(using = HrOaJsonDeserializer.class)
    //附件信息列表
    private List<HrOaAttacheFileDTO> fileInfoList;

自定义处理类HrOaJsonDeserializer(注意继承JsonDeserializer抽象类,然后重写deserialize方法)

p.getText()就是要处理的内容

public class HrOaJsonDeserializer extends JsonDeserializer {
    @Override
    public List<HrOaAttacheFileDTO> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        System.out.println("4444444444444444444444444444nj");
        if (ObjectUtils.isEmpty(p)) {
            return null;
        }
        System.out.println(JSON.parse(p.getText()));
        return (List<HrOaAttacheFileDTO>)JSON.parse(p.getText()) ;
    }
}

补充:Content-Type 值出了上述两种还有,multipart/form-data和text/plain方式

    multipart/form-data: 主要用于文件上传,将文件转成二进制数据进行传输,不涉及转码。
    text/plain: 是使用纯文本进行传输,平时用的很少

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值