①HttpURLConnection通过报文提交
在进行短信发送的接口,因厂家不同,有的厂家会采用报文的格式进行短信请求的发送与接收。本文主要介绍利用HttpURLConnection进行短信报文的请求与响应。
一般的url请求分为两种,一种是GET,一种是POST:
1.GET请求的参数是放在url后面拼接的,请求大小有限制,具体多少大家可以自行去百度,在这里就不多说了
2.POST请求参数是放在HTTP请求的正文里的,可传输的内容远大于GET请求,而且理论上来说POST请求是没有大小限制的,所以使用POST请求较多
一般正常的请求,get参数会显示在地址栏上,参数很容易被获取,安全性也较低,所以使用POST请求会比较好
HttpURLConnection有两种简单的设置请求头的方法
setRequestProperty(key,value)
addRequestProperty(key,value)
setRequestProperty和addRequestProperty的区别就是,setRequestProperty会覆盖已经存在的key的所有values,有清零重新赋值的作用。而addRequestProperty则是在原来key的基础上继续添加其他value。
发送报文格式如图所示:

短信发送:
try {
String postXml = "<?xml version='1.0' encoding='UTF-8'?>";
postXml = postXml + "<mtpacket>";
postXml = postXml + "<cpid>" +ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_CPID)+ "</cpid>";
postXml = postXml + "<userpass>" + ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_USERPASS) + "</userpass>";
postXml = postXml + "<port>" + ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_PORT)+ "</port>";
postXml = postXml + "<respDataType>XML</respDataType>";
postXml = postXml + "<cpmid>" + ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_CPMID)+ "</cpmid>";
postXml = postXml + "<flag>1</flag>";
postXml = postXml + "<mobile><![CDATA[" + mobile + "]]></mobile>";
postXml = postXml + "<message><![CDATA[" + new String(content.getBytes(), "utf-8") + "]]></message>";
postXml = postXml + "</mtpacket>";
logger.info("发送url:{},发送内容:{}",ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_POSTURL), postXml);
//1.连接的URL
URL url = new URL(ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_POSTURL));
//2.这个地方的conn是根据请求协议(此处是http协议)生成的URLConnection类的子类HttpURLConnection
//所以将其转化为HttpURLConnection类,以便使用HttpURLConnection更过的API
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//3.POST可以更好的传参
conn.setRequestMethod("POST");
//4.是否使用缓存,Post 请求不能使用缓存
conn.setUseCaches(false);
//5.设置之后可以向服务端写入数据、、可以使用conn.getOutputStream().write()
// 可以传输参数,POST请求数据放在正文内,所以需要开启传参
conn.setDoOutput(true);
//6.http读取数据
// 默认是true,所以可以一般的请求都可以获取数据
urlConnection.setDoInput(true);
//7.设置请求头
conn.setRequestProperty("Content-type", "text/xml;charset=UTF-8");
//8.输出流,进行传参,所有数据放在这里
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());
//9.写入参数内容
out.write(postXml);
//10.刷新输出流,把所有的数据流数据都传输过去
out.flush();
//11.关闭输出流
out.close();
}catch (Exception e){
e.printStackTrace();
}
接收短信报文:

接收短信代码:
if (conn.getResponseCode() != ) {
logger.info("发送失败:返回状态:" + conn.getResponseCode());
}
String result = "";
//获取输入流,这段是正式请求,会把所有的设置和参数以http方式进行请求
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "GBK"));
String line;
while ((line = in.readLine()) != null) {
result = result + line + "\n";
}
in.close();
String re = result.trim().replaceAll("'", "\"");
//打印获取的数据
logger.info("请求返回:" + re);
if (!re.contains("<respCode>0</respCode>")) {
logger.info("发送失败:返回:" + re);
}
完整示例代码:
@Override
public void sendSms(String mobile, String content, Map<String, Object> params) {
try {
String postXml = "<?xml version='1.0' encoding='UTF-8'?>";
postXml = postXml + "<mtpacket>";
postXml = postXml + "<cpid>" +ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_CPID)+ "</cpid>";
postXml = postXml + "<userpass>" + ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_USERPASS) + "</userpass>";
postXml = postXml + "<port>" + ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_PORT)+ "</port>";
postXml = postXml + "<respDataType>XML</respDataType>";
postXml = postXml + "<cpmid>" + ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_CPMID)+ "</cpmid>";
postXml = postXml + "<flag>1</flag>"; postXml = postXml + "<mobile><![CDATA[" + mobile + "]]></mobile>";
postXml = postXml + "<message><![CDATA[" + new String(content.getBytes(), "utf-8") + "]]></message>";
postXml = postXml + "</mtpacket>";
logger.info("发送url:{},发送内容:{}",ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_POSTURL), postXml); URL url = new URL(ZkjnSmsConfig.getConfigValue(ZkjnSmsConfig.SMS_ZKJN_POSTURL));
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setUseCaches(false);
conn.setDoOutput(true);
conn.setRequestProperty("Content-type", "text/xml;charset=UTF-8");
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());
out.write(postXml);
out.flush();
out.close(); if (conn.getResponseCode() != ) {
logger.info("发送失败:返回状态:" + conn.getResponseCode());
} String result = "";
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "GBK"));
String line;
while ((line = in.readLine()) != null) {
result = result + line + "\n";
}
in.close();
String re = result.trim().replaceAll("'", "\"");
logger.info("请求返回:" + re);
if (!re.contains("<respCode>0</respCode>")) {
logger.info("发送失败:返回:" + re);
}
}catch (Exception e){
e.printStackTrace();
} }
注意事项:
1.set一些设置的时候必须在connection之前,如果在connection之后这些set都没有效果了
2.post请求的正文是通过outputStream流写入的,但是在这并没有真正的去发送请求,只是放在了内存缓冲区,只有当getInputStream()调用的时候才真正的去请求
3.设置超时,防止网络异常的情况下,可能会导致程序僵死而不继续往下执行
//超时设置必须在connection之前
urlConnection.setConnectTimeout( * );// 5秒连接超时
urlConnection.setReadTimeout( * );// 5秒获取内容超时
4.添加请求头的时候如果有中文,就有可能造成中文乱码这时候可以使用这个方法
// 参数进行encode(编码),防止中文乱码
urlConnection.setRequestProperty("test", URLEncoder.encode("一个测试请求头", "UTF-8"));
对某个参数进行URLEncoder.encode,服务端获取参数之后再通过URLDecoder.decode一下就可以获得完整的中文了
5.如果环境是采用GBK编码,而短信是采用utf-8中文英文数字组合的方式组织的,这个时候要注意。要做一下操作
首先要将中文字符进行转换,
postXml = postXml + "<message><![CDATA[" + new String(content.getBytes("UTF-8"),"UTF-8") + "]]></message>";
其次在进行流输出的时候,要设定输出字符,否则在转换的时候,容易出现,字符不匹配出现乱码的问题【环境GBK,流输出默认是采用环境编码的】:
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(),Charset.forName("UTF-8"));

