通過http實現調接口,實現將遠程的數據庫數據插入到本地的數據當中的操作。
今天同事給我一個接口,讓我實現將遠程的數據的信息通過http的形式獲取到插入到本地的數據庫當中。
(1)簡單的方法是通過ajax傳遞參數,然後在後臺請求數據。
(2)通過http請求獲取到數據,然後插入到插入到本地的數據庫當中。
實現思路(第一種也可以但是如果使用第一種的話,就需要和頁面進行交互,最後選擇了第二中方式)
(1)通過寫http獲取值。
(2)解析json格式的數據
(3)然後連接數據庫實現數據的插入操作。
業務代碼如下:
package com.message.transfer;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import com.message.transfer.po.Order;
import com.message.transfer.util.Jdbcdemo;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class TranferMain {
/**
* 調用對方接口方法
* @param path 對方或第三方提供的路徑
* @param data 向對方或第三方發送的數據,大多數情況下給對方發送JSON數據讓對方解析
*/
public static void interfaceUtil(String path,String data) {
try {
URL url = new URL(path);
//打開和url之間的連接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
PrintWriter out = null;
//請求方式
conn.setRequestMethod("POST");
String encoding = "UTF-8";
conn.setRequestProperty("Content-Type", "application/json; charset=" + encoding);
//設置通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
//設置是否向httpUrlConnection輸出,設置是否從httpUrlConnection讀入,此外發送post請求必須設置這兩個
//最常用的Http請求無非是get和post,get請求可以獲取靜態頁面,也可以把參數放在URL字串後面,傳遞給servlet,
//post與get的 不同之處在於post的參數不是放在URL字串裏面,而是放在http請求的正文內。
conn.setDoOutput(true);
conn.setDoInput(true);
//獲取URLConnection對象對應的輸出流
out = new PrintWriter(conn.getOutputStream());
out.write(data);
//發送請求參數即數據
// out.print(data);
//緩沖數據
out.flush();
//獲取URLConnection對象對應的輸入流
InputStream is = conn.getInputStream();
//構造一個字符流緩存
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//這裏設置緩沖流,如果用String的話性能降低。
StringBuffer bf = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
/*這裏獲取到的是一個String的字符串,然後解析json,然後建一個實體類。然後set進去
* 然後使用JDBC插入到數據庫當中。
* */
bf.append(line);
}
//得到的全部的json數據。
String str = bf.toString();
//將字符串數據轉換為json對象
JSONObject jsonObject = JSONObject.fromObject(str);
String dataStr= jsonObject.get("data").toString();
JSONObject datajsonObject = JSONObject.fromObject(dataStr);
String strList = datajsonObject.get("billList").toString();
//這裏將字符串轉化為json的對象數組。
JSONArray jsonArray=JSONArray.fromObject(strList);
for(int i=0;i<jsonArray.size();i++){
// 遍歷對象數組,然後將數組中屬性為billDtlList的對象拿出來。
JSONObject job = jsonArray.getJSONObject(i);
String billDtlStr = job.get("billDtlList").toString();
//billDtlList是一個對象數組,將字符串轉化為對象數組,
JSONArray jsonArrayBillDtlStr=JSONArray.fromObject(billDtlStr);
for(int j=0;j<jsonArrayBillDtlStr.size();j++){
JSONObject dtljob = jsonArrayBillDtlStr.getJSONObject(j);
//將實體類的值放到對象的對應的屬性當中去。
Order stu=(Order)JSONObject.toBean(dtljob, Order.class);
//將對象插入數據庫。
Jdbcdemo.insert(stu);
}
}
//關閉流
is.close();
//斷開連接,最好寫上,disconnect是在底層tcp socket鏈接空閑時才切斷。如果正在被其他線程使用就不切斷。
//固定多線程的話,如果不disconnect,鏈接會增多,直到收發不出信息。寫上disconnect後正常一些。
conn.disconnect();
System.out.println("完整結束");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String sendData = "{\"code\":\"101475\",\"billCode\":\"\",\"startTime\":\"2018-8-1 24:00:00\",\"endTime\":\"2018-8-2 24:00:00\"}";
interfaceUtil("URL地址", sendData);
}
}
通過http實現調接口,實現將遠程的數據庫數據插入到本地的數據當中的操作。