face++的开发包faceppsdk.jar 和httpclient.jar 冲突解决

来源:互联网 发布:淘宝卖家交流群 编辑:程序博客网 时间:2024/06/06 07:51

最近在做项目的时候客户要了一个头像对比的功能,程序上还有一个功能需要跨域访问其他项目!已开始想直接使用JQuery 的$.post 访问,发现此功能需要去修改服务端,于是想用httpclient  直接在程序里访问。

将所有的代码都写完后,编译都没有问题;但是程序运行后,测试功能时后台报错!错误如下:

Caused by: java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:82)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:95)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:104)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:62)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:572)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:174)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:158)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:919)


修改方法:

1. 保留com.facepp代码,去除org下面代码,修改facepp下代码的依赖,并引入依赖包httpcore-4.4.jar,httpmime-4.5.2.jar,json.jar。
2. 删除faceppsdk.jar,即可解决问题。


将faceppsd.jar 用压缩包的方式打开后,发现是包含源码的;新建项目将源码复制到项目中,删掉org 下面的代码,引入上面三个jar 包,修改HttpRequests.java 中的代码依赖。发现HttpRequests.java  中用到了过时的MultipartEntity 类(项目用的jdk1.7),引入的httpcore-4.4.jar 中已放弃了MultipartEntity 类,使用MultipartEntityBuilder 来替代。最后根据网上的HttpClient 的使用方法,将HttpRequests.java 中访问face++ 接口的代码修改后,最终的方法如下:

public JSONObject request(String control, String action, PostParameters params) throws FaceppParseException {URL url;HttpURLConnection urlConn = null;CloseableHttpClient client = null;HttpPost httpPost = null;CloseableHttpResponse response = null;try {url = new URL(webSite+control+"/"+action);/*urlConn = (HttpURLConnection) url.openConnection();        urlConn.setRequestMethod("POST");        urlConn.setConnectTimeout(httpTimeOut);        urlConn.setReadTimeout(httpTimeOut);        urlConn.setDoOutput(true);        urlConn.setRequestProperty("connection", "keep-alive");        urlConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + params.boundaryString()); */        System.out.println(params.boundaryString());client = HttpClients.createDefault();httpPost = new HttpPost(url.toString());            httpPost.setHeader("Content-Type", "multipart/form-data; boundary=" + params.boundaryString());            httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");             httpPost.setHeader("connection", "keep-alive");                    //MultipartEntity reqEntity = params.getMultiPart();        MultipartEntityBuilder reqEntity = params.getMultiPart();        reqEntity.addTextBody("api_key", apiKey);            reqEntity.addTextBody("api_secret", apiSecret);                        HttpEntity httpEntity = reqEntity.build();                        httpPost.setEntity(httpEntity);            response = client.execute(httpPost);            String resultString = null;            int responseCode = response.getStatusLine().getStatusCode();            if(responseCode == 200)            resultString = readString(response.getEntity().getContent());            else            resultString = "";                        EntityUtils.consume(httpEntity);                        response.close();//释放链接              /*            reqEntity.writeTo(urlConn.getOutputStream());            String resultString = null;            if (urlConn.getResponseCode() == 200)            resultString = readString(urlConn.getInputStream());            else            resultString = readString(urlConn.getErrorStream());        */            //FaceppResult result = new FaceppResult( new JSONObject(resultString), urlConn.getResponseCode());            JSONObject result = new JSONObject(resultString);                        if (result.has("error")) {                        if (result.getString("error").equals("API not found"))            throw new FaceppParseException("API not found");                        throw new FaceppParseException("API error.", result.getInt("error_code"),            result.getString("error"), responseCode);            }            result.put("response_code", responseCode);            //urlConn.getInputStream().close();            return result;} catch (Exception e) {throw new FaceppParseException("error :" + e.toString());} finally {if (urlConn != null)urlConn.disconnect();}}

最后修改后的jar 下载路径:http://download.csdn.net/detail/t_zm_cross/9600963

1 0