程序员在上海之三(代码片段)

IT丶小农民 IT丶小农民     2022-11-21     594

关键词:

今天在公司的任务是完成定时任务激活老用户发短息功能上线,其实这个功能在昨天就已经完成了,由于运维同事在发布的时候漏掉了,导致今天在查看日志的时候没有看到 ,有点出乎意料,我的代码明明很简洁明了功能明确!为什么会有这样的问题?只好查询版本才发现线上没有发布我的最新代码,好吧~问题找到了,现在有一个两全的方法,我们的admin系统有一个手动走定时任务的功能,花了几分钟添加上去测试OK~下午上线。

工作描述基本结束了,下面是个人今天的技术分享:我们都知道网上有很多页面可以根据身份证查询归属地、性别、出生日期等;根据手机号码查询归属地。可是具体它是怎么实现的呢?作为一个程序员,知识和经验是在项目和平时的学习中积累的,下面是一个关于查询身份证信息的介绍和具体实现代码:

-------------------------------说明文档---------------------------------------------

接口地址: http://apis.juhe.cn/idcard/index 支持格式: json/xml 请求方式: get 请求示例: http://apis.juhe.cn/idcard/index?key=您申请的KEY&cardno=330326198903081211 请求参数说明:
  名称 类型 必填 说明
  cardno string Y 身份证号码
  dtype string Y 返回数据格式:json或xml,默认json
  key string Y 你申请的key
返回参数说明:
  名称 类型 说明
        error_code  int                                 返回码
         reason  string                                 返回说明
         data  -                                 返回结果集
  area  string                                 地区
  sex  string                                 性别
  birthday  string                                 出生日期
JSON返回示例:
"resultcode":"200",
"reason":"成功的返回",
"result":
	"area":"浙江省温州市平阳县",
	"sex":"男",
	"birthday":"1989年03月08日"

XML返回示例:
<root>
<resultcode>200</resultcode>
<reason>成功的返回</reason>
<result>
	<area>浙江省温州市平阳县</area>
	<sex>男</sex>
	<birthday>1989年03月08日</birthday>
</result>
</root>
可能写到这里很多做过 聚合数据的朋友都已经知道了,这是聚合数据Juhe.cn提供的API接口,如果你已 经了解可以跳过也可以继续看下去~每一个小的学习分享都是一份进步。


-------------------------------------------代码实现---------------------------------------------------------------------

当然这里,聚合API有提供具体Demo,你可以有时间去参考,也可以学习我的,我的代码更为细致并且讲解比较细致,可以参考学习:直接在百度输入“聚合数据”即可:


这里有很多免费的API接口提供我们的调用查询,下面我自己写了查询身份证信息查询、身份证挂失查询、身份证泄漏查询的三个接口。完整代码如下:记得把包名换掉哦~

package com.mo9.utils.juheApi;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;


import net.sf.json.JSONObject;
 
/**
*身份证查询调用示例代码 - 聚合数据
*在线接口文档:http://www.juhe.cn/docs/38
**/
 
