@throws IOException
@throws DemoException
*/
public static String getResponseString(HttpURLConnection conn) throws IOException, DemoException {
return new String(getResponseBytes(conn));
}
/**
从HttpURLConnection 获取返回的bytes
注意 HttpURLConnection自身问题, 400类错误,会直接抛出异常。不能获取conn.getInputStream();
@param conn
@return
@throws IOException http请求错误
@throws DemoException http 的状态码不是 200
*/
public static byte[] getResponseBytes(HttpURLConnection conn) throws IOException, DemoException {
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
System.err.println("http 请求返回的状态码错误,期望200, 当前是 " + responseCode);
if (responseCode == 401) {
System.err.println(“可能是appkey appSecret 填错”);
}
throw new DemoException(“http response code is” + responseCode);
}
InputStream inputStream = conn.getInputStream();
byte[] result = getInputStreamContent(inputStream);
return result;
}
/**
将InputStream内的内容全部读取,作为bytes返回
@param is
@return
@throws IOException @see InputStream.read()
*/
public static byte[] getInputStreamContent(InputStream is) throws IOException {
byte[] b = new byte[1024];
// 定义一个输出流存储接收到的数据
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// 开始接收数据
int len = 0;
while (true) {
len = is.read(b);
if (len == -1) {
// 数据读完
break;
}
byteArrayOutputStream.write(b, 0, len);
}
return byteArrayOutputStream.toByteArray();
}
}
2、token的获取类,TokenHolder
package baidu.restapi.common;
import org.json.JSONObject;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
/**
token的获取类
将apiKey和secretKey换取token,注意有效期保存在expiresAt
*/
public class TokenHolder {
public static final String ASR_SCOPE = “audio_voice_assistant_get”;
public static final String TTS_SCOPE = “audio_tts_post”;
/**
*/
private static final String url = “http://openapi.baidu.com/oauth/2.0/token”;
/**
asr的权限 scope 是 “audio_voice_assistant_get”
tts 的权限 scope 是 “audio_tts_post”
*/
private String scope;
/**
*/
private String apiKey;
/**
*/
private String secretKey;
/**
*/
private String token;
/**
*/
private long expiresAt;
/**
@param apiKey 网页上申请语音识别应用获取的apiKey
@param secretKey 网页上申请语音识别应用获取的secretKey
*/
public TokenHolder(String apiKey, String secretKey, String scope) {
this.apiKey = apiKey;
this.secretKey = secretKey;
this.scope = scope;
}
/**
获取token,refresh 方法后调用有效
@return
*/
public String getToken() {
return token;
}
/**
获取过期时间,refresh 方法后调用有效
@return
*/
public long getExpiresAt() {
return expiresAt;
}
/**
获取token
@return
@throws IOException http请求错误
@throws DemoException http接口返回不是 200, access_token未获取
*/
public void resfresh() throws Exception {
String getTokenURL = url + “?grant_type=client_credentials”
// 打印的url出来放到浏览器内可以复现
System.out.println(“token url:” + getTokenURL);
URL url = new URL(getTokenURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
String result = ConnUtil.getResponseString(conn);
System.out.prin Java开源项目【ali1024.coding.net/public/P7/ 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 Java/git】 tln(“Token result json:” + result);
parseJson(result);
}
/**
@param result token接口获得的result
@throws DemoException
*/
private void parseJson(String result) throws Exception {
JSONObject json = new JSONObject(result);
if (!json.has(“access_token”)) {
Java架构进阶面试及知识点文档笔记
这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理
Java分布式高级面试问题解析文档
其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!
互联网Java程序员面试必备问题解析及文档学习笔记
Java架构进阶视频解析合集
共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理**
[外链图片转存中…(img-Xb2ofZ42-1650356580600)]
Java分布式高级面试问题解析文档
其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!
[外链图片转存中…(img-DbvCXAmi-1650356580601)]
互联网Java程序员面试必备问题解析及文档学习笔记
[外链图片转存中…(img-heVMK1rd-1650356580601)]
Java架构进阶视频解析合集