最近在做项目的时候客户要了一个头像对比的功能,程序上还有一个功能需要跨域访问其他项目!已开始想直接使用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