public class JuheUtils 
	private static Logger logger = Logger.getLogger(JuheUtils.class);
    public static final String DEF_CHATSET = "UTF-8";
    public static final int DEF_CONN_TIMEOUT = 30000;
    public static final int DEF_READ_TIMEOUT = 30000;
    public static String userAgent =  "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";
 
    //配置您申请的KEY
    public static final String APPKEY ="***********************";
    //身份证号码
    public static final String IDCARD = "***************";
    //返回数据类型 json/xml 默认json
    public static final String DTYPE = "json";
    public static void main(String[] args) 
    	String result = queryIdcardInfo();
    <span style="white-space:pre">	</span>logger.info("===result==="+result);
	
 
    //1.身份证信息查询
    public static String  queryIdcardInfo()
        String result =null;
        String url ="http://apis.juhe.cn/idcard/index";//请求接口地址
        Map<String,Object> params = new HashMap<String,Object>();//请求参数
            params.put("cardno",IDCARD);//身份证号码
            params.put("dtype",DTYPE);//返回数据格式:json或xml,默认json
            params.put("key",APPKEY);//你申请的key
 
        try 
            result =net(url, params, "GET");
            JSONObject object = JSONObject.fromObject(result);
            if(object.getInt("error_code")==0)
               logger.info(object.get("result"));
            else
               logger.info(object.get("error_code")+":"+object.get("reason"));
            
         catch (Exception e) 
            e.printStackTrace();
        
        return result;
    
 
    //2.身份证泄漏信息查询
    public static String getQueryIdcardLeakInfo()
        String result =null;
        String url ="http://apis.juhe.cn/idcard/leak";//请求接口地址
        Map<String,Object> params = new HashMap<String,Object>();//请求参数
        params.put("cardno",IDCARD);//身份证号码
        params.put("dtype",DTYPE);//返回数据格式:json或xml,默认json
        params.put("key",APPKEY);//你申请的key
 
        try 
            result =net(url, params, "GET");
            JSONObject object = JSONObject.fromObject(result);
            if(object.getInt("error_code")==0)
               logger.info(object.get("result"));
            else
               logger.info(object.get("error_code")+":"+object.get("reason"));
            
         catch (Exception e) 
            e.printStackTrace();
        
        
        return result;
    
 
    //3.身份证挂失信息查询
    public static String getQueryIdcardLossInfo()
        String result =null;
        String url ="http://apis.juhe.cn/idcard/loss";//请求接口地址
        Map<String,Object> params = new HashMap<String,Object>();//请求参数
        params.put("cardno",IDCARD);//身份证号码
        params.put("dtype",DTYPE);//返回数据格式:json或xml,默认json
        params.put("key",APPKEY);//你申请的key
 
        try 
            result =net(url, params, "GET");
            JSONObject object = JSONObject.fromObject(result);
            if(object.getInt("error_code")==0)
               logger.info(object.get("result"));
            else
               logger.info(object.get("error_code")+":"+object.get("reason"));
            
         catch (Exception e) 
            e.printStackTrace();
        
        return result;
    
 
 
 
    /**
     *
     * @param strUrl 请求地址
     * @param params 请求参数
     * @param method 请求方法
     * @return  网络请求字符串
     * @throws Exception
     */
    public static String net(String strUrl, Map<String,Object> params,String method) throws Exception 
        HttpURLConnection conn = null;
        BufferedReader reader = null;
        String rs = null;
        try 
            StringBuffer sb = new StringBuffer();
            if(method==null || method.equals("GET"))
                strUrl = strUrl+"?"+urlencode(params);
            
            URL url = new URL(strUrl);
            conn = (HttpURLConnection) url.openConnection();
            if(method==null || method.equals("GET"))
                conn.setRequestMethod("GET");
            else
                conn.setRequestMethod("POST");
                conn.setDoOutput(true);
            
            conn.setRequestProperty("User-agent", userAgent);
            conn.setUseCaches(false);
            conn.setConnectTimeout(DEF_CONN_TIMEOUT);
            conn.setReadTimeout(DEF_READ_TIMEOUT);
            conn.setInstanceFollowRedirects(false);
            conn.connect();
            if (params!= null && method.equals("POST")) 
                try 
                    DataOutputStream out = new DataOutputStream(conn.getOutputStream());
                        out.writeBytes(urlencode(params));
                 catch (Exception e) 
                    // TODO: handle exception
                
            
            InputStream is = conn.getInputStream();
            reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));
            String strRead = null;
            while ((strRead = reader.readLine()) != null) 
                sb.append(strRead);
            
            rs = sb.toString();
         catch (IOException e) 
            e.printStackTrace();
         finally 
            if (reader != null) 
                reader.close();
            
            if (conn != null) 
                conn.disconnect();
            
        
        return rs;
    
 
    //将map型转为请求参数型
    public static String urlencode(Map<String,Object>data) 
        StringBuilder sb = new StringBuilder();
        for (Map.Entry i : data.entrySet()) 
            try 
                sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&");
             catch (UnsupportedEncodingException e) 
                e.printStackTrace();
            
        
        return sb.toString();
    

