Let's go

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);

其他

posted @ 2025-08-04 09:43  chenze  阅读(8)  评论(0)    收藏  举报
有事您Q我