①HttpURLConnection通过报文提交的更多相关文章
- Android 6.0 使用HttpURLConnection 使用Get提交遇到405等问题。
HttpURLConnection 在调用connection.setDoOutput(true)之后会自动把提交方式改为POST.然后调用方法的时候有可能会出现这种情况 在调用get的时候设置为co ...
- httpurlconnection模拟post提交form表单(普通文本和上传文件) (
http://blog.sina.com.cn/s/blog_8417657f0101gvpc.html 用HttpUrlConnection模拟post表单进行文件上传平时很少使用,比较麻烦. 原理 ...
- Android HttpURLConnection And HttpClient
Google的工程师的一个博客写到: HttpURLConnection和HttpClient Volley HTTP请求时:在Android 2.3及以上版本,使用的是HttpURLConnecti ...
- HttpURLConnection请求接口
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.DataOutputStream; ...
- AndroidHttp通信 HTTP Client与HttpURLConnection的区别
Apache HTTP Client DefaultHttpClient 以及其相关类AndroidHttpClient 适用于 web browsers, 他们是可扩展的,并且拥有大量的稳定APIs ...
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片 Android6.0中把Apache HTTP Client全部的包与类都标记为deprecated ...
- AppScan漏洞“已解密的登陆请求”修复解决方案
最近在修复系统漏洞时,使用新版AppScan扫描IIS站点(WebForm)出现一个严重漏洞“已解密的登陆请求”. 扫描工具修复的建议为在登陆界面不使用含“password”类型的控件或加密录入参数. ...
- html基本的内容
1.表现各标签的特征 <img>中的src(source)即为属性 属性都是以"属性名 = 值"的形式出现 属性的值建议用引号括起来 属性建议均以键值对的形式括起来 一 ...
- java高薪之路__009_网络
1. InetAddress类2. Socket: IP地址和端口号的结合,socket允许程序把网络连接当成一个流,数据在两个socket间通过IO传输, 通信的两端都要有socket. 主动发起通 ...
随机推荐
- adplayer移植【转】
本文转载自:https://blog.csdn.net/qq361294382/article/details/50525412 这两天做madplayer移植,由于是刚装的ubuntu14.04,所 ...
- JMeter学习(二)工具简单介绍
一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...
- Linux(CentOS)中常用软件安装,使用及异常——XManager, 中文支持,JDK
XManager图形化界面远程连接 采用Xshell的方式可以不用在CentOS系统中配置即可以相连,主要原理就是SSH连接的方式,但是XManager图形化界面远程连接是需要修改CentOS系统的. ...
- Spring注解(生命周期)
对于上面的知识图解,需要一点一点的研究. 首先核心容器: 控制反转 和 依赖注入 创建工程: maven仓库搜索 spring context : 引入后 <!-- https://mvnre ...
- Docker高级使用
Docker卸载应用程序 先删除容器,在删除镜像 查询容器 docker ps –a 使用容器id删除容器 docker rm 18e672ecd8ed 查询镜像 docker images 使用镜像 ...
- LeetCode——Hamming Distance
LeetCode--Hamming Distance Question The Hamming distance between two integers is the number of posit ...
- 关于C/C++中main函数参数的学习
因为面对对象作业(2018.5.21)的要求,去学习了C/C++中main函数参数的意义,以及一些简单的使用(从命令行指令的接受),不给予赘述.(仅为个人拙见,还望看官指正) 首先,带有参数的main ...
- Android中获取并设置屏幕亮度
最近在做一个Demo的时候用到了调节屏幕亮度的功能,于是上网搜索了一下,并且写了一个小Demo测试了一下,发现代码还是比较简单的.Android中的亮度调节,主要有三个方向,一个是针对于系统的亮度调节 ...
- oracle数据库插入优化
通过程序要把1000万的数据插入到数据表中,刚开始每100条数据耗时50ms左右,但是越往后越慢,最慢到了十几秒的都有,真实好坑了. 于是在网上百度了一波,如何进行insert优化.倒是有了一点小小的 ...
- centos下tomcat自启动
一.在指定目录创建脚本并赋予755权限 vim /etc/init.d/tomcat #!/bin/bash # # kenny kenny.zhou@tom.com # /etc/rc.d/init ...