上面代码拷贝之后引入相应的jar,我通过maven直接下载的,直接运行结果如下,考虑隐私问题部分已经遮挡不过可以参考说明文档Json返回数据。XML格式你可以自己更改测试:


这里我们可以看到查询返回成功,如果身份证号码或者格式等输入参数有误会有对应的错误码信息。具体可以自己参考聚合数据API文档。

我现在随便输入一个错误的身份证号码,看下查询结果:

203803:身份证校验位不正确
===result==="resultcode":"203","reason":"身份证校验位不正确","result":"area":"安徽省合肥市","sex":"男","birthday":"1996年03月10日","verify":"该身份证号校验位不正确","error_code":203803

既然出现了错误码,就顺手把错误码的参考字典贴出来吧~

通过上图的错误码我们知道是身份证有误。具体其他细节可以自己摸索~所有功能都已经实现了,具体代码方面我已经注释和编码已经很明确了,大家可以自己参考,不过具体主要部分我还是总结下:

1、APPKEY是需要个人到聚合数据申请的,否则查询不到。

2、三个查询接口,不同在于API提供的HTTP接口,有人会问为什么不用HTTPS,后续会改为HTTPS,现在用的MD5加密签名来保证信息一致性。

3、net方法发送HTTP请求。

4、如果你用心了你会发现这里的代码写法非常漂亮,有效的避免了重构一书所说的冗余代码、过长参数、方法命名让人疑惑等等的问题。比如你看下将map型转为请求参数型提炼为一个方法,后面可以供其他方法调用,小的功能分割出来有利于代码的管理并且功能清晰,代码整洁~哦拉拉,今天就到这里啦~

有什么问题或者错误欢迎指出~



程序员在上海之四(代码片段)

今天主要分享下前段时间做微信二维码的一些问题,我们都知道二维码的生产可以放到java后端,也可以直接使用jQuery插件jquery.qrcode.min.js来简单实现。下面简单分享下两种方式:   1、java代码生产二维码。      ... 查看详情

程序员在上海之二(代码片段)

今天上午一致在整理自己的代码,想把maven分支的几个项目整合到一个项目中,把他们整合进来的时候根据自己的需求添加一些代码,红叉满天飞啊~不过这事要淡定既然环境出错了就有解决办法,主要的一些类找... 查看详情

spring总结之三(依赖注入)(代码片段)

DI(重要):依赖注入(DependencyInjection).一般情况下,一个类不可能独立完成一个复杂的业务,需要多个类合作共同完成,需要在类中调用其它类的方法,就要给对象赋值,程序在执行过程中动态给组件(属性)赋值,我们把... 查看详情

rabbitmq指南之三:发布/订阅模式(publish/subscribe)(代码片段)

原文:RabbitMQ指南之三:发布/订阅模式(Publish/Subscribe)  在上一章中,我们创建了一个工作队列,工作队列模式的设想是每一条消息只会被转发给一个消费者。本章将会讲解完全不一样的场景: 我们会把一个消息转发给多... 查看详情

2022全球程序员薪酬报告:字节在榜,上海薪资近9万美元(代码片段)

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇出品 |OSC开源社区(ID:oschina2013)Levels.fyi网站于日前发布了一份2022年度程序员收入报告,基于收集的超过150,000份薪资申请。报告中的薪酬... 查看详情

程序员在上海之四(代码片段)

今天主要分享下前段时间做微信二维码的一些问题,我们都知道二维码的生产可以放到java后端,也可以直接使用jQuery插件jquery.qrcode.min.js来简单实现。下面简单分享下两种方式:   1、java代码生产二维码。      ... 查看详情

