Http工具类

  • import java.io.BufferedReader;
  • import java.io.IOException;
  • import java.io.InputStream;
  • import java.io.InputStreamReader;
  • import java.io.UnsupportedEncodingException;
  • import java.math.BigDecimal;
  • import java.security.KeyManagementException;
  • import java.security.NoSuchAlgorithmException;
  • import java.security.cert.CertificateException;
  • import java.security.cert.X509Certificate;
  • import java.util.ArrayList;
  • import java.util.HashMap;
  • import java.util.Iterator;
  • import java.util.List;
  • import java.util.Map;
  • import java.util.Map.Entry;
  • import java.util.Set;
  • import javax.net.ssl.SSLContext;
  • import javax.net.ssl.SSLException;
  • import javax.net.ssl.SSLSession;
  • import javax.net.ssl.SSLSocket;
  • import javax.net.ssl.TrustManager;
  • import javax.net.ssl.X509TrustManager;
  • import javax.servlet.http.HttpServletRequest;
  • import org.apache.http.HttpEntity;
  • import org.apache.http.HttpResponse;
  • import org.apache.http.HttpStatus;
  • import org.apache.http.NameValuePair;
  • import org.apache.http.client.ClientProtocolException;
  • import org.apache.http.client.HttpClient;
  • import org.apache.http.client.config.RequestConfig;
  • import org.apache.http.client.entity.UrlEncodedFormEntity;
  • import org.apache.http.client.methods.HttpDelete;
  • import org.apache.http.client.methods.HttpGet;
  • import org.apache.http.client.methods.HttpPost;
  • import org.apache.http.conn.scheme.Scheme;
  • import org.apache.http.conn.ssl.SSLSocketFactory;
  • import org.apache.http.conn.ssl.X509HostnameVerifier;
  • import org.apache.http.entity.StringEntity;
  • import org.apache.http.impl.client.DefaultHttpClient;
  • import org.apache.http.message.BasicNameValuePair;
  • import org.apache.http.util.EntityUtils;
  • import org.slf4j.Logger;
  • import org.slf4j.LoggerFactory;
  • /**
    • HTTP工具类
    • @author ycye
  • */
  • public class HttpUtils {
  • private static Logger logger = LoggerFactory.getLogger(HttpUtils.class);
  • private static final int OSB_TIME_OUT=20;
  • /**
    • HTTPGET
    • @param url
    • @param paramsMap
    • @param encoding
    • @return
  • */
  • public final static String httpGet(String url, Map<String, String> paramsMap, String encoding) throws Exception{
  • Map<String, String> headerMap = new HashMap<String, String>();
  • headerMap.put("Content-Type", "application/x-www-form-urlencoded; charset=" + encoding);
  • return get(url, paramsMap, headerMap, encoding, url != null && url.startsWith("https:") ? "https" : "http");
  • }
  • /**
    • HTTPSGET
    • @param url
    • @param paramsMap
    • @param encoding
    • @return
  • */
  • public final static String httpsGet(String url, Map<String, String> paramsMap, String encoding) throws Exception{
  • Map<String, String> headerMap = new HashMap<String, String>();
  • headerMap.put("Content-Type", "application/x-www-form-urlencoded; charset=" + encoding);
  • return get(url, paramsMap, headerMap, encoding, url != null && url.startsWith("https:") ? "https" : "http");
  • }
  • /**
    • HTTPSPOST
    • @param url
    • @param paramsMap
    • @param encoding
    • @return
  • */
  • public final static String httpPost(String url, Map<String, String> paramsMap, String encoding) {
  • Map<String, String> headerMap = new HashMap<String, String>();
  • headerMap.put("Content-Type", "application/x-www-form-urlencoded; charset=" + encoding);
  • // 组装参数
  • List<BasicNameValuePair> params = parseMap2BasicForm(paramsMap);
  • UrlEncodedFormEntity entity = null;
  • try {
  • entity = new UrlEncodedFormEntity(params, encoding);
  • } catch (UnsupportedEncodingException e) {
  • logger.error("httpPost fail" + e.getMessage(), e);
  • }
  • return post(url, headerMap, entity, encoding, url != null && url.startsWith("https:") ? "https" : "http");
  • }
  • /**
    • HTTPSPOST
    • @param url
    • @param paramsMap
    • @param headerMap
    • @param encoding
    • @return
  • */
  • public final static String httpPost(String url, Map<String, String> paramsMap,Map<String, String> headerMap, String encoding) {
  • headerMap.put("Content-Type", "application/x-www-form-urlencoded; charset=" + encoding);
  • // 组装参数
  • List<BasicNameValuePair> params = parseMap2BasicForm(paramsMap);
  • UrlEncodedFormEntity entity = null;
  • try {
  • entity = new UrlEncodedFormEntity(params, encoding);
  • } catch (UnsupportedEncodingException e) {
  • logger.error("httpPost fail" + e.getMessage(), e);
  • }
  • return post(url, headerMap, entity, encoding, url != null && url.startsWith("https:") ? "https" : "http");
  • }
  • /**
    • HTTPSPOST
    • @param url
    • @param paramsMap
    • @param encoding
    • @return
  • */
  • public final static String httpsPost(String url, Map<String, String> paramsMap, String encoding) {
  • return httpPost(url, paramsMap, encoding);
  • }
  • /**
    • HTTPSPOST JSON 改为根据URL的前面几个字母(协议),来进行http或https调用。
    • @param url
    • @param paramJson
    • @param headerMap
    • @param encoding
    • @return
  • */
  • public final static String httpsPostJson(String url, String paramJson,Map<String, String> headerMap, String encoding) {
  • headerMap.put("Content-Type", "application/json; charset=" + encoding);
  • // 组装参数
  • StringEntity entity = null;
  • try {
  • logger.debug("send post data:" + paramJson);
  • entity = new StringEntity(paramJson, encoding);
  • entity.setContentType("application/x-www-form-urlencoded");
  • } catch (Exception e) {
  • logger.error("组装参数失败" + e.getMessage(), e);
  • }
  • return post(url, headerMap, entity, encoding, url != null && url.startsWith("https:") ? "https" : "http");
  • }
  • /**
    • HTTPSPOST JSON 改为根据URL的前面几个字母(协议),来进行http或https调用。
  • *
    • @param url
    • @param paramJson
    • @param headerMap
    • @param encoding
    • @return
  • */
  • public final static HttpResponse nativeHttpsPostJson(String url, String paramJson,Map<String, String> headerMap, String encoding) {
  • headerMap.put("Content-Type", "application/json; charset=" + encoding);
  • // 组装参数
  • StringEntity entity = null;
  • try {
  • logger.debug("send post data:" + paramJson);
  • entity = new StringEntity(paramJson, encoding);
  • } catch (Exception e) {
  • logger.error("组装参数失败" + e.getMessage(), e);
  • }
  • return nativePost(url, headerMap, entity, encoding, url != null && url.startsWith("https:") ? "https" : "http");
  • }
  • /**
    • HTTPSPOST JSON 改为根据URL的前面几个字母(协议),来进行http或https调用。
    • @param url
    • @param paramJson
    • @param encoding
    • @return
  • */
  • public final static String httpsPostJson(String url, String paramJson, String encoding) {
  • Map<String, String> headerMap = new HashMap<String, String>();
  • headerMap.put("Content-Type", "application/json; charset=" + encoding);
  • // 组装参数
  • StringEntity entity = null;
  • try {
  • logger.debug("send post data:" + paramJson);
  • entity = new StringEntity(paramJson, encoding);
  • } catch (Exception e) {
  • logger.error("组装参数失败" + e.getMessage(), e);
  • }
  • return post(url, headerMap, entity, encoding, url != null && url.startsWith("https:") ? "https" : "http");
  • }
  • /**
    • HTTPSPOST JSON 改为根据URL的前面几个字母(协议),来进行http或https调用。
    • @param url
    • @param encoding
    • @return
  • */
  • public final static String httpsPostJson(String url, String encoding) {
  • Map<String, String> headerMap = new HashMap<String, String>();
  • headerMap.put("Content-Type", "application/json; charset=" + encoding);
  • return post(url, headerMap, null, encoding, url != null && url.startsWith("https:") ? "https" : "http");
  • }
  • /**
    • HTTPSDELETE 改为根据URL的前面几个字母(协议),来进行http或https调用。
    • @param url
    • @param encoding
    • @return
  • */
  • public final static HttpResponse httpsDelete(String url, String encoding) {
  • Map<String, String> headerMap = new HashMap<String, String>();
  • headerMap.put("Content-Type", "application/json; charset=" + encoding);
  • return delete(url, headerMap, encoding, url != null && url.startsWith("https:") ? "https" : "http");
  • }
  • /**
    • HTTP POST XML
    • @param url
    • @param requestXML
    • @param encoding
    • @param soapAction
    • @return
    • @throws Exception
  • */
  • public final static String httpPostXml(String url, String requestXML, String encoding, String soapAction)
  • throws Exception {
  • Map<String, String> headerMap = new HashMap<String, String>();
  • headerMap.put("Content-Type", "text/xml; charset=" + encoding);
  • headerMap.put("Accept", "application/soap+xml, application/dime, multipart/related, text/*");
  • // headerMap.put("User-Agent","Axis/1.4");
  • // headerMap.put("Cache-Control","no-cache");
  • // headerMap.put("Pragma","no-cache");
  • // headerMap.put("SOAPAction",soapAction);
  • // headerMap.put("Content-Length",requestXML.getBytes().length + "");
  • // 组装参数
  • StringEntity entity = null;
  • try {
  • entity = new StringEntity(requestXML, encoding);
  • } catch (Exception e) {
  • logger.error("httpPostXml error : ", e);
  • }
  • return post(url, headerMap, entity, encoding, url != null && url.startsWith("https:") ? "https" : "http");
  • }
  • /**
    • GET
    • @param url
    • @param paramsMap
    • @param headerMap
    • @param encoding
    • @param type http or https
    • @return
  • */
  • @SuppressWarnings("deprecation")
  • private final static String get(String url, Map<String, String> paramsMap, Map<String, String> headerMap,
  • String encoding, String type) throws Exception{
  • String result = "";
  • // 组装参数
  • String paramStr = "";
  • Set<Entry<String, String>> paramEntries = paramsMap.entrySet();
  • for (Entry<String, String> entry : paramEntries) {
  • Object key = entry.getKey();
  • Object val = entry.getValue();
  • paramStr += paramStr = "&" + key + "=" + val;
  • }
  • if (!"".equals(paramStr)) {
  • paramStr = paramStr.replaceFirst("&", "?");
  • url += paramStr;
  • }
  • // 创建一个httpGet请求
  • HttpGet request = new HttpGet(url);
  • // 组装header参数
  • Set<Entry<String, String>> headerEntries = headerMap.entrySet();
  • for (Entry<String, String> entry : headerEntries) {
  • request.setHeader(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
  • }
  • try {
  • // 创建一个htt客户端
  • HttpClient httpClient = "https".equals(type) ? getHttpsClient() : new DefaultHttpClient();
  • RequestConfig requestConfig =
  • RequestConfig.custom().setSocketTimeout(110001).setConnectTimeout(110001).build();
  • request.setConfig(requestConfig);
  • logger.debug("execute http get request,url:"+url);
  • // 接受客户端发回的响应
  • HttpResponse httpResponse = httpClient.execute(request);
  • int statusCode = httpResponse.getStatusLine().getStatusCode();
  • if (statusCode == HttpStatus.SC_OK) {
  • logger.debug("接口:"+url+" 返回数据:"+result);
  • // 得到客户段响应的实体内容
  • result = EntityUtils.toString(httpResponse.getEntity(), encoding);
  • } else {
  • logger.error("URL:" + url + "\tStatusCode:" + statusCode);
  • }
  • } catch (Exception e) {
  • logger.error(e.getMessage(), e);
  • throw e;
  • }
  • return result;
  • }
  • /**
    • delete
    • @param url
    • @param headerMap
    • @param encoding
    • @param type
    • @return
  • */
  • private final static HttpResponse delete(String url, Map<String, String> headerMap, String encoding, String type) {
  • String result = "";
  • HttpResponse httpResponse = null;
  • // 创建一个httpGet请求
  • HttpDelete request = null;
  • // 创建一个htt客户端
  • HttpClient httpClient = null;
  • try {
  • // 创建一个HttpDelete请求
  • request = new HttpDelete(url);
  • // 组装header参数
  • Set<Entry<String, String>> headerEntries = headerMap.entrySet();
  • for (Entry<String, String> entry : headerEntries) {
  • request.setHeader(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
  • }
  • logger.debug("Post Data to [" + url + "] ");
  • // 创建一个htt客户端
  • httpClient = "https".equals(type) ? getHttpsClient() : new DefaultHttpClient();
  • RequestConfig requestConfig =
  • RequestConfig.custom().setSocketTimeout(6010001).setConnectTimeout(6010001).build();
  • request.setConfig(requestConfig);
  • // 接受客户端发回的响应
  • httpResponse = httpClient.execute(request);
  • // 接受客户端发回的响应
  • int statusCode = httpResponse.getStatusLine().getStatusCode();
  • if (statusCode == HttpStatus.SC_OK) {
  • // 得到客户段响应的实体内容
  • result = EntityUtils.toString(httpResponse.getEntity(), encoding);
  • }
  • } catch (Exception e) {
  • request.abort();
  • String errordebug = String.format("httpclient delete failed:\nUrl=%s\nError=%s", url,
  • e.toString());
  • logger.error(errordebug, e);
  • } finally {
  • // -------- 2016-1-19 是否链接 start
  • // 判断request是否等于null
  • if (request != null) {
  • try {
  • // 释放链接
  • request.releaseConnection();
  • logger.debug("close request");
  • } catch (Exception e) {
  • logger.error("close request fail", e);
  • }
  • }
  • // 判断httpclient是否为null
  • if (httpClient != null) {
  • try {
  • // 关闭链接
  • httpClient.getConnectionManager().shutdown();
  • logger.debug("close httpClient");
  • } catch (Exception e) {
  • logger.error("close httpClient fail", e);
  • }
  • }
  • // -------- 2016-1-19 是否链接 start
  • }
  • return httpResponse;
  • }
  • /**
    • POST
    • @param url
    • @param headerMap
    • @param requestEntity
    • @param encoding
    • @param type
    • @return
  • */
  • private final static String post(String url, Map<String, String> headerMap, HttpEntity requestEntity,
  • String encoding, String type) {
  • // String result = "";
  • HttpResponse httpResponse = null;
  • // 创建一个httpGet请求
  • HttpPost request = null;
  • // 创建一个htt客户端
  • HttpClient httpClient = null;
  • String result="";
  • try {
  • // 创建一个httpGet请求
  • request = new HttpPost(url);
  • // 组装header参数
  • Set<Entry<String, String>> headerEntries = headerMap.entrySet();
  • for (Entry<String, String> entry : headerEntries) {
  • request.setHeader(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
  • }
  • // 设置参数
  • request.setEntity(requestEntity);
  • logger.debug("Post Data to [" + url + "] ");
  • // 创建一个htt客户端
  • httpClient = "https".equals(type) ? getHttpsClient() : new DefaultHttpClient();
  • RequestConfig requestConfig =
  • RequestConfig.custom().setSocketTimeout(1601000).setConnectTimeout(1601000).build();
  • request.setConfig(requestConfig);
  • // 接受客户端发回的响应
  • httpResponse = httpClient.execute(request);
  • // 接受客户端发回的响应
  • int statusCode = httpResponse.getStatusLine().getStatusCode();
  • if (statusCode == HttpStatus.SC_OK) {
  • // 得到客户段响应的实体内容
  • result = EntityUtils.toString(httpResponse.getEntity(), encoding);
  • logger.debug("接口:"+url+" 返回数据:"+result);
  • }else {
  • logger.error("http post URL:" + url + "\tStatusCode:" + statusCode);
  • }
  • } catch (Exception e) {
  • request.abort();
  • String errordebug = String.format("httpclient post failed:\nUrl=%s\nError=%s", url, e.toString());
  • logger.error(errordebug, e);
  • throw new RuntimeException(e);
  • } finally {
  • // -------- 2016-1-19 是否链接 start
  • // 判断request是否等于null
  • if (request != null) {
  • try {
  • // 释放链接
  • request.releaseConnection();
  • logger.debug("close request");
  • } catch (Exception e) {
  • logger.error("close request fail", e);
  • }
  • }
  • // 判断httpclient是否为null
  • if (httpClient != null) {
  • try {
  • // 关闭链接
  • httpClient.getConnectionManager().shutdown();
  • logger.debug("close httpClient");
  • } catch (Exception e) {
  • logger.error("close httpClient fail", e);
  • }
  • }
  • // -------- 2016-1-19 是否链接 start
  • }
  • return result;
  • }
  • /**
  • *
    • @param url
    • @param headerMap
    • @param requestEntity
    • @param encoding
    • @param type
    • @return
  • */
  • private final static HttpResponse nativePost(String url, Map<String, String> headerMap, HttpEntity requestEntity,
  • String encoding, String type) {
  • // String result = "";
  • HttpResponse httpResponse = null;
  • // 创建一个httpGet请求
  • HttpPost request = null;
  • // 创建一个htt客户端
  • HttpClient httpClient = null;
  • String result="";
  • try {
  • // 创建一个httpGet请求
  • request = new HttpPost(url);
  • // 组装header参数
  • Set<Entry<String, String>> headerEntries = headerMap.entrySet();
  • for (Entry<String, String> entry : headerEntries) {
  • request.setHeader(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
  • }
  • // 设置参数
  • request.setEntity(requestEntity);
  • logger.debug("Post Data to [" + url + "] ");
  • // 创建一个htt客户端
  • httpClient = "https".equals(type) ? getHttpsClient() : new DefaultHttpClient();
  • RequestConfig requestConfig =
  • RequestConfig.custom().setSocketTimeout(1601000).setConnectTimeout(1601000).build();
  • request.setConfig(requestConfig);
  • // 接受客户端发回的响应
  • httpResponse = httpClient.execute(request);
  • result = EntityUtils.toString(httpResponse.getEntity(), encoding);
  • logger.debug("接口:"+url+" 返回数据:"+result);
  • } catch (Exception e) {
  • request.abort();
  • String errordebug = String.format("httpclient post failed:\nUrl=%s\nError=%s", url, e.toString());
  • logger.error(errordebug, e);
  • throw new RuntimeException(e);
  • } finally {
  • // -------- 2016-1-19 是否链接 start
  • // 判断request是否等于null
  • if (request != null) {
  • try {
  • // 释放链接
  • request.releaseConnection();
  • logger.debug("close request");
  • } catch (Exception e) {
  • logger.error("close request fail", e);
  • }
  • }
  • // 判断httpclient是否为null
  • if (httpClient != null) {
  • try {
  • // 关闭链接
  • httpClient.getConnectionManager().shutdown();
  • logger.debug("close httpClient");
  • } catch (Exception e) {
  • logger.error("close httpClient fail", e);
  • }
  • }
  • // -------- 2016-1-19 是否链接 start
  • }
  • return httpResponse;
  • }
  • /**
    • 封装MAP格式的参数到BasicNameValuePair中
    • @param paramsMap
    • @return
  • */
  • private static final List<BasicNameValuePair> parseMap2BasicForm(Map<String, String> paramsMap) {
  • List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();;
  • if (paramsMap != null && paramsMap.size() > 0) {
  • Iterator<String> it = paramsMap.keySet().iterator();
  • String keyTmp = null;
  • while (it.hasNext()) {
  • keyTmp = it.next();
  • params.add(new BasicNameValuePair(keyTmp, paramsMap.get(keyTmp)));
  • }
  • }
  • return params;
  • }
  • /**
    • 取已配置的HttpsClient
    • @return
    • @throws NoSuchAlgorithmException
    • @throws KeyManagementException
  • */
  • private final static DefaultHttpClient getHttpsClient() throws NoSuchAlgorithmException, KeyManagementException {
  • // 创建默认的httpClient实例
  • DefaultHttpClient httpClient = new DefaultHttpClient();
  • X509TrustManager xtm = new X509TrustManager() { // 创建TrustManager
  • @Override
  • public void checkClientTrusted(X509Certificate[] chain, String authType)
  • throws CertificateException {}
  • @Override
  • public void checkServerTrusted(X509Certificate[] chain, String authType)
  • throws CertificateException {}
  • @Override
  • public X509Certificate[] getAcceptedIssuers() {
  • return null;
  • }
  • };
  • X509HostnameVerifier hostnameVerifier = new X509HostnameVerifier() {
  • @Override
  • public boolean verify(String hostname, SSLSession session) {
  • return false;
  • }
  • @Override
  • public void verify(String arg0, SSLSocket arg1) throws IOException {}
  • @Override
  • public void verify(String arg0, X509Certificate arg1) throws SSLException {}
  • @Override
  • public void verify(String arg0, String[] arg1, String[] arg2) throws SSLException {}
  • };
  • SSLContext ctx;
  • try {
  • // ctx = SSLContext.getInstance("SSL", "SunJSSE");
  • ctx = SSLContext.getInstance("TLS");
  • // 使用TrustManager来初始化该上下文,TrustManager只是被SSL的Socket所使用
  • ctx.init(null, new TrustManager[] {xtm}, new java.security.SecureRandom());
  • // 创建SSLSocketFactory
  • SSLSocketFactory socketFactory = new SSLSocketFactory(ctx, hostnameVerifier);
  • // 通过SchemeRegistry将SSLSocketFactory注册到我们的HttpClient上
  • httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", 443, socketFactory));
  • } catch (Exception e) {
  • }
  • return httpClient;
  • }
  • /**
    • http get string from remote machine
    • @param url
    • @return
    • @throws IOException
    • @throws ClientProtocolException
  • */
  • public static String getNetString(String url) throws IOException, ClientProtocolException {
  • String result = "";
  • HttpClient httpclient = new DefaultHttpClient();
  • HttpGet get = new HttpGet(url);
  • HttpResponse httpResponse = httpclient.execute(get);
  • int statusCode = httpResponse.getStatusLine().getStatusCode();
  • if (statusCode == HttpStatus.SC_OK) {
  • // 得到客户段响应的实体内容
  • result = EntityUtils.toString(httpResponse.getEntity(), "utf-8");
  • }
  • get.abort();
  • return result;
  • }
  • // 调用osb
  • public static String invokeOsbInteface(String url, Map<String, Object> paramMap) throws Exception {
  • try {
  • HttpClient httpclient = new DefaultHttpClient();
  • HttpPost p = new HttpPost(url);
  • //p.addHeader("appid", paramMap.get("appid").toString());
  • // p.addHeader("appkey", paramMap.get("appkey").toString());
  • // paramMap.remove("appid");
  • // paramMap.remove("appkey");
  • List<NameValuePair> params = new ArrayList<NameValuePair>();
  • Iterator<String> iter = paramMap.keySet().iterator();
  • while (iter.hasNext()) {
  • String key = iter.next();
  • params.add(new BasicNameValuePair(key, (String) paramMap.get(key)));
  • }
  • UrlEncodedFormEntity entity2 = new UrlEncodedFormEntity(params, "UTF-8");
  • p.setEntity(entity2);
  • RequestConfig requestConfig =
  • RequestConfig.custom().setSocketTimeout(OSB_TIME_OUT)
  • .setConnectTimeout(OSB_TIME_OUT).build();
  • p.setConfig(requestConfig);
  • HttpResponse response = httpclient.execute(p);
  • HttpEntity entity = response.getEntity();
  • if (entity != null) {
  • String result = EntityUtils.toString(response.getEntity(), "utf-8");
  • return result;
  • }
  • } catch (Exception e) {
  • logger.error(":失败" + e.getMessage(), e);
  • throw e;
  • }
  • return null;
  • }
  • public static String getParame(HttpServletRequest request) throws Exception {
  • StringBuffer sb = new StringBuffer() ;
  • InputStream is = request.getInputStream();
  • BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
  • String s = "" ;
  • while((s=br.readLine())!=null){
  • sb.append(s) ;
  • }
  • return sb.toString();
  • }
  • }

分享名称:Http工具类
浏览路径:https://www.cdcxhl.com/article38/pdsepp.html

成都网站建设公司_创新互联,为您提供网站排名营销型网站建设网站设计企业网站制作网站收录网站策划

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网站建设