import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baidu.aip.ocr.AipOcr;
import io.swagger.annotations.Api;
import okhttp3.Response;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sun.misc.BASE64Encoder;
import com.fasterxml.jackson.databind.ObjectMapper;
<!--http://ai.baidu.com/sdk 调sdk,所需依赖-->
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>4.11.0</version>
</dependency>
//设置APPID/AK/SK
public static final String APP_ID = "******";//你的 App ID
public static final String API_KEY = "*********";//你的 Api Key
public static final String SECRET_KEY = "*******************";//你的 Secret Key
public static void main(String[] args) {
// 初始化一个AipOcr
AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
// 调用接口
sample(client);
}
/*================================================================= 调sdk 方法一:不需要获取accessToken ===================================================================================*/
/**
* 通过调用百度的sdk实现识别 对行驶证进行识别 方法一:
* @param client
*/
public static void sample(AipOcr client) {
// 传入可选参数调用接口
HashMap<String, String> options = new HashMap<String, String>();
options.put("detect_direction", "true");
options.put("accuracy", "normal");
// 可选:设置网络连接参数
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
// 参数为图片路径
String image = "https://aip.bdstatic.com/portal/dist/1555683028116/ai_images/technology/ocr-cards/vehicle/demo-card-1.jpg";//行驶证照片路径
byte[] base64 = imageBase64(image);
org.json.JSONObject res= client.vehicleLicense(base64, options);//第三方接口 自动调用并返回值,自己不用写网络请求接口实现调用
System.out.println(res);
/*if(res.toString(2).contains("error_msg")){//没识别出来 返回不清晰/照片有误,重新上传
System.out.println(1);
}else{
System.out.println(2);
}*/
try {
Map map=new ObjectMapper().readValue(res.toString(),Map.class);
Map words_result= (Map) map.get("words_result");
String words= ((Map) words_result.get("车辆类型")).get("words")+"";
String num= ((Map) words_result.get("号牌号码")).get("words")+"";
System.out.println(words);
System.out.println(num);
if("轿车".contains(words) || "小型客车".contains(words)){//这几种车辆类型可以注册,其他不可以
}else{
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 图片地址进行Base64编码
* @param imgUrl
* @return
*/
private static String image2Base64(String imgUrl) {
URL url = null;
InputStream is = null;
ByteArrayOutputStream outStream = null;
HttpURLConnection httpUrl = null;
try{
url = new URL(imgUrl);
httpUrl = (HttpURLConnection) url.openConnection();
httpUrl.connect();
httpUrl.getInputStream();
is = httpUrl.getInputStream();
outStream = new ByteArrayOutputStream();
//创建一个Buffer字符串
byte[] buffer = new byte[1024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
//使用一个输入流从buffer里把数据读取出来
while((len=is.read(buffer)) != -1 ){
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
// 对字节数组Base64编码
//System.out.println("解压后大小kb:"+outStream.toByteArray().length/1024);
return new BASE64Encoder().encode(outStream.toByteArray());
}catch (Exception e){
e.printStackTrace();
}//下载
finally{
if(is !=null) {
try{
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(outStream != null) {
try {
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(httpUrl != null) {
httpUrl.disconnect();
}
}
return imgUrl;
}
/**
* 图片地址转为二进制数组
* @param imgUrl
* @return
*/
private static byte[] imageBase64(String imgUrl) {
URL url = null;
InputStream is = null;
ByteArrayOutputStream outStream = null;
HttpURLConnection httpUrl = null;
try{
url = new URL(imgUrl);
httpUrl = (HttpURLConnection) url.openConnection();
httpUrl.connect();
httpUrl.getInputStream();
is = httpUrl.getInputStream();
outStream = new ByteArrayOutputStream();
//创建一个Buffer字符串
byte[] buffer = new byte[1024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
//使用一个输入流从buffer里把数据读取出来
while((len=is.read(buffer)) != -1 ){
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
// 对字节数组Base64编码
//System.out.println("解压后大小kb:"+outStream.toByteArray().length/1024);
return outStream.toByteArray();
}catch (Exception e){
e.printStackTrace();
}//下载
finally{
if(is !=null) {
try{
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(outStream != null) {
try {
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(httpUrl != null) {
httpUrl.disconnect();
}
}
return null;
}
/*================================================================= 方法二:===============================================================================================*/
/**
*自己去调用url,进行百度识别 对行驶证进行识别 方法二:
* 第一步:获取accessToken
* 第二步:进行百度识别
* @return
*/
@PostMapping(value = "/getInfo")
public void getInfo(String accessToken){
String url="https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license?";
String urlPath= url+"access_token=" + accessToken;
String imgUrl = "https://aip.bdstatic.com/portal/dist/1555683028116/ai_images/technology/ocr-cards/vehicle/demo-card-1.jpg";//行驶证照片路径
String base64 = image2Base64(imgUrl);
Map map=new HashMap();
/* map.put("image",URLEncoder.encode(base64));*/
map.put("image",base64);//百度说 图像数据,base64编码后进行urlencode,此处不进行urlencode,
// 因为 Response response=new HttpClient().post_Form(urlPath,map);这一步对map中的值做了urlencode处理
new Thread(){
@Override
public void run() {
super.run();
try {
Response response=new HttpClient().post_Form(urlPath,map);
String res =response.body().string();
//取值 方法一 转为JSONObject一层一层取值
JSONObject jb=JSON.parseObject(res);
String words_result=jb.getString("words_result");
JSONObject j=JSON.parseObject(words_result);
String p=j.getString("品牌型号");
String style=j.getString("车辆类型");
String user=j.getString("所有人");
String num=j.getString("号牌号码");
//取值 方法二 转为map,再去取值
Map map=new ObjectMapper().readValue(res,Map.class);
Map words= (Map) map.get("words_result");
String s=((Map)words.get("车辆类型")).get("words")+"";
if("轿车".contains(style) || "小型客车".contains(style)){//这几种车辆类型可以注册,其他不可以
}else{
}
System.out.println("品牌型号: "+p+" ,车辆类型: "+style+" ,所有人: "+user+" ,号牌号码:"+num);
System.out.println("====================="+res+" "+response.isSuccessful());
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
package com.xiao.api;
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;
/**
* @program: wash-car
* @description:
* @author: zl
* @create: 2019-04-23 18:39
**/
/**
* 获取token类
*/
public class AuthService {
/**
* 获取权限token
*
* @return 返回示例:
* {
* "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
* "expires_in": 2592000
* }
*/
public static void main(String[] args) {
getAuth();
}
public static String getAuth() {
// 官网获取的 API Key 更新为你注册的
String clientId = "F7Qwk*********";
// 官网获取的 Secret Key 更新为你注册的
String clientSecret = "9lvFqIlN***********";
String access_token= getAuth(clientId, clientSecret);
return access_token;
}
/**
* 获取API访问token
* 该token有一定的有效期,需要自行管理,当失效时需重新获取.1个月有效期时间
*
* @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) {
// 获取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=" + 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.xiao.api;
/**
* @program: wash-car
* @description:
* @author: zl
* @create: 2019-04-23 19:28
**/
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import okhttp3.FormBody.Builder;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* okhttp和okio需要同时使用
*
* okhttp git https://github.com/square/okhttp
* 依赖 implementation 'com.squareup.okhttp3:okhttp:3.10.0'
*
* okio git https://github.com/square/okio
* 依赖 implementation 'com.squareup.okio:okio:1.14.1'
*/
public class HttpClient {
private final OkHttpClient client;
//设置默认字符编码 UTF-8 GBK 等...
private final String POST_ENCODE_TYPE="UTF-8";
private final String GET_ENCODE_TYPE="UTF-8";
public HttpClient() {
client = new OkHttpClient.Builder()
// Set Timeout
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
// Set Others
.build();
}
private void toastMsg(Response response) {
}
private void toastMsg(String str) {
}
/**
* 生成Request.Builder
* 带有请求头参数
*/
private Request.Builder createBuilder(String url,Map<String,String> addHeaderParameters,Map<String,String> setHeaderParameters){
Request.Builder builder =new Request.Builder().url(url);
if (addHeaderParameters!=null){//增加header参数
Set<Entry<String, String>> entrys = addHeaderParameters.entrySet();
for (Entry entry : entrys) {
builder.addHeader(entry.getKey()+"",entry.getValue()+"");
}
}
if (setHeaderParameters!=null){//定义header参数
Set<Entry<String, String>> entrys = setHeaderParameters.entrySet();
for (Entry entry : entrys) {
builder.header(entry.getKey()+"",entry.getValue()+"");
}
}
return builder;
}
/**
* 生成Request.Builder,添加的默认的header参数,不同项目需要修改
*/
private Request.Builder createBuilder(String url){
Map mapSet=new HashMap();
mapSet.put("Content-Type","application/x-www-form-urlencoded");
return createBuilder(url,null,mapSet);
}
/**
* Get请求,使用默认Header设置
* @param url 请求地址
* @param getParameters 携带参数
*/
public Response get(String url,Map getParameters) throws Exception {
if (getParameters!=null){
Set<Entry> entrys = getParameters.entrySet();
int i=0;
for (Entry entry : entrys) {
if (i==0){
url=url+"?"+entry.getKey()+"="+ formatStringGet(entry.getValue()+"");
}else {
url=url+"&"+entry.getKey()+"="+ formatStringGet(entry.getValue()+"");
}
i++;
}
}
Request request = createBuilder(url)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
toastMsg(response);
throw new IOException("Unexpected Code/响应失败" + response);
}
return response;
}
/**
* Get请求,使用自定义Header设置
* @param url 请求地址
* @param getParameters 携带参数
* @param addHeaderParameters 增加的请求头参数
* @param setHeaderParameters 修改的请求头参数
*/
public Response get(String url,Map getParameters,Map<String,String> addHeaderParameters,Map<String,String> setHeaderParameters) throws Exception {
if (getParameters!=null){
Set<Entry> entrys = getParameters.entrySet();
int i=0;
for (Entry entry : entrys) {
if (i==0){
url=url+"?"+entry.getKey()+"="+ formatStringGet(entry.getValue()+"");
}else {
url=url+"&"+entry.getKey()+"="+ formatStringGet(entry.getValue()+"");
}
i++;
}
}
Request request = createBuilder(url,addHeaderParameters,setHeaderParameters)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
toastMsg(response);
throw new IOException("Unexpected Code/响应失败" + response);
}
return response;
}
/**
* Post 提交字符串,使用默认Header设置
* @param url
* @param type
* @param content
* @return
* @throws Exception
*/
public Response post_String(String url,String type,String content) throws Exception {
MediaType contentType=MediaType.parse(type);
Request request = createBuilder(url)
.post(RequestBody.create(contentType,content))
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
toastMsg(response);
throw new IOException("Unexpected Code/响应失败" + response);
}
// response.code()+":"response.message()
return response;
}
/**
* Post 提交字符串,使用自定义Header设置
* @param url
* @param type
* @param content
* @param addHeaderParameters
* @param setHeaderParameters
* @return
* @throws Exception
*/
public Response post_String(String url,String type,String content,Map<String,String> addHeaderParameters,Map<String,String> setHeaderParameters) throws Exception {
MediaType contentType=MediaType.parse(type);
Request request = createBuilder(url,addHeaderParameters,setHeaderParameters)
.post(RequestBody.create(contentType,content))
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
toastMsg(response);
throw new IOException("Unexpected Code/响应失败" + response);
}
// response.code()+":"response.message()
return response;
}
/**
* Post 提交字表单,使用默认Header设置
* @param url
* @param formParameters
* @return
* @throws Exception
*/
public Response post_Form(String url, Map formParameters) throws Exception {
Builder builder = new Builder();
Set<Entry> entrys = formParameters.entrySet();
for (Entry entry : entrys) {
builder.addEncoded(formatStringPost(entry.getKey()+""),formatStringPost(entry.getValue()+""));
}
RequestBody formBody = builder.build();
Request request =createBuilder(url)
.post(formBody)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
toastMsg(response);
throw new IOException("Unexpected Code/响应失败" + response);
}
return response;
}
/**
* Post 提交字表单,使用自定义Header设置
* @param url
* @param formParameters
* @param addHeaderParameters
* @param setHeaderParameters
* @return
* @throws Exception
*/
public Response post_Form(String url, Map formParameters,Map<String,String> addHeaderParameters,Map<String,String> setHeaderParameters) throws Exception {
Builder builder = new Builder();
Set<Entry> entrys = formParameters.entrySet();
for (Entry entry : entrys) {
builder.addEncoded(formatStringPost(entry.getKey()+""),formatStringPost(entry.getValue()+""));
if ((entry.getValue()+"").length()>1000){
}else {
}
}
RequestBody formBody = builder.build();
Request request =createBuilder(url,addHeaderParameters,setHeaderParameters)
.post(formBody)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
toastMsg(response);
throw new IOException("Unexpected Code/响应失败" + response);
}
return response;
}
private String formatStringGet(String content){
String fs= "";
try {
fs = URLEncoder.encode(content,GET_ENCODE_TYPE);
} catch (Exception e) {
return content;
}
return fs;
}
private String formatStringPost(String content){
String fs= "";
try {
fs = URLEncoder.encode(content,POST_ENCODE_TYPE);
} catch (Exception e) {
return content;
}
return fs;
}
}
/**
* 高德地图通过经纬度获取省市县 通过OkHttpClient可以获取Response
* @param jingdu
* @param weidu
* @return
*/
public List<Object> gdapi(String jingdu, String weidu) {
/* String url = "https://restapi.amap.com/v3/geocode/regeo?output=json&location=" +
jingdu + "," + weidu + "&key=c6aa224a4ca7a96dbf665682cd92d5e0&radius=1000&extensions=base";*/
String url = "https://restapi.amap.com/v3/geocode/regeo?output=json&location=" +
jingdu + "," + weidu + "&key=8fb6d321b2e5ffdd496c45c4c819d37f&radius=1000&extensions=base";
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).get().build();
Call call = okHttpClient.newCall(request);
List<Object> results=new ArrayList<>();
try {
Response response = call.execute();
String result = response.body().string();
JSONObject json = JSONArray.parseObject(result);
log.info(json.toJSONString());
JSONObject obj = JSONObject.parseObject(JSONObject.parseObject(json.get("regeocode").toString()).get("addressComponent").toString());
log.info(obj.toJSONString());
log.info("省"+obj.get("province").toString()+",市"+obj.get("city").toString()+",县"+obj.get("district").toString());
results.add(obj.get("province"));
results.add(obj.get("city"));
results.add(obj.get("district"));
} catch (IOException e) {
e.printStackTrace();
}
return results;
}
json转换字符串 参考:https://www.cnblogs.com/paisen/p/5487138.html
结:
1.调用第三方时,后台可以通过网络请求进行请求第三方接口,上面代码中有两种方式,一种是通过返回response这种方式获取返回来的值;一种是通过流进行获取。
2.如果是通过sdk的话,不用自己写网络请求进行调用,直接调用会返回值。
3.调用第三方返回的是String或者是jsonObject,都可以进行处理来获取值,有两种方法,上述例子都有代码。