Java調用第三方WebApi
使用 HttpClent調用
mport com.alibaba.fastjson2.JSONObject; import com.github.pagehelper.PageInfo; import com.sail.common.core.constant.HttpStatus; import com.sail.common.core.web.page.TableDataInfo; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Map; import java.util.Set; import java.util.*; public class KingdeeToken { private static final Logger log = LoggerFactory.getLogger(KingdeeToken.class); /** * 金蝶服務器IP */ public static String ip=""; /** * 金蝶授權碼 */ public static String authorityCode=""; /** * Token有效期s */ public static int tokenvValidity=0; /** * 最多要展示的條數 */ public static int top=100; // 存儲API Key和它的過期時間 private static String originalToken = "";//原始apikey private static Map<String, Date> tokenCache = new HashMap<>(); // 判斷API Key是否過期 private static void getValidApiKey() { Date now = new Date(); Date expirationTime = tokenCache.get(originalToken); // 如果緩存中沒有或者已過期,則重新緩存 if (expirationTime == null || now.after(expirationTime)) { // 設置60分鐘后的過期時間 Date newExpirationTime = new Date(now.getTime() + tokenvValidity * 1000L); originalToken=GetNewApiKey(); tokenCache = new HashMap<>();//重新初始化 tokenCache.put(originalToken, newExpirationTime);//把最新的Token緩存起來 } } /** * @param url 請求的url * @param map 請求時參數會自動變為key1=value1&key2=value2,contentType也會自動變為application/x-www-form-urlencoded * @return 獲取相應內容 */ //map入參 public static String PostUrlEncoded(String url, Map<String, String> map) throws IOException { //創建httpClient對象 CloseableHttpClient httpClient = HttpClients.createDefault(); //創建請求方法的實例 HttpPost httpPost = new HttpPost(); try { httpPost.setURI(new URI(url)); } catch (URISyntaxException e) { e.getMessage(); } //設置傳輸超時時間 RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000).setConnectTimeout(30000).build(); httpPost.setConfig(requestConfig); //添加請求參數 ArrayList<NameValuePair> arrayList = new ArrayList<>(); Set<Map.Entry<String, String>> entrySet = map.entrySet(); for (Map.Entry<String, String> entry : entrySet) { String key = entry.getKey(); String value = entry.getValue(); arrayList.add(new BasicNameValuePair(key, value)); } httpPost.setEntity(new UrlEncodedFormEntity(arrayList)); //發送http請求 CloseableHttpResponse response = httpClient.execute(httpPost); //獲取返回的內容 String result; int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == 200) { result = EntityUtils.toString(response.getEntity()); } else { log.info("請求接口出現錯誤,狀態碼為:{}", statusCode); return null; } return result; } /** * 封裝POST請求(String入參) * * @param url 請求的路徑 * @param data String類型json格式數據 * @return 獲取相應內容 */ public static String postJson(String url, String data) throws IOException { //創建HttpClient對象 HttpClient httpClient = HttpClientBuilder.create().build(); //創建請求方式的實例 HttpPost httpPost = new HttpPost(url); //添加請求參數(設置請求和傳輸超時時間) RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(60000).build(); httpPost.setConfig(requestConfig); //設置請求頭 httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Content-Type", "application/json"); //設置請求參數 httpPost.setEntity(new StringEntity(data, "UTF-8")); //發送Http請求 HttpResponse response = httpClient.execute(httpPost); //獲取返回的內容 String result; int statusCode = response.getStatusLine().getStatusCode(); if (200 == statusCode) { result = EntityUtils.toString(response.getEntity()); } else { log.info("請求接口出現錯誤,狀態碼為:{}", statusCode); return null; } return result; } /** * 封裝GET請求 * * @param url 請求地址 * @return 相應內容 */ public static String get(String url) throws IOException { //1、創建HttpClient對象 HttpClient httpClient = HttpClientBuilder.create().build(); //2、創建請求方式的實例 HttpGet httpGet = new HttpGet(url); //3、添加請求參數(設置請求和傳輸超時時間) RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(60000).build(); httpGet.setConfig(requestConfig); //4、發送Http請求 HttpResponse response = httpClient.execute(httpGet); //5、獲取返回的內容 String result; int statusCode = response.getStatusLine().getStatusCode(); if (200 == statusCode) { result = EntityUtils.toString(response.getEntity()); } else { log.info("請求接口出現錯誤,狀態碼為:{}", statusCode); return null; } return result; } /** * 獲取金蝶的Token * @return */ public static String GetNewApiKey(){ String result=""; String urlStr="http://"+ip+"/K3API/Token/Create?authorityCode="+authorityCode; try{ result=get(urlStr); JSONObject jsonObject = JSONObject.parseObject(result); JSONObject data = jsonObject.getJSONObject("Data"); originalToken= data.getString("Token"); }catch (Exception e){ log.error("請求異常", e); } return originalToken; } /** * 金蝶的Get方法 * @param httpUrl * @return */ public static String doGetKis(String httpUrl){ getValidApiKey(); httpUrl="http://"+ip+httpUrl+"?token"+originalToken; try { return get(httpUrl); } catch (IOException e) { throw new RuntimeException(e); } } /** * 金蝶的Post方法 * @param httpUrl * @param param * @return */ public static String doPostKis(String httpUrl, String param){ getValidApiKey(); httpUrl="http://"+ip+httpUrl+"?token="+originalToken; String rst= null; try { rst = postJson(httpUrl, param); } catch (IOException e) { throw new RuntimeException(e); } return rst; } public static TableDataInfo getDataTable(List<?> list,int total) { TableDataInfo rspData = new TableDataInfo(); rspData.setCode(HttpStatus.SUCCESS); rspData.setRows(list); rspData.setMsg("查詢成功"); rspData.setTotal(total); return rspData; } }
調用
ObjectMapper mapper = new ObjectMapper(); String jsonResult = mapper.writeValueAsString(queryData); result=KingdeeToken.doPostKis(url,jsonResult); listReturnMain = JSON.parseObject(result, ListReturnMain.class);
其他
|
作者:chenze 出處:http://www.rzrgm.cn/chenze-Index/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 如果文中有什么錯誤,歡迎指出。以免更多的人被誤導。 |

浙公網安備 33010602011771號