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

最近在做项目的时候客户要了一个头像对比的功能,程序上还有一个功能需要跨域访问其他项目!已开始想直接使用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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值