IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> APPLICATION_FORM TO APPLICATION_JSON -> 正文阅读

[网络协议]APPLICATION_FORM TO APPLICATION_JSON

问题描述:we wanna shift application/x-www-form-urlencoded to application/json.

前端上送的报文格式为POST+application/x-www-form-urlencoded,后端接受的格式为POST+application/json,前端保持不变的情况下,后端需要将form格式的报文转换成json格式报文,并且在controller中用@RequestBody接受前端form表单中的数据

解决方法:实现自定义messageConvertor 后端可以使用@RequesetBody接收请求

1.使用环境

jdk 1.8

springboot 2.x

springmvc

2.参考代码

? ? ? ? 2.1 编写自定义messageConvertor 通过FormHttpMessageConverter对象接收前端的报文,并得到前端form表单中的key-value的map对象,通过JSONOject 将map转json

package com.lkyl.httpConfig;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.lkyl.base.BaseRequest;
import com.lkyl.base.Header;
import com.lkyl.exception.CommonCode;
import com.lkyl.exception.CommonException;
import com.lkyl.util.BusinessContext;
import com.lkyl.util.ContextUtil;
import com.lkyl.util.DESTool;
import com.lkyl.util.ObjectUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.io.Serializable;
import java.util.Map;

public class BaseRequestMessageConverter extends AbstractHttpMessageConverter<BaseRequest> {

    private static final FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
    private static final ObjectMapper mapper = new ObjectMapper();


    /**
     * 如果@RequestBody 对应的bean是BaseRequest的子类,则处理,否则不做处理
     * @param aClass
     * @return
     */
    @Override
    protected boolean supports(Class<?> aClass) {

        return aClass.getSuperclass() == BaseRequest.class;
    }

    @Override
    protected BaseRequest<Serializable> readInternal(Class<? extends BaseRequest> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
        String body = null;
        Map<String, String> vals;
        JSONObject jsonObject = null;
        vals = formHttpMessageConverter.read(null, httpInputMessage).toSingleValueMap();
        try{
//            JSONObject.toJSONString(request.getParameterMap());

            String jsonStr = JSONObject.toJSONString(vals);
            if(!StringUtils.isEmpty(jsonStr)){
                jsonStr = jsonStr.replaceAll("\\[", "").replaceAll("\\]", "");
            }
            jsonObject = JSON.parseObject(jsonStr);
        }catch(Exception e){

        }

        if(ObjectUtils.isNotEmpty(jsonObject)) {
            JSONObject json = new JSONObject();
            json.put("header", jsonObject);
            //des解密请求报文
            String desKey = ContextUtil.getBean(Environment.class).getProperty("centerBank.desKey");
            if (ObjectUtils.isNotEmpty(jsonObject.get("data"))) {

                String dataRaw = jsonObject.get("data").toString();
                String data = null;
                try {
                    data = DESTool.decrypt(desKey, dataRaw);
                } catch (Exception e) {
                    throw new CommonException(CommonCode.EXCEPTION, "decode error");
                }
                JSONObject jsonData = JSON.parseObject(data);
                jsonObject.put("transID", jsonData.get("transID"));
                for (Map.Entry<String, Object> entry : jsonData.entrySet()) {
                    if (jsonData.get(entry.getKey()).toString().contains("|")) {
                        jsonData.put(entry.getKey(), JSON.parseObject(this.convert2JsonStr(jsonData.get(entry.getKey()).toString())));
                    }
                }
                json.put("body", jsonData);
                body = json.toJSONString();
            } else {
                body = "{}";
            }

        }

        BusinessContext businessContext = new BusinessContext();
        businessContext.setHeader(ObjectUtils.JSONObject2Bean(JSON.parseObject(jsonObject.toString()), Header.class));
        ContextUtil.setBusinessContext(businessContext);

        return mapper.readValue(body, aClass);
    }

    @Override
    protected void writeInternal(BaseRequest serializableBaseRequest, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {

    }

    private String convert2JsonStr(String str){
        if(StringUtils.isEmpty(str)){
            return "{}";
        }
        String [] kv = str.split("\\|");
        String [] itemKv;
        StringBuilder sb = new StringBuilder("{");
        for(String item : kv){
            itemKv = item.split(":");
            sb.append("\""+itemKv[0] +"\":\""+itemKv[1]+"\",");
        }
        return sb.substring(0, sb.length()-1) + "}";
    }

}

? ? ? ? 2.2 将自定义的messageConvertor注册到mvc中的messageConvertor列表中

package com.lkyl.httpConfig;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.List;

@Configuration
public class HttpForm2JsonConverterConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(converter());
    }

    private BaseRequestMessageConverter converter() {
        BaseRequestMessageConverter converter = new BaseRequestMessageConverter();
        MediaType mediaType = new MediaType("application", "x-www-form-urlencoded", Charset.forName("UTF-8"));
        converter.setSupportedMediaTypes(Arrays.asList(mediaType));
        return converter;
    }
}

? ? ? ? 2.3 controller 使用@RequestBody接受请求参数

????????

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 16:27:45  更:2022-01-03 16:29:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:36:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码