rabbitmq指南之三:发布/订阅模式(publish/subscribe)(代码片段)

  在上一章中,我们创建了一个工作队列,工作队列模式的设想是每一条消息只会被转发给一个消费者。本章将会讲解完全不一样的场景: 我们会把一个消息转发给多个消费者,这种模式称之为发布-订阅模式。  为了... 查看详情

深入小程序系列之三reactnative和小程序混编(代码片段)

背景本文我们将开一下脑洞,在ReactNative工程基础上下集成及运行小程序方案。先看一下效果如下:  环境搭建npminstall-greact-native-cliyarn官方的环境搭建文档已经有详细的说明,这里不再重复。大家可以看下我本地的环境配... 查看详情

细说shiro之三:在独立应用中使用shiro(代码片段)

官网:https://shiro.apache.org/ 1.下载在非Web环境的独立应用中使用Shiro时,只需要shiro-core组件。在Maven项目中的依赖配置如下:<dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-core</artif 查看详情

qt2d绘图之三:绘制文字路径图像复合模式(代码片段)

一、绘制文字除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontInfo()函数可以获取字体的信息,它返回QFontInfo类对象。在绘制文字时会默认使用抗... 查看详情

android图形架构之三——创建layersurfacesurfacecontrol(代码片段)

前言上一篇我们分析了,app与SurfaceFlinger建立连接的过程,现在我们就可以继续往下分析,看下创建Surface的过程。我们可以将Surface理解为一个绘图表面,Android应用程序负责往这个绘图表面上填内容,而SurfaceFl... 查看详情

linuxc与c++一线开发实践之三linux多进程(代码片段)

进程是操作系统结构的基础。进程是一个具有独立功能的程序对某个数据集在处理机上的执行过程,进程也是作为资源分配的一个基本单位。Linux作为一个多用户、多任务的操作系统,必定支持多进程。多进程是现代操作... 查看详情

性能调优之三十六计——「优中取优」字符串拼接篇(代码片段)

...十六计——「优中取优」字符串拼接篇性能调优是每一个程序员进阶的毕竟之路,掌握各种调优技巧,对自身实力、价值的提升至关重要!继上篇“原生Echo框架JSON优化”之后 查看详情

性能调优之三十六计——「优中取优」字符串拼接篇(代码片段)

...十六计——「优中取优」字符串拼接篇性能调优是每一个程序员进阶的毕竟之路,掌握各种调优技巧,对自身实力、价值的提升至关重要!继上篇“原生Echo框架JSON优化”之后 查看详情

jetpackmvvm七宗罪之三:在onviewcreated中请求数据(代码片段)

ViewModel数据的首次加载时机?在MVVM中,ViewModel的重要职责是解耦View与Model。View向ViewModel发出指令,请求数据View通过DataBinding或LiveData等订阅ViewModel的数据变化关于订阅ViewModel的时机,大家一般放在onViewCreated,这是... 查看详情

swig之三:“11typemaps”(代码片段)

原文地址:《11Typemaps》11.1简介  typemaps是SWIG中的一种高级定制功能,可以直接指定代码包装转换的底层行为。11.1.1类型转换  在SWIG代码包装生成中最重要的问题之一就是不用语言之间的数据类型转换。11.1.2typemaps  使用%... 查看详情

jetpackmvvm七宗罪之三:在onviewcreated中请求数据(代码片段)

Jetpack的MVVM本身没有错,错在开发者的某些使用不当。本系列将分享那些AAC中常见的错误用法,以帮助大家打造更健康的应用架构1.ViewModel数据的首次加载时机?在MVVM中,ViewModel的重要职责是解耦View与Model。View向ViewMode... 查看详情

性能调优之三十六计——「取而代之」echo/json篇(代码片段)

...之三十六计——「取而代之」Echo/Json篇性能调优是每一个程序员进阶的毕竟之路,掌握各种调优技巧,对自身实力、价值的提升至关重要!了解Go的同学知道,Echo是一款极易上手且广泛被使用或被使 查看详情