springboot6:数据响应
admin
2024-01-21 19:45:41
0

一.返回值处理的原理

1.json数据的处理

①json数据的使用

  • 引入web后已经引入了json的依赖
    web场景自动引入了json场景
  org.springframework.bootspring-boot-starter-json2.3.4.RELEASEcompile
  • jackson.jar+@ResponseBody
  • 此时可自动给前端返回json数据

②json数据的使用的原理

  • 返回一个Person对象,在前端中是json字符串
  • 有返回值解析器(在方法返回值之后,利用返回值处理器returnvaluehandlers(15)处理)
    • 有返回值
    • 寻找哪个返回值处理器来处理返回值(返回值的值,返回值的类型)
      • 判断是否支持这种类型的返回值(如果支持,调用返回值处理器进行处理)
        • 支持哪些返回(返回值处理器)
        • ModelAndView,Model,View,ResponseEntity,…
        • RequestResponseBodyProcesser(其中会判断是否标了@ResponseBody注解)此时选择
    • 此时看 RequestResponseBodyProcesser返回值处理器如何将返回值People返回json数据?使用消息转换器messageConverters来写出
      • 内容协商(浏览器默认请求头方式要什么内容,就已经告诉后台要什么)权重优先接受什么
      • 从request域中获得acceptabletypes(浏览器能接受什么数据)
      • 然后获得producibletypes(服务器能返回什么类型数据)
      • 两者开始循环(循环哪一个匹配)决定浏览器接受json
      • 最终根据自身能力决定服务器能生产什出什么样内容类型的数据
      • 得到写出内容类型json
      • 判断所有的(循环)messageConverters(共有10个)消息转换器能支持people转换json(messageConverter里面有 能否读什么数据,能否写什么数据)
        • 0 支持返回值byte类型 1 String 2String 3Resource 4.5.6.
        • 7 mappingJackson2messageConverte(支持所有类型,无论什么都返回true)8.9.
          • 判断支不支持json数据
      • 用mappingJackson2messageConverte 中的write方法
        • 把people转(利用底层的jackson包)json然后写入response

2.内容协商流程MessageConverter(读写)

  • 功能(根据客户端接受能力不同,返回不同媒体类型的数据)
  • 加入依赖jackson和xml
  • 有时候返回jackson有时候返回xml(和请求头accpet字段有关)
    • accept = application/xml
    • accept = application/json
  • 执行的handler方法后有返回值后
  • 获取客户端支持的内容类型(获取客户端accept请求头字段)
  • 遍历循环所有当前系统的messageconverter,看谁支持操作这个对象(people)
  • 找到支持返回值为people类型的converter,把所有(第一次用)converter支持的媒体类型统计出来(json,xml数据)
  • 而客户端需要application/xml,服务端中能转换10[json,xml]
  • 两个for循环,客户端和服务端匹配需要和转换的类型(决定要用xml)
  • (第二次用)找到转换people到xml的messageConverter
  • 用messageConverter把people转换到xml
  • 注意:
    最佳匹配原则,如果浏览器中也传入多个可供返回的数据,浏览器中的 accept中的类型数据会有权重,xml 0.9 json 0.8 ,即在for循环中我们优先匹配到xml,然后才是json数据

方便内容协商

  • 可以开启基于请求参数的内容协商(默认是请求头)
  • 在配置文件中 配置一个 favor-parameter:true(开启参数的内容协商)
  • 在Http请求中加入参数 format=json
  • 为什么这个效果?
    • 在获取客户端支持的内容类型时通过参数获取
      • 在获取客户端支持的内容类型会有两个策略(默认为从请求头获取,然后返回为medietype)
      • 现在多了一个策略(从参数获取然后返回为mediatype)
      • 在获取时通过循环两个策略来获取浏览器支持的medietype(新加的策略优先)

3.自定义converter(利用请求头中的accept)

  • 解决问题:app发请求,返回自定义协议数据 (属性值1;属性值2;)
    [application/x-guigu] xxxConverter
  • 解决步骤
    • 添加自定义的messageConverter进系统底层
    • 系统底层统计出所有的messageConverter能操作哪些类型
    • 客户端内容协商
  • 注意:导入了jackson处理xml的包,xml的converter就回自动进来
    判断是否导了包,如果导了包,则创建jackon2xmlpresent
  • 自定义
    • 在webmvcConfigure的入口中添加配置即可(重写方法)
      • 先写一个converter类继承httpmessageConverter并重写里面的方法
        • canwrite方法直接返回 true(值是否为person类型)
        • getsupportMediatypes() 方法返回自定义类型集合(application/x-guigu)
        • write() 自定义数据协议的写出 将形参的的person的每个属性用;分割拼接为字符串,利用形参的outputMessage(response)来将字符串写出到response中
      • 重写extendMessageConverters方法,在其中converters.add(我们自己创建的converter)

