更新時間:2020-08-26 15:50:35 來源:動力節點 瀏覽2474次
用兩種方式分別實現了,第一種是jdk原生的,代碼稍微多點,第二種是基于httpclient4版本的。在我的機器上,訪問同一個接口原生的性能要好很多(前者900ms,后者5.7s左右),httpclient主要性能消耗在"HttpResponse res = client.execute(post);",大約占總執行時間的90%。
private?static?final?String?METHOD_POST?=?"POST";??
????private?static?final?String?DEFAULT_CHARSET?=?"utf-8";??
??????
????public?static?String?doPost(String?url,?String?params,?String?charset,?int?connectTimeout,?int?readTimeout)?throws?Exception?{??
????????String?ctype?=?"application/json;charset="?+?charset;??
????????byte[]?content?=?{};??
????????if(params?!=?null){??
????????????content?=?params.getBytes(charset);??
????????}??
??????????
????????return?doPost(url,?ctype,?content,?connectTimeout,?readTimeout);??
????}??
????public?static?String?doPost(String?url,?String?ctype,?byte[]?content,int?connectTimeout,int?readTimeout)?throws?Exception?{??
????????HttpsURLConnection?conn?=?null;??
????????OutputStream?out?=?null;??
????????String?rsp?=?null;??
????????try?{??
????????????try{??
????????????????SSLContext?ctx?=?SSLContext.getInstance("TLS");??
????????????????ctx.init(new?KeyManager[0],?new?TrustManager[]?{new?DefaultTrustManager()},?new?SecureRandom());??
????????????????SSLContext.setDefault(ctx);??
??
????????????????conn?=?getConnection(new?URL(url),?METHOD_POST,?ctype);???
????????????????conn.setHostnameVerifier(new?HostnameVerifier()?{??
????????????????????@Override??
????????????????????public?boolean?verify(String?hostname,?SSLSession?session)?{??
????????????????????????return?true;??
????????????????????}??
????????????????});??
????????????????conn.setConnectTimeout(connectTimeout);??
????????????????conn.setReadTimeout(readTimeout);??
????????????}catch(Exception?e){??
????????????????log.error("GET_CONNECTOIN_ERROR,?URL?=?"?+?url,?e);??
????????????????throw?e;??
????????????}??
????????????try{??
????????????????out?=?conn.getOutputStream();??
????????????????out.write(content);??
????????????????rsp?=?getResponseAsString(conn);??
????????????}catch(IOException?e){??
????????????????log.error("REQUEST_RESPONSE_ERROR,?URL?=?"?+?url,?e);??
????????????????throw?e;??
????????????}??
??????????????
????????}finally?{??
????????????if?(out?!=?null)?{??
????????????????out.close();??
????????????}??
????????????if?(conn?!=?null)?{??
????????????????conn.disconnect();??
????????????}??
????????}??
??????????
????????return?rsp;??
????}??
??
????private?static?class?DefaultTrustManager?implements?X509TrustManager?{??
??
????????@Override??
????????public?void?checkClientTrusted(X509Certificate[]?arg0,?String?arg1)?throws?CertificateException?{}??
??
????????@Override??
????????public?void?checkServerTrusted(X509Certificate[]?arg0,?String?arg1)?throws?CertificateException?{}??
??
????????@Override??
????????public?X509Certificate[]?getAcceptedIssuers()?{??
????????????return?null;??
????????}??
??
????}??
??????
????private?static?HttpsURLConnection?getConnection(URL?url,?String?method,?String?ctype)??
????????????throws?IOException?{??
????????HttpsURLConnection?conn?=?(HttpsURLConnection)?url.openConnection();??
????????conn.setRequestMethod(method);??
????????conn.setDoInput(true);??
????????conn.setDoOutput(true);??
????????conn.setRequestProperty("Accept",?"text/xml,text/javascript,text/html");??
????????conn.setRequestProperty("User-Agent",?"stargate");??
????????conn.setRequestProperty("Content-Type",?ctype);??
????????return?conn;??
????}??
??
????protected?static?String?getResponseAsString(HttpURLConnection?conn)?throws?IOException?{??
????????String?charset?=?getResponseCharset(conn.getContentType());??
????????InputStream?es?=?conn.getErrorStream();??
????????if?(es?==?null)?{??
????????????return?getStreamAsString(conn.getInputStream(),?charset);??
????????}?else?{??
????????????String?msg?=?getStreamAsString(es,?charset);??
????????????if?(StringUtils.isEmpty(msg))?{??
????????????????throw?new?IOException(conn.getResponseCode()?+?":"?+?conn.getResponseMessage());??
????????????}?else?{??
????????????????throw?new?IOException(msg);??
????????????}??
????????}??
????}??
??
????private?static?String?getStreamAsString(InputStream?stream,?String?charset)?throws?IOException?{??
????????try?{??
????????????BufferedReader?reader?=?new?BufferedReader(new?InputStreamReader(stream,?charset));??
????????????StringWriter?writer?=?new?StringWriter();??
??
????????????char[]?chars?=?new?char[256];??
????????????int?count?=?0;??
????????????while?((count?=?reader.read(chars))?>?0)?{??
????????????????writer.write(chars,?0,?count);??
????????????}??
??
????????????return?writer.toString();??
????????}?finally?{??
????????????if?(stream?!=?null)?{??
????????????????stream.close();??
????????????}??
????????}??
????}??
??
????private?static?String?getResponseCharset(String?ctype)?{??
????????String?charset?=?DEFAULT_CHARSET;??
??
????????if?(!StringUtils.isEmpty(ctype))?{??
????????????String[]?params?=?ctype.split(";");??
????????????for?(String?param?:?params)?{??
????????????????param?=?param.trim();??
????????????????if?(param.startsWith("charset"))?{??
????????????????????String[]?pair?=?param.split("=",?2);??
????????????????????if?(pair.length?==?2)?{??
????????????????????????if?(!StringUtils.isEmpty(pair[1]))?{??
????????????????????????????charset?=?pair[1].trim();??
????????????????????????}??
????????????????????}??
????????????????????break;??
????????????????}??
????????????}??
????????}??
??
????????return?charset;??
????}
Java代碼
public?static?JSONObject?post(String?url,?String?json)?{??
????????HttpClient?client?=?new?DefaultHttpClient();??
????????client?=?WebClientDevWrapper.wrapClient(client);??
????????HttpPost?post?=?new?HttpPost(url);??
????????JSONObject?response?=?null;??
????????try?{??
????????????StringEntity?s?=?new?StringEntity(json);??
????????????s.setContentEncoding("UTF-8");??
????????????s.setContentType("application/json");??
????????????post.setEntity(s);??
??
????????????Long?startTime?=?System.currentTimeMillis();??
????????????HttpResponse?res?=?client.execute(post);??
????????????System.out.println(System.currentTimeMillis()?-?startTime);??
????????????if?(res.getStatusLine().getStatusCode()?==?HttpStatus.SC_OK)?{??
????????????????HttpEntity?entity?=?res.getEntity();??
????????????????String?charset?=?EntityUtils.getContentCharSet(entity);??
????????????????if(charset?==?null){??
????????????????????charset?=?"utf-8";??
????????????????}??
????????????????response?=?new?JSONObject(new?JSONTokener(??
????????????????????????new?InputStreamReader(entity.getContent(),?charset)));??
????????????}??
????????}?catch?(Exception?e)?{??
????????????throw?new?RuntimeException(e);??
????????}??
????????return?response;??
????}??
??
????public?static?class?WebClientDevWrapper?{??
????????public?static?HttpClient?wrapClient(HttpClient?base)?{??
????????????try?{??
????????????????SSLContext?ctx?=?SSLContext.getInstance("TLS");??
????????????????X509TrustManager?tm?=?new?X509TrustManager()?{??
????????????????????@Override??
????????????????????public?X509Certificate[]?getAcceptedIssuers()?{??
????????????????????????return?null;??
????????????????????}??
??
????????????????????@Override??
????????????????????public?void?checkClientTrusted(??
????????????????????????????java.security.cert.X509Certificate[]?chain,??
????????????????????????????String?authType)??
????????????????????????????throws?java.security.cert.CertificateException?{??
??????????????????????????
????????????????????}??
??
????????????????????@Override??
????????????????????public?void?checkServerTrusted(??
????????????????????????????java.security.cert.X509Certificate[]?chain,??
????????????????????????????String?authType)??
????????????????????????????throws?java.security.cert.CertificateException?{??
??????????????????????????
????????????????????}??
????????????????};??
????????????????ctx.init(null,?new?TrustManager[]?{?tm?},?null);??
????????????????SSLSocketFactory?ssf?=?new?SSLSocketFactory(ctx,?SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);??
????????????????ClientConnectionManager?ccm?=?base.getConnectionManager();??
????????????????SchemeRegistry?sr?=?ccm.getSchemeRegistry();??
????????????????sr.register(new?Scheme("https",?443,?ssf));??
????????????????return?new?DefaultHttpClient(ccm,?base.getParams());??
????????????}?catch?(Exception?ex)?{??
????????????????ex.printStackTrace();??
????????????????return?null;??
????????????}??
????????}??
????}
以上就是動力節點java培訓機構的小編針對“Java請求https接口實現”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習