系列文章目录
在公司的某些较为老旧的项目中,选择的依旧是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)
本文介绍如何在老旧的Java项目中使用反射机制封装完整的POST请求方法。通过反射获取对象属性作为URL参数,然后以键值对形式构造请求参数,并提供了测试用例。该方法对于需要进行POST请求的场景具有一定的实用性。
173万+

被折叠的 条评论
为什么被折叠?



