最近用學習了一下調用第三方接口發送短信驗證碼的程式,希望能夠幫助到大家。
1.首先下圖為項目的目錄結構,需要帶入三個包:
commons-httpclient-3.1.jar
commons-logging-1.0.4.jar
codec-1.3.jar
2.其次要建立模拟POST、GET請求的工具類:
package com.demo.util;
import java.io.IOException;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.SimpleHttpConnectionManager;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
public class HttpRequestUtil {
/**
* HttpClient 模拟POST請求
* @param url
* @param params
* @return
*/
public static String postRequest(String url, Map<String, String> params) {
//構造HttpClient的執行個體
HttpClient httpClient = new HttpClient();
//建立POST方法的執行個體
PostMethod postMethod = new PostMethod(url);
//設定請求頭資訊
postMethod.setRequestHeader("Connection", "close");
//添加參數
for (Map.Entry<String, String> entry : params.entrySet()) {
postMethod.addParameter(entry.getKey(), entry.getValue());
}
//使用系統提供的預設的恢複政策,設定請求重試處理,用的是預設的重試處理:請求三次
httpClient.getParams().setBooleanParameter("http.protocol.expect-continue", false);
//接收處理結果
String result = null;
try {
//執行Http Post請求
httpClient.executeMethod(postMethod);
//傳回處理結果
result = postMethod.getResponseBodyAsString();
} catch (HttpException e) {
// 發生緻命的異常,可能是協定不對或者傳回的内容有問題
System.out.println("請檢查輸入的URL!");
e.printStackTrace();
} catch (IOException e) {
// 發生網絡異常
System.out.println("發生網絡異常!");
e.printStackTrace();
} finally {
//釋放連結
postMethod.releaseConnection();
//關閉HttpClient執行個體
if (httpClient != null) {
((SimpleHttpConnectionManager) httpClient.getHttpConnectionManager()).shutdown();
httpClient = null;
}
}
return result;
}
/**
* HttpClient 模拟GET請求
* 方法說明
* @Discription:擴充說明
* @param url
* @param params
* @return String
*/
public static String getRequest(String url, Map<String, String> params) {
//構造HttpClient執行個體
HttpClient client = new HttpClient();
//拼接參數
String paramStr = "";
for (String key : params.keySet()) {
paramStr = paramStr + "&" + key + "=" + params.get(key);
}
paramStr = paramStr.substring(1);
//建立GET方法的執行個體
GetMethod method = new GetMethod(url + "?" + paramStr);
//接收傳回結果
String result = null;
try {
//執行HTTP GET方法請求
client.executeMethod(method);
//傳回處理結果
result = method.getResponseBodyAsString();
} catch (HttpException e) {
// 發生緻命的異常,可能是協定不對或者傳回的内容有問題
System.out.println("請檢查輸入的URL!");
e.printStackTrace();
} catch (IOException e) {
// 發生網絡異常
System.out.println("發生網絡異常!");
e.printStackTrace();
} finally {
//釋放連結
method.releaseConnection();
//關閉HttpClient執行個體
if (client != null) {
((SimpleHttpConnectionManager) client.getHttpConnectionManager()).shutdown();
client = null;
}
}
return result;
}
}
3.建立發送短信的方法,其中要通過短信内容要進行設定編碼集為utf-8,調用第三方接口傳參要按照第三方文檔規範:
package com.demo.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
public class SendMsgUtil {
/**
* 發送短信消息
* 方法說明
* @Discription:擴充說明
* @param phones
* @param content
* @return
* @return String
*/
@SuppressWarnings("deprecation")
public static String sendMsg(String phones,String content) {
try {
content = java.net.URLEncoder.encode(content,"utf-8");
System.out.println(content);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//短信接口URL送出位址
String url = "https://api.dingdongcloud.com/v1/sms/sendyzm?apikey=b46c4961aa875f626b7924aace0d53f7&mobile="+phones+"&content="+content;
Map<String, String> params = new HashMap<String, String>();
params.put("zh", "賬号");
params.put("mm", "密碼");
params.put("dxlbid", "短信類别編号");
params.put("extno", "擴充編号");
//手機号碼,多個号碼使用英文逗号進行分割
params.put("hm", phones);
//将短信内容進行URLEncoder編碼
params.put("nr", URLEncoder.encode(content));
return HttpRequestUtil.getRequest(url, params);
}
/**
* 随機生成6位随機驗證碼
* 方法說明
* @Discription:擴充說明
* @return
* @return String
*/
public static String createRandomVcode(){
//驗證碼
String vcode = "";
for (int i = 0; i < 6; i++) {
vcode = vcode + (int)(Math.random() * 9);
}
return vcode;
}
/**
* 測試
* 方法說明
* @Discription:擴充說明
* @param args
* @return void
*/
public static void main(String[] args) {
// System.out.println(SendMsgUtil.createRandomVcode());
// System.out.println("&ecb=12".substring(1));
System.out.println(sendMsg("18201150549", "【簽名】尊敬的使用者,您的驗證碼為" + SendMsgUtil.createRandomVcode() + ",請在10分鐘内輸入。請勿告訴其他人!"));
}
}
4.調用main方法可以進行測試,如果控台太輸出傳回狀态值不是200,可以參考第三方發短信的文檔傳回參數說明。