http请求工具
public class WebConstant { // HTTP参数传递方式 public final static int by_header = 1; public final static int by_params = 2; }
import java.io.IOException; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.math.BigDecimal; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; import javax.servlet.http.HttpServletRequest; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang3.StringUtils; /** * 操作HttpServletRequest的参数(以后可能通过类似ServletRequestWrapper实现) * * @author ybbk * @date Jun 5, 2009 2:55:16 PM * @version 0.0.1-snapshot */ public class ParamUtils { /** * 对参数按字典升序排序 ,并且去掉不需要的参数<br> * * @param params * @param ignoreParams * @return */ public static Map<String, Object> sortParams(Map<String, Object> params, List<String> ignoreParams) { Collection<String> keyset = params.keySet(); List<String> list = new ArrayList<String>(keyset); // 对key键值按字典升序排序 Collections.sort(list); // 签名步骤一:按字典排序参数 Map<String, Object> result = new TreeMap<String, Object>(); for (Iterator<String> it = list.iterator(); it.hasNext();) { String key = it.next(); if (ignoreParams != null && ignoreParams.contains(key)) { continue; } result.put(key, params.get(key)); } return result; } /** * 作用:格式化参数, name=xx&age=xx * * @param params * @param urlencode * @param escapeBlank 是否去掉值是空的参数 * @return * @throws UnsupportedEncodingException */ public static String formatParamMap(Map<String, Object> params, boolean needEncode, boolean escapeBlank, String charSet) throws UnsupportedEncodingException { StringBuilder sb = new StringBuilder(); for (Iterator<String> it = params.keySet().iterator(); it.hasNext();) { String key = it.next(); Object value = params.get(key); if (value == null && escapeBlank) { continue; } else { if (value instanceof String) { String str = (String) value; if (StringUtils.isBlank(str) && escapeBlank) { continue; } else { if (needEncode) { value = URLEncoder.encode(value + "", charSet); } } } } sb.append(key).append("=").append(value).append("&"); } String result = sb.toString(); if (result.length() > 0) { result = result.substring(0, result.length() - 1); } return result; } /** * 去掉空白的参数 * * @param params * @param needEncode * @param charSet * @return * @throws UnsupportedEncodingException */ public static String formatParamMap(Map<String, Object> params, boolean needEncode, String charSet) throws UnsupportedEncodingException { return formatParamMap(params, needEncode, true, charSet); } /** * 模糊匹配某类参数值,如new-img-* * * @param request * @param paramNamePrefix * @return */ public static List<String> getValues(HttpServletRequest request, String paramNamePrefix) { Map requestParams = request.getParameterMap(); List<String> results = new ArrayList<String>(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); if (name.startsWith(paramNamePrefix)) { String[] values = (String[]) requestParams.get(name); for (String value : values) { results.add(value); } } } return results; } /** * 模糊匹配某类参数名称,如new-img-* * * @return */ public static List<String> getParamters(HttpServletRequest request, String paramNamePrefix) { Map requestParams = request.getParameterMap(); List<String> params = new ArrayList<String>(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); if (name.startsWith(paramNamePrefix)) { params.add(name); } } return params; } /** * 得到Http参数 * * @param request HttpServletRequest * @param paramName 参数名 * @param defaultStr 默认值 * @return */ public static String getString(HttpServletRequest request, String paramName, String defaultStr) { String value = request.getParameter(paramName); if (value == null) { return defaultStr; } return value.trim(); } /** * 得到Http字符串数组参数 * * @param request HttpServletRequest * @param paramName 参数名 * @return */ public static String[] getStringArray(HttpServletRequest request, String paramName) { return request.getParameterValues(paramName); } /** * 得到整形参数 * * @param request HttpServletRequest * @param paramName 参数名 * @param defaultInt 默认值 * @return */ public static Integer getInteger(HttpServletRequest request, String paramName, int defaultInt) { String value = request.getParameter(paramName); if (value == null) { return defaultInt; } try { return new Integer(value); } catch (NumberFormatException e) { return defaultInt; } } public static Integer[] getIntegerArray(HttpServletRequest request, String paramName) { String[] values = getStringArray(request, paramName); if (values == null) { return null; } List<Integer> list = new ArrayList<Integer>(); for (String value : values) { try { Integer paramValue = new Integer(value); list.add(paramValue); } catch (NumberFormatException e) { } } return list.toArray(new Integer[] {}); } public static Long getLong(HttpServletRequest request, String paramName, long defaultLong) { String value = request.getParameter(paramName); if (value == null) { return defaultLong; } try { return new Long(value); } catch (NumberFormatException e) { return defaultLong; } } public static Long[] getLongArray(HttpServletRequest request, String paramName) { String[] values = getStringArray(request, paramName); if (values == null) { return null; } List<Long> list = new ArrayList<Long>(); for (String value : values) { try { Long paramValue = new Long(value); list.add(paramValue); } catch (NumberFormatException e) { } } return list.toArray(new Long[] {}); } public static Double getDouble(HttpServletRequest request, String paramName, double defaultDouble) { String value = request.getParameter(paramName); if (value == null) { return defaultDouble; } try { return new Double(value); } catch (NumberFormatException e) { return defaultDouble; } } public static Double[] getDoubleArray(HttpServletRequest request, String paramName) { String[] values = getStringArray(request, paramName); if (values == null) { return null; } List<Double> list = new ArrayList<Double>(); for (String value : values) { try { Double paramValue = new Double(value); list.add(paramValue); } catch (NumberFormatException e) { } } return list.toArray(new Double[] {}); } /** * 把HttpServletRequest中所有的参数重新组织,形成新的查询字符串.用于转向页面时,保存request中的参数值不丢失 * * @param request * @param encoding URL编码格式 * @return 新的参数排除.格式是: aaa=value&bbb=value& */ @SuppressWarnings("rawtypes") public static String getFullRequestUrl(HttpServletRequest request, String encoding) { StringBuffer sb = new StringBuffer(); Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); for (String value : values) { try { sb.append(name).append("=").append(java.net.URLEncoder.encode(value, encoding)) .append("&"); } catch (UnsupportedEncodingException e) { } } } return sb.toString(); } public static String getFullRequestUrl(String url, Map params, String ext, String encoding) { return getFullRequestUrl(url, params, ext, encoding, true, false); } /** * 将参数拼接到URL后面 * * @param url * @param params * @param ext 如#tip3 * @param encoding * @param needEncode 是否需要编码 * @param dropEmpty 去掉空的参数,如name= * @return */ @SuppressWarnings("rawtypes") public static String getFullRequestUrl(String url, Map params, String ext, String encoding, boolean needEncode, boolean dropEmpty) { StringBuffer sb = new StringBuffer(); for (Iterator iter = params.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); Object value = params.get(name); try { if (value == null) { if (dropEmpty) { continue; } sb.append(name).append("=&"); } else { String str = value.toString(); if (StringUtils.isBlank(str) && dropEmpty) { continue; } if (needEncode) { str = java.net.URLEncoder.encode(str, encoding); } sb.append(name).append("=").append(str).append("&"); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } String requesturl = url + "?" + sb.toString(); if (requesturl.lastIndexOf("&") != -1) { requesturl = requesturl.substring(0, requesturl.length() - 1); } if (StringUtils.isNotBlank(ext)) { requesturl = requesturl + ext; } return requesturl; } /** * 将参数拼接到URL后面,除了参数外,不带多余的#信息,默认使用utf8进行encode * * @param url * @param params * @param ext * @param encoding * @return */ @SuppressWarnings("rawtypes") public static String getFullRequestUrl(String url, Map params) { return getFullRequestUrl(url, params, "", "utf-8"); } /** * 把HttpServletRequest中所有的参数重新组织,形成新的查询字符串.用于转向页面时,保存request中的参数值不丢失,默认utf-8 编码 * * @param request * @return 新的参数排除.格式是: aaa=value&bbb=value& */ public static String getFullRequestUrl(HttpServletRequest request) { return getFullRequestUrl(request, "utf-8"); } /** * 得到当前的URL及所有参数,用于转向页面时,保存request中的参数值不丢失,默认utf-8编码 * * @param request * @return 请求地址中,完整的URL和参数 */ public static String getRequestUrl(HttpServletRequest request) { String requesturl = request.getRequestURL().toString(); String params = getFullRequestUrl(request); if (params.length() > 0) { requesturl = requesturl + "?" + params; } return requesturl; } ///////////////////////////////////////////////////////// /** * @param request * @return */ public static Map<String, String> parseFromHeader(HttpServletRequest request) { Map<String, String> params = new HashMap<String, String>(); @SuppressWarnings("unchecked") Enumeration<String> e = request.getHeaderNames(); while (e.hasMoreElements()) { String key = e.nextElement(); params.put(key.toLowerCase(), request.getHeader(key)); } return params; } /** * 请求参数组转换成Map */ public static Map<String, String> parameterToMap(HttpServletRequest request) { Map<String, String> params = new HashMap<String, String>(); @SuppressWarnings("unchecked") Enumeration<String> e = request.getParameterNames(); while (e.hasMoreElements()) { String key = e.nextElement(); params.put(key, request.getParameter(key)); } return params; } /** * 请求参数组换成字符串, 格式为: key=value. 方便打印日志 */ public static String parameterToString(HttpServletRequest request) { StringBuffer sb = new StringBuffer(); @SuppressWarnings("unchecked") Enumeration<String> e = request.getParameterNames(); while (e.hasMoreElements()) { String key = e.nextElement(); sb.append(key).append("=").append(request.getParameter(key)).append(" "); } return sb.toString(); } /** * POST请求的BODY转化为String * * @param request * @return * @throws IOException */ public static String contentToString(HttpServletRequest request) throws IOException { try { java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(request.getInputStream())); StringBuffer sb = new StringBuffer(); String tmp = null; while ((tmp = reader.readLine()) != null) { sb.append(tmp).append("\r\n"); } return sb.toString(); } catch (IOException e) { throw e; } } /** * 请求参数表转转换. 转换规则为,参数名前加上"c_"以和数据库字段名一致. 重要规则: 数据库建表时, 接口字段统一为字符串型, 字段名为 c_参数名 */ public static void parserParameter(HttpServletRequest request, Map<String, Object> params, String[] parameterList) { for (String k : parameterList) { String v = ParamUtils.getString(request, k, ""); params.put("c_".concat(k), v); } } /** * 请求参数表转转换. 传入二维数组,数组为: 参数名, 列名 */ public static void parserParameter(HttpServletRequest request, Map<String, Object> params, String[][] parameterList) { for (String[] k : parameterList) { String v = ParamUtils.getString(request, k[0], ""); params.put(k[1], v); } } /** * 信息费转换 * * @param price 信息费 单位:分 */ public static BigDecimal getPrice(String price/* 信息费:单位:分 */) { BigDecimal amount = null; try { float fee = Float.parseFloat(price); amount = new BigDecimal(fee / 100); } catch (NumberFormatException e) { amount = null; } return amount; } /** * 转码转换 * * @param inputStr * @param srcEncoding * @param dstEncoding * @return */ public static String encoding(String inputStr, String srcEncoding, String dstEncoding) { try { return new String(inputStr.getBytes(srcEncoding), dstEncoding); } catch (UnsupportedEncodingException e) { } return inputStr; } /** * 将参数从request封装到指定bean * * @author: hejianhui@wegooooo.com * @param request * @param clazz * @return * @return: Object * @time: 2016年7月11日 下午4:05:43 */ @SuppressWarnings("rawtypes") public Object request2bean(HttpServletRequest request, Class clazz) { try { Field[] file = clazz.getDeclaredFields(); Object obj = clazz.newInstance(); for (int i = 0; i < file.length; i++) { String value = request.getParameter(file[i].getName()); BeanUtils.setProperty(obj, file[i].getName(), value); } return obj; } catch (Exception e) { e.printStackTrace(); } return null; } }
.
import com.google.gson.Gson; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; 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 javax.net.ssl.SSLContext; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpEntity; 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.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.util.CharsetUtils; import org.apache.http.util.EntityUtils; import org.springframework.util.CollectionUtils; /** * http请求工具 */ @Slf4j public class HttpRequestClient { public static class MyX509TrustManager implements TrustStrategy { @Override public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } } public static CloseableHttpClient createHttpClient(boolean enableSSL) throws Exception { try { if (enableSSL) { SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new MyX509TrustManager()) .build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext); return HttpClients.custom().setSSLSocketFactory(sslsf).build(); } else { return HttpClients.createDefault(); } } catch (Exception e) { throw e; } } public static String doPostText(String url, String text, boolean enableSSL) throws Exception { CloseableHttpClient httpclient = createHttpClient(enableSSL); HttpPost httpPost = new HttpPost(url); CloseableHttpResponse response = null; try { httpPost.setEntity(new StringEntity(text, "utf-8")); response = httpclient.execute(httpPost); org.apache.http.HttpEntity entity = response.getEntity(); if (response.getStatusLine().getStatusCode() == org.apache.http.HttpStatus.SC_OK) { if (entity != null) { String result = EntityUtils.toString(entity, "utf-8"); EntityUtils.consume(entity); return result; } else { return null; } } EntityUtils.consume(entity); return null; } catch (ClientProtocolException e) { throw new Exception(e); } catch (IOException e) { throw new Exception(e); } finally { try { if (response != null) { response.close(); } } catch (IOException e) { throw new Exception(e); } } } public static byte[] getBytes(String urlPath) throws Exception { InputStream inStream = getInputStream(urlPath); if (inStream != null) { return readStream(inStream); } return null; } private static byte[] readStream(InputStream inStream) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } outStream.close(); inStream.close(); return outStream.toByteArray(); } public static InputStream getInputStream(String urlPath) throws IOException { URL url = new URL(urlPath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5 * 1000); conn.setRequestMethod("GET"); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { return conn.getInputStream(); } return null; } public static void saveToFile(String urlPath, File saveFile) throws Exception { URL url = new URL(urlPath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5 * 1000); conn.setRequestMethod("GET"); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream is = conn.getInputStream(); FileOutputStream fos = new FileOutputStream(saveFile); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } is.close(); fos.close(); } } public static String doGetByParams(String url, Map<String, Object> params) throws Exception { return doGet(WebConstant.by_params, url, params); } public static String doGetByHeader(String url, Map<String, Object> params) throws Exception { return doGet(WebConstant.by_header, url, params); } public static String doGet(int paramsPassMethod, String url, Map<String, Object> params) throws Exception { return doGet(paramsPassMethod, url, params, false, null); } public static String doGet(int paramsPassMethod, String url, Map<String, Object> params, boolean enableSSL, HttpClient client) throws Exception { return doGet(paramsPassMethod, url, params, enableSSL, client, "utf-8"); } public static String doGet(int paramsPassMethod, String url, Map<String, Object> params, boolean enableSSL, HttpClient client, String charset) throws Exception { log.info("doGet():url={};params={};", url, params); if (WebConstant.by_params != paramsPassMethod && WebConstant.by_header != paramsPassMethod) { throw new Exception("不支持的参数传递方式"); } if (StringUtils.isEmpty(url)) { throw new Exception("URL为空"); } if (WebConstant.by_params == paramsPassMethod) { if (params != null && !params.isEmpty()) { url = ParamUtils.getFullRequestUrl(url, params); } } CloseableHttpClient httpclient = null; if (client == null) { httpclient = createHttpClient(enableSSL); } else { httpclient = (CloseableHttpClient) client; } HttpGet httpGet = new HttpGet(url); if (WebConstant.by_header == paramsPassMethod) { if (params != null && !params.isEmpty()) { for (Iterator<String> it = params.keySet().iterator(); it .hasNext(); ) { String key = it.next(); String value = String.valueOf(params.get(key)); httpGet.setHeader(key, value); } } } CloseableHttpResponse response = null; try { response = httpclient.execute(httpGet); HttpEntity entity = response.getEntity(); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { if (entity != null) { String result = EntityUtils.toString(entity, CharsetUtils.get(charset)); //20141205增加UTF-8 EntityUtils.consume(entity); return result; } else { return null; } } } catch (Exception e) { log.error("http请求接口异常:", e); throw new Exception(e); } finally { try { if (response != null) { response.close(); } } catch (IOException e) { throw new Exception(e); } } return null; } // //////////////////////////////////////////////////////////////////////////////////////// public static String doPostByParams(String url, Map<String, Object> params) throws Exception { return doPost(WebConstant.by_params, url, params); } public static String doPostByHeader(String url, Map<String, Object> params) throws Exception { return doPost(WebConstant.by_header, url, params); } public static String doPost(int paramsPassMethod, String url, Map<String, Object> params) throws Exception { return doPost(paramsPassMethod, url, params, false, null); } public static String doPost(int paramsPassMethod, String url, Map<String, Object> params, boolean enableSSL, HttpClient client) throws Exception { log.info("doPost():url={},params={}", url, params); if (WebConstant.by_params != paramsPassMethod && WebConstant.by_header != paramsPassMethod) { throw new Exception("不支持的参数传递方式"); } if (StringUtils.isEmpty(url)) { throw new Exception("URL为空"); } CloseableHttpClient httpclient = null; if (client == null) { httpclient = createHttpClient(enableSSL); } else { httpclient = (CloseableHttpClient) client; } HttpPost httpPost = new HttpPost(url); CloseableHttpResponse response = null; try { if (WebConstant.by_params == paramsPassMethod) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); for (Iterator<String> it = params.keySet().iterator(); it .hasNext(); ) { String key = it.next(); Object obj = params.get(key); if (obj != null) { String value = String.valueOf(obj); nameValuePairs.add(new BasicNameValuePair(key, value)); } else { nameValuePairs.add(new BasicNameValuePair(key, null)); } } httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); } if (WebConstant.by_header == paramsPassMethod) { if (params != null && !params.isEmpty()) { for (Iterator<String> it = params.keySet().iterator(); it .hasNext(); ) { String key = it.next(); String value = String.valueOf(params.get(key)); httpPost.setHeader(key, value); } } } response = httpclient.execute(httpPost); HttpEntity entity = response.getEntity(); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { if (entity != null) { String result = EntityUtils.toString(entity, CharsetUtils.get("utf-8")); //20141205增加UTF-8 EntityUtils.consume(entity); return result; } else { return null; } } EntityUtils.consume(entity); return null; } catch (ClientProtocolException e) { throw e; } catch (IOException e) { throw e; } finally { try { if (response != null) { response.close(); } } catch (IOException e) { throw e; } } } public static String doPost(String url, Map<String, Object> headers, Map<String, Object> params, boolean enableSSL, HttpClient client) throws Exception { log.info("doPost():url={},headers={},params={}", url, headers, params); if (StringUtils.isEmpty(url)) { throw new IllegalArgumentException("URL为空"); } CloseableHttpClient httpclient = null; if (client == null) { httpclient = createHttpClient(enableSSL); } else { httpclient = (CloseableHttpClient) client; } HttpPost httpPost = new HttpPost(url); CloseableHttpResponse response = null; try { if (!CollectionUtils.isEmpty(headers)) { if (headers != null && !headers.isEmpty()) { for (Iterator<String> it = headers.keySet().iterator(); it .hasNext(); ) { String key = it.next(); String value = String.valueOf(headers.get(key)); httpPost.setHeader(key, value); } } } if (!CollectionUtils.isEmpty(params)) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); for (Iterator<String> it = params.keySet().iterator(); it .hasNext(); ) { String key = it.next(); Object obj = params.get(key); if (obj != null) { String value = String.valueOf(obj); nameValuePairs.add(new BasicNameValuePair(key, value)); } else { nameValuePairs.add(new BasicNameValuePair(key, null)); } } httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); } response = httpclient.execute(httpPost); HttpEntity entity = response.getEntity(); if (entity != null) { String result = EntityUtils.toString(entity, CharsetUtils.get("utf-8")); //20141205增加UTF-8 EntityUtils.consume(entity); return result; } else { EntityUtils.consume(entity); return null; } } catch (ClientProtocolException e) { throw e; } catch (IOException e) { throw e; } finally { try { if (response != null) { response.close(); } } catch (IOException e) { throw e; } } } /** * 使用post方式提交json数据<br> * 并将返回的信息也进行json格式化 */ public static Map<String, Object> postJson(String url, Map<String, Object> params) throws Exception { Gson gson = new Gson(); String json = gson.toJson(params); String resp = doPostText(url, json, true); log.info("resp:{}", resp); if (StringUtils.isNotBlank(resp)) { Map<String, Object> dataMap = gson.fromJson(resp, Map.class); if (dataMap == null) { return new HashMap<String, Object>(); } return dataMap; } return new HashMap<String, Object>(); } }
测试
import org.junit.Test; import java.util.HashMap; import java.util.Map; public class CreateUserTest { @Test public void createUserTest() throws Exception { Map<String, Object> paramMap = new HashMap<String, Object>(); String userId="5af2aebb478d200e400ec4d4"; paramMap.put("username", userId); paramMap.put("password", "123456"); Map<String, Object> headerMap = new HashMap<String, Object>(); headerMap.put("Content-Type", "application/x-www-form-urlencoded"); headerMap.put("Authorization", String.format("Basic %s", "dG9vX3VzZXJfcHJvZDo5OTk5OTk=")); String result = HttpRequestClient.doPost( "https://xx.dd.cn/oauth/user", headerMap, paramMap, true, null); if (StringUtils.isBlank(result) || (result.indexOf("ok") == -1&& result.indexOf("duplicated") == -1) ) { throw new IllegalStateException("创建Oauth2用户失败。userid: " + userId); } } }
相关推荐
例子在协程中的用法可能是: from th2c import AsyncHTTP2Clientfrom tornado . httpclient import HTTPRequestclient = AsyncHTTP2Client ( host = 'nghttp2.org' , port = 443 , secure = True ,)request = ...
在上面的示例中,我们创建了一个 `HttpRequestClient` 类,用于初始化 Retrofit 客户端。我们使用 `OkHttpClient` 创建了一个客户端,并添加了一个 log 拦截器用于日志显示。 三、上传文件 在使用 Retrofit2.0 ...
JSONObject jsonObject = new JSONObject(HttpRequestClient.executeRequest(Constant.Url.GET_FOLLOW_GOODS_URL, param, true)); ResponseInfo responseInfo = new ResponseInfo(); try { if (jsonObject....
ImageLoaderTask 使用内存缓存和OkHttp3加载图像的模块还支持Get Request要求HttpRequestClient库可以包含在任何Android应用程序中。 HttpRequestClient库支持Android 4.4(Kitkat)及更高版本。在应用程序中使用...
内容概要:本文详细介绍了基于FPGA的四相八拍步进电机控制系统的开发过程。主要内容包括:1. 使用VHDL和Verilog编写LED显示屏驱动代码,用于显示角度、学号和姓名等信息;2. 实现步进电机的正反转控制,通过状态机管理相序变化;3. 开发加速减速控制模块,确保电机启动和停止时的平稳性;4. 设计调速功能,通过调节脉冲频率实现速度控制。此外,文中还讨论了调试过程中遇到的问题及其解决方案。 适合人群:对FPGA开发和步进电机控制感兴趣的电子工程师、嵌入式系统开发者以及相关专业的学生。 使用场景及目标:适用于需要高精度运动控制的应用场合,如工业自动化、机器人技术和精密仪器等领域。目标是帮助读者掌握FPGA控制步进电机的基本原理和技术细节。 其他说明:文中提供了详细的代码片段和调试经验分享,有助于读者更好地理解和应用所学知识。同时,作者还提到了一些实用技巧,如通过PWM调节实现多级变速,以及如何避免步进电机的共振问题。
内容概要:本文详细介绍了基于Android Studio开发的日历备忘录记事本项目,涵盖日历查看、添加备忘录、闹钟提醒和删除备忘录等功能。项目使用SQLite数据库进行数据存储,通过CalendarView、EditText、Button等控件实现用户交互,并利用AlarmManager和PendingIntent实现闹钟提醒功能。此外,项目还包括数据库的设计与管理,如创建DatabaseHelper类来管理数据库操作,确保数据的安全性和完整性。文章还探讨了一些常见的开发技巧和注意事项,如时间戳的使用、手势监听的实现等。 适用人群:适用于初学者和有一定经验的Android开发者,尤其是希望深入了解Android开发基础知识和技术细节的人群。 使用场景及目标:该项目旨在帮助开发者掌握Android开发的基本技能,包括UI设计、数据库操作、闹钟提醒机制等。通过实际项目练习,开发者能够更好地理解和应用这些技术,提升自己的开发能力。 其他说明:文中提到一些进阶任务,如用Room替换SQLite、增加分类标签、实现云端同步等,鼓励开发者进一步扩展和优化项目。同时,项目源码公开,便于学习和参考。
内容概要:本文档详细介绍了一个基于SVM(支持向量机)和Adaboost集成学习的时间序列预测项目。该项目旨在通过结合这两种强大算法,提升时间序列预测的准确性和稳定性。文档涵盖了项目的背景、目标、挑战及其解决方案,重点介绍了模型架构、数据预处理、特征选择、SVM训练、Adaboost集成、预测与误差修正等环节。此外,文档还探讨了模型在金融市场、气象、能源需求、交通流量和医疗健康等多个领域的应用潜力,并提出了未来改进的方向,如引入深度学习、多任务学习、联邦学习等先进技术。 适合人群:具备一定机器学习基础的研究人员和工程师,特别是那些从事时间序列预测工作的专业人士。 使用场景及目标:①用于金融市场、气象、能源需求、交通流量和医疗健康等领域的复杂时间序列数据预测;②通过结合SVM和Adaboost,提升预测模型的准确性和稳定性;③处理噪声数据,降低计算复杂度,提高模型的泛化能力和实时预测能力。 其他说明:文档不仅提供了详细的理论解释,还附有完整的Matlab代码示例和GUI设计指导,帮助读者理解和实践。此外,文档还讨论了模型的部署与应用,包括系统架构设计、实时数据流处理、可视化界面、GPU加速推理等方面的技术细节。
#游戏之追逐奶酪123
内容概要:本文详细介绍了威纶通触摸屏配方管理系统的实现方法及其应用场景。首先,文章讲解了配方管理的基本概念和技术背景,强调了配方管理在工业自动化中的重要性。接着,通过具体的宏程序代码示例,展示了如何实现配方的保存、加载以及安全校验等功能。文中还提到配方数据结构的设计,如使用寄存器地址偏移来确保数据不冲突,并通过CSV文件格式方便地管理和维护配方数据。此外,文章深入探讨了UI设计方面的内容,包括动态图层技术和按钮交互效果的应用,使得用户界面更加友好和直观。最后,作者分享了一些实际项目中的经验和技巧,如文件操作的异常处理和宏指令调试方法。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对触摸屏配方管理系统感兴趣的读者。 使用场景及目标:适用于需要频繁切换设备参数的生产环境,如食品加工、注塑成型等行业。通过使用威纶通触摸屏配方管理系统,可以提高工作效率,减少人为错误,同时简化设备调试和维护流程。 其他说明:附带的工具包提供了完整的宏指令注释版、图库资源和调试工具,帮助用户更好地理解和应用该系统。
张彩明-图形学简明教程 PPT课件
计算机术语.pdf
内容概要:本文详细介绍了利用改进粒子群算法(IPSO)进行微电网多目标优化调度的方法和技术。首先指出了传统粒子群算法(PSO)存在的局限性,如初始化随机性和易陷入局部最优等问题。接着提出了多种改进措施,包括混沌映射初始化、动态权重调整、自适应变异以及引入帕累托前沿机制等。文中通过具体的代码实例展示了这些改进的具体实现,并通过实验验证了改进后的算法在处理微电网优化调度问题时的有效性,尤其是在应对风光发电不确定性方面表现突出。此外,文章还讨论了实际应用场景中的约束处理方法,如功率平衡约束的修复策略,确保理论与实践相结合。 适合人群:对智能优化算法及其在电力系统特别是微电网中的应用感兴趣的科研人员、工程师及研究生。 使用场景及目标:适用于需要对微电网进行多目标优化调度的研究和工程项目,旨在提高微电网运行效率,降低成本并减少环境污染。通过学习本文提供的改进算法和技术手段,能够更好地理解和掌握如何针对特定业务场景定制化地改进经典优化算法。 其他说明:文章不仅提供了详细的理论分析和算法改进思路,还包括了大量的代码片段和实验结果,有助于读者深入理解并快速应用于实际项目中。
内容概要:本文详细介绍了基于西门子S7-1200 PLC和组态王的7车位3x3升降横移立体车库控制系统的设计与实现。主要内容涵盖IO分配、梯形图程序、接线图、组态画面设计以及安全防护逻辑等方面。文中强调了硬件互锁、软件互锁、模块化编程、精确控制和平移控制等关键技术点,并分享了一些调试经验和注意事项。此外,还讨论了光电传感器误触发、急停按钮处理、故障记录等实际应用中的挑战及其解决方案。 适合人群:从事工业自动化领域的工程师和技术人员,特别是熟悉PLC编程和组态软件使用的专业人员。 使用场景及目标:适用于需要设计和实施立体车库控制系统的工程项目。目标是帮助读者掌握S7-1200 PLC与组态王的具体应用方法,提高系统可靠性和安全性。 其他说明:文中提供了详细的代码片段和配置示例,有助于读者更好地理解和实践相关技术。同时,作者分享了许多宝贵的实战经验,对于初学者和有一定经验的技术人员都非常有价值。
内容概要:本文详细介绍了线性表及其顺序表示的概念、原理和操作。线性表作为一种基础数据结构,通过顺序表示将元素按顺序存储在连续的内存空间中。文中解释了顺序表示的定义与原理,探讨了顺序表与数组的关系,并详细描述了顺序表的基本操作,包括初始化、插入、删除和查找。此外,文章分析了顺序表的优点和局限性,并讨论了其在数据库索引、图像处理和嵌入式系统中的实际应用。最后,对比了顺序表和链表的性能特点,帮助读者根据具体需求选择合适的数据结构。 适合人群:计算机科学专业的学生、软件开发人员以及对数据结构感兴趣的自学者。 使用场景及目标:①理解线性表顺序表示的原理和实现;②掌握顺序表的基本操作及其时间复杂度;③了解顺序表在实际应用中的优势和局限性;④学会根据应用场景选择合适的数据结构。 其他说明:本文不仅提供了理论知识,还附带了具体的代码实现,有助于读者更好地理解和实践线性表的相关概念和技术。
计算机数学1 -5 重言式与蕴含式.pdf
内容概要:本文详细介绍了风电永磁直驱发电并网系统的构成及其关键控制部分。首先探讨了真实的风速模型构建方法,利用MATLAB生成带有随机扰动和突风成分的风速曲线,用于模拟自然界的风况。接着深入解析了永磁电机的转速控制机制,特别是最大功率点跟踪(MPPT)算法的具体实现方式,以及如何通过PI控制器调节电磁转矩。随后讨论了并网过程中LCL滤波器的设计要点,确保谐波失真小于3%的同时保持系统稳定性。此外,还涉及到了网侧变流器的锁相环(PLL)设计,增强了其在电网电压跌落情况下的快速跟踪能力。最后讲述了整套系统联调时遇到的问题及解决方案,如协同惯量控制策略应对电网扰动等。 适合人群:从事风力发电研究的技术人员、高校相关专业师生、对新能源发电感兴趣的工程爱好者。 使用场景及目标:适用于希望深入了解永磁直驱风力发电系统的工作原理和技术细节的人群。目标是掌握从风速建模到最终并网控制的完整流程,能够独立进行系统仿真和优化。 其他说明:文中提供了大量具体的代码示例,涵盖MATLAB、Python、C等多种编程语言,有助于读者更好地理解和实践所介绍的内容。
资源内项目源码是均来自个人的课程设计、毕业设计或者具体项目,代码都测试ok,包含核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,答辩评审绝对信服的,拿来就能用。放心下载使用!源码、数据集、部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.dataset.txt文件,仅供学习参考, 切勿用于商业用途。
本程序使用于:思迅软件、科脉软件、百威软件、泰格软件、嬴通软件等。 安装配置完连接参数后,用默认管理员账号:辞郁,密码:ciyu登录,主界面左上角,双击输入管理员辞郁密码:ciyu 进入设计模式。下载内容中有详细示例截图。 辞郁POP打印工具是一款专业的打印解决方案,主要针对零售行业的商品POP促销单。它支持多种零售软件系统,包括但不限于思迅软件、科脉软件、百威软件、泰格软件和嬴通软件。这种工具的出现极大地便利了零售业者在商品推广和营销方面的操作,通过快速生成并打印商品促销单,帮助商家更好地吸引顾客、提升销售业绩。
内容概要:本文详细介绍了利用蒙特卡洛法对电动汽车负荷进行预测的方法。首先解释了基本原理,即通过建立电动汽车出行时间、行驶里程和充电时间的概率模型,采用蒙特卡洛法进行抽样并累加每辆车的充电负荷,从而得出负荷预测结果。随后展示了具体的MATLAB代码实现,包括初始化参数设置、蒙特卡洛仿真循环、结果处理和可视化。代码中涉及到随机数生成、概率分布、数组操作等关键技术点。通过对不同类型的电动汽车(如私家车和出租车)进行建模,模拟了它们的充电行为,并分析了充电负荷的时间分布特点。最后讨论了模型的可扩展性和改进方向,如引入智能充电策略等。 适合人群:对电力系统、电动汽车技术和蒙特卡洛仿真方法感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于研究和评估电动汽车对电网的影响,帮助规划和设计充电基础设施,确保电网稳定运行。同时,也为进一步优化充电策略提供了理论支持。 其他说明:文中提供的MATLAB代码可以作为学习和研究的基础,用户可以根据具体情况进行修改和完善。此外,还提到了一些常见的编程技巧和注意事项,有助于提高代码质量和效率。
内容概要:本文详细介绍了如何利用Python进行电网故障仿真,重点在于不同类型故障(单相接地、相间短路、相间短路接地)下的序分量分析。文中首先准备了必要的工具包,定义了系统参数,并通过具体的代码实例展示了如何计算和可视化各种故障状态下的正序、负序和零序分量。此外,还讨论了不同类型的故障对序分量的具体影响及其在继电保护中的应用。通过这些仿真,能够更好地理解和预测保护装置的动作特性。 适合人群:从事电力系统分析、继电保护设计以及相关领域的工程师和技术人员。 使用场景及目标:适用于研究和开发电力系统的故障检测和保护机制,帮助工程师们优化继电保护装置的参数设置,提高电力系统的稳定性和可靠性。 其他说明:文章强调了仿真过程中需要注意的关键点,如接地电阻设置、变压器接线方式、线路参数单位等,确保仿真结果的准确性。同时,提供了多个代码片段作为参考,便于读者快速上手实践。