笔者在weblogic中运行一个应用,按照SDK文档中写的代码,识别图像的logo,几乎全照抄,并没有什么创新,但是自己写main方法测试类,程序好使,能够识别logo,但是一旦程序在weblogic里面整体运行,就不好使了。百度返回这个{“error_code”:”SDK108”,”error_msg”:”connection or read data time out”}
,控制台报的错完全就是误导,什么已经连接了(already connected ,can't reset之类的),浪费了好长时间去搜索报错,发现全都是徒劳。一开始真的没想到会和weblogic有关,直到把sdk的源码下载下来一行一行调测,发现,在AipHttpClient的这一行
URL console = new URL(url);获取到的是
weblogic.net.http.SOAPHttpsURLConnection:https://aip.baidubce.com/oauth/2.0/token
而自己写的测试类,好使的时候,正常应该获取到这个才对
sun.net.www.protocol.https.DelegateHttpsURLConnection:https://aip.baidubce.com/oauth/2.0/token
之所以报错是因为这个原因,所以根据网上查的资料,
http://www.cnblogs.com/garinzhang/p/Java_Weblogic_SOAPHttpsURLConnection_HttpsURLConnection.html
修改了百度的jar包,把代码改成了这样,程序就好使了。
URL console = new URL(null,url,new com.sun.net.ssl.internal.www.protocol.https.Handler());
下面这个是百度的说明文档中调用的例子。
public class Sample {
//设置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) {
// 初始化一个AipImageClassifyClient
AipImageClassifyClient client = new AipImageClassifyClient(APP_ID, API_KEY, SECRET_KEY);
// 可选:设置网络连接参数
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
// 可选:设置代理服务器地址, http和socket二选一,或者均不设置
client.setHttpProxy("proxy_host", proxy_port); // 设置http代理
client.setSocketProxy("proxy_host", proxy_port); // 设置socket代理
// 可选:设置log4j日志输出格式,若不设置,则使用默认配置
// 也可以直接通过jvm启动参数设置此环境变量
System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");
// 调用接口
String path = "test.jpg";
JSONObject res = client.objectDetect(path, new HashMap());
System.out.println(res.toString(2));
}
}