这两天,项目的需要改变了,因此添加了新的功能。在短信这个模块当中,完成后台发送短信请求,实现督促评委完成问卷的功能。在这个模块当中,最令我难受的就是HttpURLConnection的get请求方法了,在这个过程中,尝试了诸多方法,都不行,还好历尽千辛万苦终于解决了这个问题了。以下就会贴出我的项目代码,作为学习记录。
public static String send(String msgContent, String mobile)
throws Exception {
// 组建请求
String nmsg = URLEncoder.encode(msgContent, "UTF-8");
String straddr = addr + "&phone=" + mobile + "&msg=" + nmsg;
// String nmsg = new String(msgContent.getBytes(), "ISO-8859-1");
// String straddr = addr + "&phone=" + mobile + "&msg=" + nmsg;
// StringBuffer sb = new StringBuffer(straddr);
// System.out.println("URL:" + sb);
// 发送请求
// URL url = new URL(sb.toString());
// String naddr = URLEncoder.encode(straddr, "UTF-8");
// String naddr = new String(straddr.getBytes(), "ISO-8859-1");
URL url = new URL(straddr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection
.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0");
connection.setRequestProperty("Content-Type",
"plain/text; charset=UTF-8");
connection.setRequestMethod("GET");
connection.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(
url.openStream()));
// 返回结果
String inputline = in.readLine();
in.close();
connection.disconnect();
return inputline;
}
addr是我请求的url,涉及到公司内部的ip就不方便贴出来了,在这个请求里,其实是提取了出来,作为一个工具类,短信验证码方面也用到了,因此抽取出来写到baseAction中即可。对于HttpURLConnection的知识,还有很多很多,很多时候涉及编码的问题真的是头都大,但是其根源还是可以追踪的。
这个方法是可以直接的用的,也解决了中文传参的问题。
下面给个模范一点的例子
public class TestUrlGet {
public static void main(String[] args) {
try {
//对输入的内容进行编码,防止中文乱码
String username = URLEncoder.encode("李四", "UTF-8");
//对应GET请求,要把请求信息拼接在url后面
URL url = new URL("XXXX?username="+username+"&password=123");
//调用url的openConnection()方法,获得连接对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置HttpURLConnection的属性
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
//只是建立一个连接, 并不会发送真正http请求 (可以不调用)
conn.connect();
//通过响应码来判断是否连接成功
if (conn.getResponseCode() == 200) {
//获得服务器返回的字节流
InputStream is = conn.getInputStream();
//内存输出流,适合数据量比较小的字符串 和 图片
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len = is.read(buf))!=-1){
baos.write(buf, 0, len);
}
//可使用 toByteArray() 和 toString() 获取数据。
byte[] result = baos.toByteArray();
System.out.println(new String(result));
is.close();
System.out.println("客户端执行完毕!!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}