热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Netty获取Http参数反射执行方法参数映射

项目地址:easy-plat:学习springcore,netty开发高性能框架(gitee.com)获取参数名称的一种方式参数映射:

项目地址:easy-plat: 学习spring core ,netty开发高性能框架 (gitee.com)

获取参数名称的一种方式参数映射:

String[] parameterNames =new LocalVariableTableParameterNameDiscoverer().getParameterNames(method);

反射映射参数:

/*** 构造一个请求参数对象*/
public class RequestParam {//是否是参数体private boolean isBody;//参数体,一个参数名独占一行private List> data;public boolean isBody() {return isBody;}public void setBody(boolean body) {isBody = body;}public List> getData() {return data;}public void setData(List> data) {this.data = data;}
}

解析原始参数(解决其他版本无法获取报文体参数):

解决这篇文章无法获取POST报文体参数:(1条消息) Netty4 HTTP请求参数解析(GET, POST)_Mrs陶的博客-CSDN博客_netty获取http参数

/*** HTTP请求参数解析器, 支持GET, POST*/
public class RequestParser {private FullHttpRequest fullReq;/*** 构造一个解析器** &#64;param req*/public RequestParser(FullHttpRequest req) {this.fullReq &#61; req;}/*** 解析请求参数** &#64;return 包含所有请求参数的键值对, 如果没有参数, 则返回空Map* &#64;throws RuntimeException* &#64;throws IOException*/public RequestParam parse() throws Exception, IOException {HttpMethod method &#61; fullReq.method();RequestParam param &#61; new RequestParam();Map parmMap &#61; new HashMap<>();List> paramList &#61; new ArrayList<>();if (HttpMethod.GET &#61;&#61; method) {param.setBody(false);// 是GET请求QueryStringDecoder decoder &#61; new QueryStringDecoder(fullReq.uri());decoder.parameters().entrySet().forEach(entry -> {// entry.getValue()是一个List, 只取第一个元素parmMap.put(entry.getKey(), entry.getValue().get(0));paramList.add(parmMap);});} else if (HttpMethod.POST &#61;&#61; method) {// 是POST请求String content &#61; fullReq.content().toString(Charset.defaultCharset());JSONObject jsonObject &#61; JSONUtil.parseObj(content);jsonObject.forEach((key, value) -> {parmMap.put(key, value);});param.setBody(true);paramList.add(parmMap);} else {// 不支持其它方法throw new RuntimeException(""); // 这是个自定义的异常, 可删掉这一行}param.setData(paramList);return param;}
}

将参数映射成反射所需要的Object[]数组参数&#xff1a;

/*** 参数映射*/public static Object[] mappingArgs(Method method, RequestParam requestParam) {// 判断params不为空Class[] parameterTypes &#61; method.getParameterTypes();Object[] args &#61; new Object[parameterTypes.length];//是否是json报文体String[] parameterNames &#61; new LocalVariableTableParameterNameDiscoverer().getParameterNames(method);if (requestParam.isBody()) {Map param &#61; requestParam.getData().get(0);List list &#61; new ArrayList<>();//参数中多个对象映射param.forEach((k, v) -> {ParamVo paramVo &#61; new ParamVo();paramVo.setName(k);paramVo.setValue(v);list.add(paramVo);});Class[] paramTypes &#61; method.getParameterTypes();for (int i &#61; 0; i paramType &#61; paramTypes[i];Object value &#61; list.get(i1).getValue();String jsonStr &#61; JSONUtil.toJsonStr(value.toString());// 将json参数映射成对象System.out.println(paramType);//判断paramType是否为字符串类型Object obj &#61; null;if (paramType &#61;&#61; String.class || paramType &#61;&#61; Integer.class || paramType &#61;&#61; Long.class || paramType &#61;&#61; Double.class || paramType &#61;&#61; Float.class || paramType &#61;&#61; Boolean.class) {obj &#61; jsonStr;} else {if (paramType&#61;&#61; Date.class){obj &#61; jsonStr;}else if (paramType&#61;&#61; List.class){obj &#61; JSONUtil.toList(jsonStr, paramType);}else if (paramType&#61;&#61; Map.class){obj &#61; JSONUtil.toBean(jsonStr, paramType);}else {obj &#61; JSONUtil.toBean(jsonStr, paramType);}}args[i] &#61; obj;}}}} else {List> data &#61; requestParam.getData();for (int i &#61; 0; i map &#61; data.get(j);if (map.containsKey(parameterNames[i])) {Object o &#61; map.get(parameterName);args[i] &#61; o;}}}}return args;}

参数包装类&#xff1a;

public class ParamVo {private String name;private Object value;public Object getValue() {return value;}public void setValue(Object value) {this.value &#61; value;}public String getName() {return name;}public void setName(String name) {this.name &#61; name;}
}

执行反射方法&#xff1a;

String content &#61; (String) method.invoke&#xff08;object, args);


推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
author-avatar
he2134
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有