完整的url post请求方法(借助反射实现)

本文介绍如何在老旧的Java项目中使用反射机制封装完整的POST请求方法。通过反射获取对象属性作为URL参数,然后以键值对形式构造请求参数,并提供了测试用例。该方法对于需要进行POST请求的场景具有一定的实用性。

系列文章目录

在公司的某些较为老旧的项目中,选择的依旧是get的提交url方式,但是如今大多都是post提交方式,而旧项目中没有封装完整的post提交方法,或者说难以完成对接。而本文章就是为了给读者提供一种封装完成的post提交方发,加上本文采用的反射机制,相信更能满足广大读者的需求。



前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、代码

1.通过反射获取属性名称对应的url参数

主方法generateUrlByModel(Model model),借助反射获取传进的model对象的属性名称,然后遍历属性名称获取对象对应的属性值,然后将其按照 key=value& 键值对方式封装起来,然后封装完毕之后最后肯定多余一个&,将其删除即可

private static String generateUrlByModel(Object model){
    StringBuffer url = new StringBuffer();
    String[] fieldNames = getFiledName(model);						//获取属性名
    for(int j=0 ; j<fieldNames.length ; j++){    							 
        String name = fieldNames[j];    										
        Object value = getFieldValueByName(name,model);		//获取对应的属性值
        if(value!=null){
            url.append(name+"="+value+"&");								//属性名和值封装成键值对key=value&格式
        }
    }
    url.deleteCharAt(url.length()-1);											//处理多余的一个&
    return url.toString();
}
/**
 * 反射获取属性名数组
 * */
private static String[] getFiledName(Object o){
    Field[] fields=o.getClass().getDeclaredFields();	//通过反射属性名称(例:private java.lang.String group.Person.name,...)
    //此时的属性名称是完整的属性名称,需要对其进行处理(读者可测试一下)
    String[] fieldNames=new String[fields.length];	//定义一个长度相同的数组,用来存储对象的属性名(name,...)
    for(int i=0;i<fields.length;i++){
        System.out.println(fields[i].getType());			
        fieldNames[i]=fields[i].getName();					//对完整属性名处理获取最后需要的属性名(private java.lang.String group.Person.name -> name)
    }
    return fieldNames;
/**
 * 通过属性名获取值
 * @param fieldName
 * @param o
 * @return
 */
private static Object getFieldValueByName(String fieldName, Object o) {
    try {
        String firstLetter = fieldName.substring(0, 1).toUpperCase();			//获取属性的第一个字母并写成大写(例:name-》N)
        String getter = "get" + firstLetter + fieldName.substring(1);			//封装属性对应方法(get + N + ame = getName)
        Method method = o.getClass().getMethod(getter, new Class[] {});//获取完整方法():(getName->public java.lang.String group.Person.getName())
        Object value = method.invoke(o, new Object[] {});							//借助反射和完整方法获取对应的值
        return value;
    } catch (Exception e) {
        return null;
    }
}

2.通过post方式访问

代码如下(示例):
其中,Url格式为:(协议+ip+端口+requestMappingUr)http://192.168.12.226:8090/tagcenter/tagCustListQuery
param格式为:key1=value1&key2=value2&…&keyn=valuen

public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }

该处使用的url网络请求的数据。

3.测试用例

//需要读者自己封装get、set方式。若maven则可直接使用
public class Csdn{
    private String spm;
    private String others;
    }
Function:{
public static void main(String[] args) {
        Csdn csdn= new Csdn();
        csdn.setSpm("1001.2101.3001.5113");
        String param= generateUrlByModel(csdn);
        String baseUrl= "https://blog.youkuaiyun.com/JasonLee97";
        String resp = sendPost(baseUrl,param);
    }
    
    }

总结

注:本文仅供参考,若要用到实际项目中需小心测试(可能需要对url进行EnCode)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值