java -- 百度API 接口使用

百度API 控制台地址: https://console.bce.baidu.com/?fromai=1#/aip/overview

创建应用后获得 API Key – Secret Key
java -- 百度API 接口使用_第1张图片

maven 依赖

普通项目去maven中央仓库根据groupId 搜索下载 jar 包

  
           
			
			   com.baidu.aip
			   java-sdk
			   4.5.0
			

		    
		    
		        org.apache.httpcomponents
		        httpcore
		    

		    
		    
		        org.apache.httpcomponents
		        httpclient
		    

	        
	        
	            net.sf.json-lib
	            json-lib
	            2.4
	            jdk15
	        

token 获取方法(需先创建应用)

package com.example.demo;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONObject;

/**
 * 获取token类
 */
public class AuthService {

	/**
	 * 官网获取的 API Key 更新为你注册的
	 */
	static String clientId = "YvWmx5eHYExqwI76606MsExd";
	/**
	 * 官网获取的 Secret Key 更新为你注册的
	 */
	static String clientSecret = "Re93cqHB7ElIzSzTZnO4bOUsGmNvKm4Q";
	/**
	 * token 到期时间
	 */
	public static long tokenTime = 0L;
	/**
	 * token
	 */
	public static String access_token;

	/**
	 * 判断是否过期-获取token
	 * 
	 * @author wangsong
	 * @date 2019年6月29日 上午10:17:43
	 * @return
	 */
	public static String getToken() {
		if (System.currentTimeMillis() > tokenTime) {
			getAuth();
		}
		return access_token;
	}

	/**
	 * 获取权限token, 获取API访问token 该token有一定的有效期,需要自行管理,当失效时需重新获取.
	 * 
	 * @return 返回示例: { "access_token":
	 *         "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
	 *         "expires_in": 2592000 }
	 */
	public static void getAuth() {
		// 获取token地址
		String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
		String getAccessTokenUrl = authHost
				// 1. grant_type为固定参数
				+ "grant_type=client_credentials"
				// 2. 官网获取的 API Key
				+ "&client_id=" + clientId
				// 3. 官网获取的 Secret Key
				+ "&client_secret=" + clientSecret;
		try {
			URL realUrl = new URL(getAccessTokenUrl);
			// 打开和URL之间的连接
			HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
			connection.setRequestMethod("POST");
			connection.connect();
			// 获取所有响应头字段
			Map> 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 = JSONObject.fromObject(result);
			String expires_in = jsonObject.getString("expires_in");
			// token
			access_token = jsonObject.getString("access_token");
			// 过期时间
			tokenTime = System.currentTimeMillis() + Long.valueOf(expires_in);
		} catch (Exception e) {
			System.err.printf("获取token失败!");
			e.printStackTrace(System.err);
		}
	}

	/**
	 * 获取测试
	 * 
	 * @author wangsong
	 * @date 2019年6月29日 上午10:18:57
	 * @param args
	 */
	public static void main(String[] args) {
		String auth = getToken();
		System.out.println(auth);
	}
}

1、 网络图片文字识别

创建应用,获取 key
java -- 百度API 接口使用_第2张图片
java 代码
base64 工具类

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

import sun.misc.BASE64Encoder;

/**
 * 图片转化base64后再UrlEncode结果
 */

@SuppressWarnings("all")
public class BaseImg64 {
	/**
	 * 将一张本地图片转化成Base64字符串
	 */
	public static String getImageStrFromPath(String imgPath) {
		InputStream in;
		byte[] data = null;
		// 读取图片字节数组
		try {
			in = new FileInputStream(imgPath);
			data = new byte[in.available()];
			in.read(data);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 对字节数组Base64编码
		BASE64Encoder encoder = new BASE64Encoder();
		// 返回Base64编码过再URLEncode的字节数组字符串
		return URLEncoder.encode(encoder.encode(data));
	}
}

调用网络图片文字识别 api 接口


import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

/**
 * 百度图片识别api接口
 * 
 * @author wangsong
 * @date 2019年6月28日 下午7:43:49
 */
@SuppressWarnings("all")
public class BaiduImgApi {

	/**
	 * 图像文字识别
	 */
	private static final String POST_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token="
			+ AuthService.getToken();

	/**
	 * 识别本地图片的文字
	 */
	public static String checkFile(String path) throws URISyntaxException, IOException {
		File file = new File(path);
		if (!file.exists()) {
			throw new NullPointerException("图片不存在");
		}
		String image = BaseImg64.getImageStrFromPath(path);
		String param = "image=" + image;
		return post(param);
	}

	/**
	 * 图片url 识别结果,为json格式
	 */
	public static String checkUrl(String url) throws IOException, URISyntaxException {
		String param = "url=" + url;
		return post(param);
	}

	/**
	 * 通过传递参数:url和image进行文字识别
	 */

	private static String post(String param) throws URISyntaxException, IOException {
		// 开始搭建post请求
		HttpClient httpClient = new DefaultHttpClient();
		HttpPost post = new HttpPost();
		URI url = new URI(POST_URL);
		post.setURI(url);
		// 设置请求头,请求头必须为application/x-www-form-urlencoded,因为是传递一个很长的字符串,不能分段发送
		post.setHeader("Content-Type", "application/x-www-form-urlencoded");
		StringEntity entity = new StringEntity(param);
		post.setEntity(entity);
		HttpResponse response = httpClient.execute(post);
		System.out.println(response.toString());
		if (response.getStatusLine().getStatusCode() == 200) {
			String str;
			try {
				// 读取服务器返回过来的json字符串数据
				str = EntityUtils.toString(response.getEntity());
				System.out.println(str);
				return str;
			} catch (Exception e) {
				e.printStackTrace();
				return null;
			}
		}
		return null;
	}

	/**
	 * 测试
	 * 
	 * @author wangsong
	 * @date 2019年6月29日 上午10:58:17
	 * @param args
	 */
	public static void main(String[] args) {
		String path = "D:\\test.png";
		try {
			long now = System.currentTimeMillis();
			checkFile(path);
			System.out.println("耗时:" + (System.currentTimeMillis() - now) / 1000 + "s");
		} catch (URISyntaxException | IOException e) {
			e.printStackTrace();
		}
	}
}

你可能感兴趣的:(API,设计/安全/架构)