4.自定义协商策略(利用参数内容协商)

  • 策略中只规定了两者(xml和json)
  • 在webmvcConfigure的入口中添加配置即可(重写方法)
    • 重写configureContentNegotiation(自定义内容协商策略,只剩自己的了)
      • 创建一个新的参数内容协商策略(也可以创建一个请求头内容协商策略)
      • 指定该策略支持解析哪个参数对应的哪些媒体类型
        (“json”,mediaType.application_json)
        (“gg”,mediaType.parseMediaType(“application/x-aguigu”))
      • 将该策略配置到configurer.stratregeies()中
    • 以前的内容协商策略(基于参数的,基于请求头的)
    • 现在重新定义了基于参数的内容协商策略
  • 如果我们自定义添加功能,可能覆盖默认功能。需要添加默认行为

相关内容

热门资讯

全球开园规模最大乐高乐园在上海... 作为全球开园规模最大的乐高乐园,上海乐高乐园5日正式开园。 业界人士认为,国际知名主题乐园相继加码布...
拜年的来历? 拜年的来历?那你是卖。... 那你是卖。 展开 传说远古时代有一种叫“年”的怪物,每逢腊月三十...
工作压力有利于成长的事例 工作压力有利于成长的事例 把李嘉诚的传记,推荐给您,我以前看过一多半,很有感触,希望可以帮助到您
苏武牧羊北海边的北海指的是哪里... 苏武牧羊北海边的北海指的是哪里?贝加尔湖,中国古代称为北海,位于俄罗斯西伯利亚南部简介贝加尔湖是亚欧...
购物狂电影的最后一幕那个弃婴 ... 购物狂电影的最后一幕那个弃婴 是怎么回事?是主角的小时候吧,讲她为什么是购物狂,因为她小时候被抛弃在...
方法决定成败 方法决定成败没错,方法决定成败,态度决定一切,心态决定效率。送你这几句名言,以资鼓励。
霞秋的意思?想表达晚年幸福? 霞秋的意思?想表达晚年幸福?霞秋的意思?想表达晚年幸福?... 霞秋的意思?想表达晚年幸福? 展...
关于“欣赏”的名言和事例 关于“欣赏”的名言和事例19世纪末,美国西部的密苏里有一个坏孩子,他偷偷地向邻居家的窗户扔石头,还把...
自己发的语音总是不敢去听,怎么... 自己发的语音总是不敢去听,怎么让自己勇敢去听呢?怎么说呢,其实你录下来的声音就是别人听到的,只是因为...
格物致知的真正意义是什么? 格物致知的真正意义是什么?提示:可以从文章内容中直接找到答案。? 参考答案:格物致知的真正...
醒悟中心卢卫斌老师谈强迫症的治... 醒悟中心卢卫斌老师谈强迫症的治疗为什么需要禅修练习  强迫症是一种复合型心理障碍,有其独特的障碍模型...
宣化那有好玩的地方 宣化那有好玩的地方有吗? 「莫等闲,白了少年头。空b切」
水深水浅东西涧 云去云来远近山... 水深水浅东西涧 云去云来远近山是什么意思  涧水或东或西时深时浅,山峦亦近云雾盘桓.  作品原文  ...
我的妹妹不可能那么可爱 讲的是... 我的妹妹不可能那么可爱 讲的是什么?就是有一个长的很可爱明明可以很受欢迎【也确实很受欢迎】的妹纸爱好...
童话诗有什么特点 童话诗有什么特点 童话诗(Fairy tale poem),故事诗的一种,现代诗的一种体裁。是以童话...
一块姜在挡车的是什么歌 一块姜在挡车的是什么歌一块姜在挡车的是什么歌感应:泳儿的歌我听的不多,但这首歌尤其的熟悉是一个人生活...
MP3出问题 MP3出问题我选其他歌,它都会跳回去原来那首歌,有时候还更厉害,显示这首歌的文件名字,唱另外一首歌出...
在金庸的设定里,一个武林高手可... 在金庸的设定里,一个武林高手可以打赢100个人已经是极限,但500个武林高手一定打不过1000名普第...
唐诗人张九龄"海上生明月天涯天... 唐诗人张九龄"海上生明月天涯天涯共此时"一诗全文?望月汪渗怀远 唐· 张九龄海上生明月,天涯共此时。...
暗里着迷歌曲深意? 暗里着迷歌曲深意?歌曲《暗里着迷》是刘德华在1993年发行的一首歌,他一直称这一首歌是自己半生中最重...