1、調用前提
在百度EasyDL中建立數據模型並發布
2、代碼
1、測試
package com.stefanie.sun.EasyDLTest; import com.stefanie.sun.bean.EasyDL.EasydlImageClassify; /** * Created with IntelliJ IDEA * StefanieSun * * @Description: * @Author: zy * @Date: 2020-06-17 15:53 * @Version: 1.0.0 */ public class EasyDLTest { public static void main(String[] args) { EasydlImageClassify.easydlImageClassify(); } }
2、調用
package com.stefanie.sun.bean.EasyDL; import com.stefanie.sun.util.GsonUtils; import com.stefanie.sun.util.HttpUtil; import java.io.File; import java.util.HashMap; import java.util.Map; /** * Created with IntelliJ IDEA * StefanieSun * * @Description: 百度EasyDL API接口調用 * @Author: zy * @Date: 2020-06-17 15:48 * @Version: 1.0.0 */ public class EasydlImageClassify { //檢測接口 private static String url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/classification/StefanieSun-NFC"; // 官網獲取的 API Key 更新為你注冊的 private static String clientId = "mYguZCBBruNw6NSQnnLkDc6S"; // 官網獲取的 Secret Key 更新為你注冊的 private static String clientSecret = "OG2YH096CEtQGNGk4KsNwk8qtuVQRZS4"; /** * 上傳本地圖片進行圖像檢測 * * @return 檢測結果集 */ public static String easydlImageClassify() { //檢測圖片轉base64格式 File file = new File("D:\\02 數據文檔\\06 API對接文檔\\03 測試圖\\微信圖片_20200617150630.jpg"); String base64 = ImageBase64.byteConverterBASE64(file); try { //組裝圖片信息 Map<String, Object> map = new HashMap<>(); map.put("image", base64); map.put("top_num", "5"); String param = GsonUtils.toJson(map); //獲取token:注意這里僅為了簡化編碼每一次請求都去獲取access_token,線上環境access_token有過期時間, 客戶端可自行緩存,過期后重新獲取。 String accessToken = AuthService.getAuth(clientId, clientSecret); //獲取返回結果集 String result = HttpUtil.post(url, accessToken, "application/json", param); System.out.println(result); return result; } catch (Exception e) { e.printStackTrace(); } return null; } }
3、工具類
package com.stefanie.sun.bean.EasyDL; import lombok.extern.slf4j.Slf4j; import java.io.*; /** * Created with IntelliJ IDEA * StefanieSun * * @Description: 圖片轉Base64格式 * @Author: zy * @Date: 2020-06-17 16:46 * @Version: 1.0.0 */ @Slf4j public class ImageBase64 { public static String byteConverterBASE64(File file) { long size = file.length(); byte[] imageByte = new byte[(int) size]; FileInputStream fs = null; BufferedInputStream bis = null; try { fs = new FileInputStream(file); bis = new BufferedInputStream(fs); bis.read(imageByte); } catch (FileNotFoundException e) { log.error("文件" + file.getName() + "不能被找到:" + e.getMessage()); } catch (IOException e) { log.error("byte轉換BASE64出錯:" + e.getMessage()); } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { log.error("關閉輸入流出錯:" + e.getMessage()); } } if (fs != null) { try { fs.close(); } catch (IOException e) { log.error("關閉輸入流出錯:" + e.getMessage()); } } } return (new sun.misc.BASE64Encoder()).encode(imageByte); } }
package com.stefanie.sun.util; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; import java.lang.reflect.Type; /** * Json工具類. */ public class GsonUtils { private static Gson gson = new GsonBuilder().create(); public static String toJson(Object value) { return gson.toJson(value); } public static <T> T fromJson(String json, Class<T> classOfT) throws JsonParseException { return gson.fromJson(json, classOfT); } public static <T> T fromJson(String json, Type typeOfT) throws JsonParseException { return (T) gson.fromJson(json, typeOfT); } }
package com.stefanie.sun.bean.EasyDL; import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; /** * Created with IntelliJ IDEA * StefanieSun * * @Description: token驗證 * @Author: zy * @Date: 2020-06-17 16:29 * @Version: 1.0.0 */ public class AuthService { // 獲取token地址 private static String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; /** * 獲取API訪問token * 該token有一定的有效期,需要自行管理,當失效時需重新獲取. * * @param ak - 百度雲官網獲取的 API Key * @param sk - 百度雲官網獲取的 Securet Key * @return assess_token 示例: * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567" */ public static String getAuth(String ak, String sk) { String getAccessTokenUrl = authHost // 1. grant_type為固定參數 + "grant_type=client_credentials" // 2. 官網獲取的 API Key + "&client_id=" + ak // 3. 官網獲取的 Secret Key + "&client_secret=" + sk; try { URL realUrl = new URL(getAccessTokenUrl); // 打開和URL之間的連接 HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); connection.setRequestMethod("GET"); connection.connect(); // 獲取所有響應頭字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍歷所有的響應頭字段 for (String key : map.keySet()) { System.err.println(key + "--->" + map.get(key)); } // 定義 BufferedReader輸入流來讀取URL的響應 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String result = ""; String line; while ((line = in.readLine()) != null) { result += line; } /** * 返回結果示例 */ System.err.println("result:" + result); JSONObject jsonObject = new JSONObject(result); String access_token = jsonObject.getString("access_token"); return access_token; } catch (Exception e) { System.err.printf("獲取token失敗!"); e.printStackTrace(System.err); } return null; } }
package com.stefanie.sun.util; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; /** * http 工具類 */ public class HttpUtil { public static String post(String requestUrl, String accessToken, String params) throws Exception { String contentType = "application/x-www-form-urlencoded"; return HttpUtil.post(requestUrl, accessToken, contentType, params); } public static String post(String requestUrl, String accessToken, String contentType, String params) throws Exception { String encoding = "UTF-8"; if (requestUrl.contains("nlp")) { encoding = "GBK"; } return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding); } public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding) throws Exception { String url = requestUrl + "?access_token=" + accessToken; return HttpUtil.postGeneralUrl(url, contentType, params, encoding); } public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding) throws Exception { URL url = new URL(generalUrl); // 打開和URL之間的連接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); // 設置通用的請求屬性 connection.setRequestProperty("Content-Type", contentType); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setUseCaches(false); connection.setDoOutput(true); connection.setDoInput(true); // 得到請求的輸出流對象 DataOutputStream out = new DataOutputStream(connection.getOutputStream()); out.write(params.getBytes(encoding)); out.flush(); out.close(); // 建立實際的連接 connection.connect(); // 獲取所有響應頭字段 Map<String, List<String>> headers = connection.getHeaderFields(); // 遍歷所有的響應頭字段 for (String key : headers.keySet()) { System.err.println(key + "--->" + headers.get(key)); } // 定義 BufferedReader輸入流來讀取URL的響應 BufferedReader in = null; in = new BufferedReader( new InputStreamReader(connection.getInputStream(), encoding)); String result = ""; String getLine; while ((getLine = in.readLine()) != null) { result += getLine; } in.close(); System.err.println("result:" + result); return result; } }
4、pom依賴
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency>
5、導入jar包
鏈接:https://pan.baidu.com/s/161P6FtgJcILPXS1mxNwUjA
提取碼:qz4s
