项目需要提供接口给.NET团队使用,为方便大伙,特地写一个从Java接口生成C#可用Model包的工具Class
主Class是一个Controller,可以随时进行生成
package com.fang.microservice.cloud.controller; import com.alibaba.druid.sql.visitor.functions.Char; import com.fang.microservice.cloud.domain.MS_ServiceActionInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import springfox.documentation.annotations.ApiIgnore; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.lang.annotation.Annotation; import java.lang.reflect.*; import java.math.BigDecimal; import java.net.URLConnection; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * Created by Administrator on 2017/5/11. */ @RestController @ApiIgnore public class CodeController { /** * 代码生成服务,创建C#访问代码 * * @param request * @param platformCode * @param platformToken * @return */ @RequestMapping(value = "/servicecodeforcsharp", method = {RequestMethod.GET, RequestMethod.POST}) public void buildCodeFiles(HttpServletRequest request, HttpServletResponse response, String platformCode, String platformToken) throws IOException { //获取Web应用上下文 WebApplicationContext wc = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext()); LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer(); //创建临时目录 String tempDirectoryName = UUID.randomUUID().toString(); File tempDirectory = new File(tempDirectoryName); tempDirectory.mkdir(); //复制文件到临时目录 createResFile(wc, "ActionHandler.cs", tempDirectoryName); createResFile(wc, "NetUtility.cs", tempDirectoryName); createResFile(wc, "Proxy.cs", tempDirectoryName); //获取所有的Controller实例 Map<String, Object> controllerBeans = wc.getBeansWithAnnotation(RestController.class); //遍历Controller实例,创建访问文件 for (String beanKey : controllerBeans.keySet()) { //Controller映射访问路径 String controllerBasePath = ""; Object beanVal = controllerBeans.get(beanKey); Class beanClass = beanVal.getClass(); //判断是否是可对外的Controller Annotation apiAnnotation = beanClass.getAnnotation(Api.class); if (apiAnnotation == null) { continue; } //判断是否忽略 Annotation apiIgnoreAnnotation = beanClass.getAnnotation(ApiIgnore.class); if (apiIgnoreAnnotation != null) { continue; } //获取Controller基础地址 RequestMapping requestMappingAnnotation = (RequestMapping) beanClass.getAnnotation(RequestMapping.class); if (requestMappingAnnotation != null) { String[] vals = requestMappingAnnotation.value(); if (vals != null && vals.length > 0) { controllerBasePath = vals[0]; } } //创建Controller目录 createDirectory(tempDirectoryName + "/" + controllerBasePath); //获取输入模型顶级目录 String actionInModelDir = tempDirectoryName + "/" + controllerBasePath + "/In"; //创建Controller目录.输入模型In createDirectory(actionInModelDir); //创建输出模型顶级目录 String actionOutModelDir = tempDirectoryName + "/" + controllerBasePath + "/Out"; //创建Controller目录.输出模型Out createDirectory(actionOutModelDir); //获取所有对外服务方法 Method[] allMethods = beanClass.getDeclaredMethods(); for (Method method : allMethods) { //识别是否可对外方法 if (!method.isAnnotationPresent(RequestMapping.class)) { continue; } //获取方法路径映射 RequestMapping methodMappingAnnotation = method.getAnnotation(RequestMapping.class); //方法映射的访问地址 String methodRelUri = ""; String[] methodMappingVals = methodMappingAnnotation.value(); if (methodMappingVals != null && methodMappingVals.length > 0) { methodRelUri = methodMappingVals[0]; } //获取方法名称描述 String methodDescription = ""; ApiOperation methodApiOption = method.getAnnotation(ApiOperation.class); if (methodApiOption != null && methodApiOption.value() != null && !methodApiOption.value().equals("")) { methodDescription = methodApiOption.value(); } //方法的完整地址 String methodActionUri = controllerBasePath + methodRelUri; //获取方法输入参数 Parameter[] methodParameters = method.getParameters(); //获取方法返回结果 Class methodReturnClass = method.getReturnType(); HashMap<String, String> params = new HashMap<>(); String[] methodParameterNames = u.getParameterNames(method); int paramIndex = 0; for (Parameter param : methodParameters) { params.put(methodParameterNames[paramIndex], getParameterTypeString(param, actionInModelDir)); paramIndex++; } //方法输出结果类型字符串 String outputModelTypeString = methodReturnClass.getTypeName(); buildModelCodeString(methodReturnClass, actionOutModelDir); appendServiceAction(methodActionUri, outputModelTypeString, params, methodDescription); } } buildService(tempDirectoryName); buildZipFile(tempDirectoryName, "CSharp.zip"); tempDirectory.deleteOnExit(); File downloadFile = new File("CSharp.zip"); try { String mimeType = URLConnection.guessContentTypeFromName(downloadFile.getName()); if (mimeType == null) { mimeType = "application/octet-stream"; } response.setContentType(mimeType); String pathTmp = java.net.URLEncoder.encode("CSharp.zip", "UTF-8"); response.setHeader("Content-Disposition", String.format("inline; filename="" + pathTmp + """)); response.setContentLength((int) downloadFile.length()); InputStream inputStream = new BufferedInputStream(new FileInputStream(downloadFile)); FileCopyUtils.copy(inputStream, response.getOutputStream()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } finally { downloadFile.delete(); tempDirectory.delete(); } } private void buildModelCodeString(Class modelClass, String directoryName) { if (modelTypeList.contains(modelClass.getName())) { return; } modelTypeList.add(modelClass.getName()); StringBuilder txt = new StringBuilder(); txt.append("using System;").append(" "); txt.append("using System.Collections.Generic;").append(" "); txt.append(" "); String modelClassName = modelClass.getName(); txt.append("namespace ").append(modelClassName.replace("." + modelClass.getSimpleName(), "")).append(" "); txt.append("{ "); txt.append(" public class ").append(modelClass.getSimpleName()).append(" "); txt.append(" { "); for (Field field : modelClass.getDeclaredFields()) { try { txt.append(" public ").append(getFieldTypeString(field, directoryName)).append(" ").append(field.getName()).append(" { get; set; } "); } catch (Exception e) { e.printStackTrace(); } } txt.append(" } "); txt.append("}"); buildAndSaveFile(directoryName + "/" + modelClass.getSimpleName() + ".cs", txt.toString()); } /** * 检测和创建文件夹 * * @param directoryName */ private void createDirectory(String directoryName) { File directory = new File(directoryName); if (!directory.exists()) { directory.mkdirs(); } } /** * 从资源文件创建公共访问文件 * * @param wc * @param fileName * @param tempDirectoryName */ private void createResFile(WebApplicationContext wc, String fileName, String tempDirectoryName) { try { PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(); Resource[] resources = patternResolver.getResources("classpath*:csharp/" + fileName); if (resources != null && resources.length > 0) { InputStreamReader isr = new InputStreamReader(resources[0].getInputStream()); File destActionHandlerFile = new File(tempDirectoryName + "/" + fileName); if (!destActionHandlerFile.exists()) { destActionHandlerFile.createNewFile(); } char[] fileBytes = new char[256]; FileOutputStream fos = new FileOutputStream(destActionHandlerFile); OutputStreamWriter osw = new OutputStreamWriter(fos); int readCount = -1; do { readCount = isr.read(fileBytes); if (readCount > 0) { osw.write(fileBytes, 0, readCount); } } while (readCount > 0); osw.flush(); osw.close(); fos.flush(); fos.close(); isr.close(); } } catch (IOException e) { e.printStackTrace(); } } /** * 应用服务名称 */ @Value("${spring.application.name}") private String applicationName; /** * 获取应用服务短名称 * * @return */ private String getServiceName() { if (!applicationName.contains("-")) { return applicationName; } return applicationName.substring(applicationName.lastIndexOf('-') + 1); } /** * 创建和保存文件 * * @param fileName * @param content */ private void buildAndSaveFile(String fileName, String content) { File targetFile = new File(fileName); if (!targetFile.exists()) { try { targetFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } FileOutputStream outputStream; try { outputStream = new FileOutputStream(targetFile); OutputStreamWriter osw = new OutputStreamWriter(outputStream); osw.write(content); osw.flush(); } catch (IOException e) { e.printStackTrace(); } } /** * 把基础类型名称从Java转换为C# * * @param field 实体字段 * @param modelDirectoryName 实体存储目录 * @return */ private String getFieldTypeString(Field field, String modelDirectoryName) { Class fieldClass = field.getType(); if (fieldClass.equals(Integer.class) || fieldClass.equals(int.class)) { return "int"; } else if (fieldClass.equals(Long.class) || fieldClass.equals(long.class)) { return "long"; } else if (fieldClass.equals(BigDecimal.class)) { return "decimal"; } else if (fieldClass.equals(Byte.class) || fieldClass.equals(byte.class)) { return "byte"; } else if (fieldClass.equals(Short.class) || fieldClass.equals(short.class)) { return "short"; } else if (fieldClass.equals(Float.class) || fieldClass.equals(Float.class)) { return "float"; } else if (fieldClass.equals(Double.class) || fieldClass.equals(double.class)) { return "double"; } else if (fieldClass.equals(Boolean.class) || fieldClass.equals(boolean.class)) { return "bool"; } else if (fieldClass.equals(Char.class) || fieldClass.equals(char.class)) { return "char"; } else if (fieldClass.equals(String.class)) { return "string"; } else if (fieldClass.equals(Date.class)) { return "DateTime"; } else if (fieldClass.equals(Object.class)) { return "object"; } else { if (fieldClass.isAssignableFrom(List.class)) { Type fc = field.getGenericType(); if (fc instanceof ParameterizedType) // 【3】如果是泛型参数的类型 { ParameterizedType pt = (ParameterizedType) fc; Type[] genericTypes = pt.getActualTypeArguments(); if (genericTypes != null && genericTypes.length > 0) { Class genericClazz = (Class) genericTypes[0]; //【4】 得到泛型里的class类型对象。 if (!genericClazz.isPrimitive() && !genericClazz.equals(String.class) && !genericClazz.equals(Date.class) && !genericClazz.equals(BigDecimal.class) && !genericClazz.equals(String.class)) { buildModelCodeString(genericClazz, modelDirectoryName); } return "List<" + genericClazz.getName() + ">"; } else { return "List<" + fc.getTypeName() + ">"; } } else { return "List<" + fc.getClass().getName() + ">"; } } else { String className = fieldClass.getName(); buildModelCodeString(fieldClass, modelDirectoryName); return className; } } } /** * 把基础类型名称从Java转换为C# * * @param param 方法参数 * @param modelDirectoryName 实体存储目录 * @return */ private String getParameterTypeString(Parameter param, String modelDirectoryName) { Class parameterClass = param.getType(); if (parameterClass.equals(Integer.class) || parameterClass.equals(int.class)) { return "int"; } else if (parameterClass.equals(Long.class) || parameterClass.equals(long.class)) { return "long"; } else if (parameterClass.equals(BigDecimal.class)) { return "decimal"; } else if (parameterClass.equals(Byte.class) || parameterClass.equals(byte.class)) { return "byte"; } else if (parameterClass.equals(Short.class) || parameterClass.equals(short.class)) { return "short"; } else if (parameterClass.equals(Float.class) || parameterClass.equals(Float.class)) { return "float"; } else if (parameterClass.equals(Double.class) || parameterClass.equals(double.class)) { return "double"; } else if (parameterClass.equals(Boolean.class) || parameterClass.equals(boolean.class)) { return "bool"; } else if (parameterClass.equals(Char.class) || parameterClass.equals(char.class)) { return "char"; } else if (parameterClass.equals(String.class)) { return "string"; } else if (parameterClass.equals(Date.class)) { return "DateTime"; } else if (parameterClass.equals(Object.class)) { return "object"; } else { if (parameterClass.isAssignableFrom(List.class)) { Type fc = param.getType(); if (fc instanceof ParameterizedType) // 【3】如果是泛型参数的类型 { ParameterizedType pt = (ParameterizedType) fc; Type[] genericTypes = pt.getActualTypeArguments(); if (genericTypes != null && genericTypes.length > 0) { Class genericClazz = (Class) genericTypes[0]; //【4】 得到泛型里的class类型对象。 if (!genericClazz.isPrimitive() && !genericClazz.equals(String.class) && !genericClazz.equals(Date.class) && !genericClazz.equals(BigDecimal.class) && !genericClazz.equals(String.class)) { buildModelCodeString(genericClazz, modelDirectoryName); } return "List<" + genericClazz.getName() + ">"; } else { return "List<" + fc.getTypeName() + ">"; } } else { return "List<" + fc.getClass().getName() + ">"; } //buildModelCodeString(parameterClass, modelDirectoryName); //return "List<" + parameterClass.getName() + ">"; } else { String className = parameterClass.getName(); buildModelCodeString(parameterClass, modelDirectoryName); return className; } } } /** * 服务Action列表 */ private ArrayList<MS_ServiceActionInfo> serviceActionList = new ArrayList(); /** * 添加服务Action到列表中 * * @param serviceUri * @param outputModelType * @param params */ private void appendServiceAction(String serviceUri, String outputModelType, HashMap<String, String> params, String methodDescription) { MS_ServiceActionInfo sai = new MS_ServiceActionInfo(); sai.setTargetUri(serviceUri); sai.setOutputModel(outputModelType); sai.setParamsDic(params); sai.setActionDescription(methodDescription); serviceActionList.add(sai); } /** * 构建访问服务 * * @param tempDirectoryName 文件临时目录名称 */ private void buildService(String tempDirectoryName) { StringBuilder txt = new StringBuilder(); txt.append("using System;").append(" "); txt.append("using Fang.Contract.WebUtil;").append(" "); txt.append(" "); txt.append("namespace Fang.Contract.Biz.").append(getServiceName()).append(" "); txt.append("{ "); txt.append(" public class Service "); txt.append(" { "); for (MS_ServiceActionInfo sai : serviceActionList) { txt.append(" /// <summary> "); txt.append(" /// ").append(sai.getActionDescription()).append(" "); txt.append(" /// </summary> "); txt.append(" public static ").append(sai.getOutputModel()).append(" ").append(sai.buildMethodName()).append("(").append(sai.buildMethodDefineParameters()).append(") "); txt.append(" { "); if (sai.getParamsDic().keySet().size() == 1) { String parameterType = sai.getFirstParameterType(); String parameterName = sai.getFirstParameterName(); if (parameterType.contains(".")) { txt.append(" return Proxy.ExecHandler.GetResponseModel<" + sai.getOutputModel() + ">("" + applicationName + "", "" + sai.getTargetUri() + "", " + parameterName + "); "); } else { txt.append(" string PostData = ").append(sai.buildPostDataCode()).append("; "); txt.append(" return Proxy.ExecHandler.GetResponseModel<" + sai.getOutputModel() + ">("" + applicationName + "", "" + sai.getTargetUri() + "", PostData); "); } } else if (sai.getParamsDic().keySet().size() > 1) { txt.append(" string PostData = ").append(sai.buildPostDataCode()).append("; "); txt.append(" return Proxy.ExecHandler.GetResponseModel<" + sai.getOutputModel() + ">("" + applicationName + "", "" + sai.getTargetUri() + "", PostData); "); } txt.append(" } "); } txt.append(" } "); txt.append("}"); buildAndSaveFile(tempDirectoryName + "/" + "Service.cs", txt.toString()); } private ArrayList<String> modelTypeList = new ArrayList<>(); public void buildZipFile(String sourceDIR, String targetZipFile) { File targetFile = new File(targetZipFile); if (!targetFile.exists()) { try { targetFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } zip(targetZipFile, new File(sourceDIR)); } public boolean zip(String zipFileName, File... files) { ZipOutputStream out = null; BufferedOutputStream bo = null; try { createDir(zipFileName); out = new ZipOutputStream(new FileOutputStream(zipFileName)); for (int i = 0; i < files.length; i++) { if (null != files[i]) { zip(out, files[i], files[i].getName()); } } // 输出流关闭 out.close(); return true; } catch (Exception e) { e.printStackTrace(); } return false; } /** * 目录不存在时,先创建目录 * * @param zipFileName */ private static void createDir(String zipFileName) { String filePath = StringUtils.substringBeforeLast(zipFileName, "/"); File targetFile = new File(filePath); if (!targetFile.exists()) { //目录不存在时,先创建目录 targetFile.mkdirs(); } } /** * 执行压缩 * * @param out ZIP输入流 * @param f 被压缩的文件 * @param base 被压缩的文件名 */ private static void zip(ZipOutputStream out, File f, String base) { try { //压缩目录 if (f.isDirectory()) { try { File[] fl = f.listFiles(); // 创建zip实体 if (fl.length == 0) { out.putNextEntry(new ZipEntry(base + "/")); } // 递归遍历子文件夹 for (int i = 0; i < fl.length; i++) { zip(out, fl[i], base + "/" + fl[i].getName()); } } catch (IOException e) { e.printStackTrace(); } } else { //压缩单个文件 out.putNextEntry(new ZipEntry(base)); // 创建zip实体 FileInputStream in = new FileInputStream(f); BufferedInputStream bi = new BufferedInputStream(in); int b; while ((b = bi.read()) != -1) { // 将字节流写入当前zip目录 out.write(b); } //关闭zip实体 out.closeEntry(); // 输入流关闭 in.close(); } } catch (IOException e) { e.printStackTrace(); } } }
其中使用的Domain
package com.fang.microservice.cloud.domain; import java.util.HashMap; /** * Created by Administrator on 2017/5/9. */ public class MS_ServiceActionInfo { private String targetUri; private String outputModel; private HashMap<String, String> paramsDic = new HashMap<>(); private String actionDescription; public String getTargetUri() { return targetUri; } public void setTargetUri(String targetUri) { this.targetUri = targetUri; } public String getOutputModel() { return outputModel; } public void setOutputModel(String outputModel) { this.outputModel = outputModel; } public HashMap<String, String> getParamsDic() { return paramsDic; } public void setParamsDic(HashMap<String, String> paramsDic) { this.paramsDic = paramsDic; } public String getActionDescription() { return actionDescription; } public void setActionDescription(String actionDescription) { this.actionDescription = actionDescription; } /** * 构建请求方法名 * @return */ public String buildMethodName() { String tempName = targetUri.replace("/", "_"); if (targetUri.startsWith("/")) { tempName = tempName.substring(1); } tempName = tempName.substring(0, 1).toUpperCase() + tempName.substring(1); return tempName; } /** * 构建POST数据 * @return */ public String buildPostDataCode() { StringBuilder txt = new StringBuilder(); int paramIndex = 0; for (String paramName : paramsDic.keySet()) { paramIndex++; if (paramIndex < paramsDic.keySet().size()) { txt.append(""").append(paramName).append("="").append(" + ").append(paramName).append(" + "&" + "); } else { txt.append(""").append(paramName).append("="").append(" + ").append(paramName); } } return txt.toString(); } /** * 构建方法请求列表 * @return */ public String buildMethodCallParameters(){ StringBuilder txt = new StringBuilder(); int paramIndex = 0; for (String paramName : paramsDic.keySet()) { paramIndex++; if (paramIndex < paramsDic.keySet().size()) { txt.append(paramName).append(", "); } else { txt.append(paramName); } } return txt.toString(); } /** * 构建方法定义参数列表 * @return */ public String buildMethodDefineParameters(){ StringBuilder txt = new StringBuilder(); int paramIndex = 0; for (String paramName : paramsDic.keySet()) { paramIndex++; if (paramIndex < paramsDic.keySet().size()) { txt.append(paramsDic.get(paramName)).append(" ").append(paramName).append(", "); } else { txt.append(paramsDic.get(paramName)).append(" ").append(paramName); } } return txt.toString(); } /** * 在参数唯一时获取参数类型 * @return */ public String getFirstParameterType(){ for(String paramName : paramsDic.keySet()){ return paramsDic.get(paramName); } return ""; } /** * 在参数唯一时获取参数名 * @return */ public String getFirstParameterName(){ for(String paramName : paramsDic.keySet()){ return paramName; } return ""; } }
实际场景:
在Spring Cloud项目中,Zuul网关定制一个界面,提供所有服务的聚合列表,列表中提供每一个服务可用接口Model生成地址,该地址指向本文中Controller中的生成地址,对接方可在页面上直接获取到调用服务所用的C#版本Model的Zip压缩包,直接解压缩到本地项目即可使用。
为方便C#同事使用,特提供C#版本访问代理工具类(因本人曾是C#程序员)
using System; using System.Collections.Generic; namespace Fang.Contract.WebUtil { /// <summary> /// 服务环境标识 /// </summary> public enum EnviormentEnum { /// <summary> /// 测试环境 /// </summary> test, /// <summary> /// 生产环境 /// </summary> prod } public class ActionHandler { /// <summary> /// 请求环境 /// </summary> private EnviormentEnum ServiceEnviorment { get; set; } /// <summary> /// 系统请求基础域名 /// </summary> private string ServiceDomain { get { if (ServiceEnviorment == EnviormentEnum.test) { return "zuul.center.contract.microservice.test.fang.com"; } else if (ServiceEnviorment == EnviormentEnum.prod) { return "zuul.contract.microservice.ggpt.fang.com"; } else { return string.Empty; } } } /// <summary> /// 请求平台名称 /// </summary> public string PlatformCode = "WEB"; /// <summary> /// 请求平台令牌 /// </summary> public string PlatformToken = "f13f6f52-28b0-11e7-9269-a0423f2f18c8"; /// <summary> /// 请求认证Header /// </summary> private Dictionary<string, string> PlatformHeader = new Dictionary<string, string>(); /// <summary> /// 服务�? /// </summary> public string ServiceId { get; set; } /// <summary> /// 服务地址 /// </summary> public object ServiceUrl { get; set; } public ActionHandler() { } public ActionHandler(EnviormentEnum _Enviroment, string _PlatformCode, string _PlatformToken) { this.ServiceEnviorment = _Enviroment; this.PlatformCode = _PlatformCode; this.PlatformToken = _PlatformToken; this.PlatformHeader.Add(this.PlatformCode, this.PlatformToken); } private string BuildServiceUri() { return "http://" + ServiceDomain + "/" + ServiceId + "/" + ServiceUrl; } /// <summary> /// 获得字符串数�? /// </summary> /// <param name="ServiceId">服务Id</param> /// <param name="ServiceUrl">服务地址</param> /// <param name="RequestModel">输入实体</param> /// <returns></returns> public string GetResponseString(string ServiceId, string ServiceUrl, object RequestModel) { NetUtility wu = new NetUtility(); string requestText = Newtonsoft.Json.JsonConvert.SerializeObject(RequestModel); string url = BuildServiceUri(); string responseText = wu.DoPost(url, requestText, this.PlatformHeader); return responseText; } /// <summary> /// 获得字符串数�? /// </summary> /// <param name="ServiceId">服务Id</param> /// <param name="ServiceUrl">服务地址</param> /// <param name="PostData">输入文本</param> /// <returns></returns> public string GetResponseString(string ServiceId, string ServiceUrl, string PostData) { NetUtility wu = new NetUtility(); string requestText = PostData; string url = BuildServiceUri(); string responseText = wu.DoPost(url, requestText, this.PlatformHeader); return responseText; } /// <summary> /// 获得实体对象 /// </summary> /// <typeparam name="T">输出实体类型</typeparam> /// <param name="ServiceId">服务Id</param> /// <param name="ServiceUrl">服务地址</param> /// <param name="RequestModel">输入实体</param> /// <returns></returns> public T GetResponseModel<T>(string ServiceId, string ServiceUrl, object RequestModel) { try { string data = GetResponseString(ServiceId, ServiceUrl, RequestModel); if (string.IsNullOrEmpty(data)) { return default(T); } return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(data); } catch (Exception) { return default(T); } } /// <summary> /// 获得实体对象 /// </summary> /// <typeparam name="T">输出实体类型</typeparam> /// <param name="ServiceId">服务Id</param> /// <param name="ServiceUrl">服务地址</param> /// <param name="RequestModel">输入实体</param> /// <returns></returns> public T GetResponseModel<T>(string ServiceId, string ServiceUrl, string PostData) { try { string data = GetResponseString(ServiceId, ServiceUrl, PostData); if (string.IsNullOrEmpty(data)) { return default(T); } return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(data); } catch (Exception) { return default(T); } } } }
using Fang.Contract.WebUtil; namespace Fang.Contract.Biz { public class Proxy { private static ActionHandler handler; public static ActionHandler ExecHandler { get { if (handler == null) { handler = new ActionHandler(EnviormentEnum.test, "", ""); } return handler; } } } }
using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Net; using System.Text; namespace Fang.Contract.WebUtil { /// <summary> /// 网络工具类 /// </summary> [Description("网络工具类")] public sealed class NetUtility { /// <summary> /// 请求超时时间 /// </summary> private int _timeout = 100000; /// <summary> /// 请求与响应的超时时间 /// </summary> public int Timeout { get { return this._timeout; } set { this._timeout = value; } } #region POST请求 /// <summary> /// 执行HTTP POST请求 /// </summary> /// <param name="url">请求地址</param> /// <param name="parameters">请求参数</param> /// <returns>HTTP响应</returns> public string DoPost(string url, string postText, Dictionary<string, string> headers) { try { HttpWebRequest req = GetWebRequest(url, "POST"); req.ContentType = "application/x-www-form-urlencoded;charset=utf-8"; if (headers != null && headers.Count > 0) { foreach (string key in headers.Keys) { req.Headers.Add(key, headers[key]); } } byte[] postData = Encoding.UTF8.GetBytes(postText); Stream reqStream = req.GetRequestStream(); reqStream.Write(postData, 0, postData.Length); reqStream.Close(); HttpWebResponse rsp = (HttpWebResponse)req.GetResponse(); Encoding encoding = Encoding.GetEncoding("utf-8"); return GetResponseAsString(rsp, encoding); } catch { return string.Empty; } } #endregion /// <summary> /// 获取HTTP请求对象 /// </summary> /// <param name="url"></param> /// <param name="method"></param> /// <returns></returns> public HttpWebRequest GetWebRequest(string url, string method) { HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.ServicePoint.Expect100Continue = false; req.Method = method; req.KeepAlive = true; req.UserAgent = ""; req.Timeout = this._timeout; req.ReadWriteTimeout = this._timeout; return req; } /// <summary> /// 把响应流转换为文本 /// </summary> /// <param name="rsp">响应流对象</param> /// <param name="encoding">编码方式</param> /// <returns>响应文本</returns> public string GetResponseAsString(HttpWebResponse rsp, Encoding encoding) { Stream stream = null; StreamReader reader = null; try { // 以字符流的方式读取HTTP响应 stream = rsp.GetResponseStream(); reader = new StreamReader(stream, encoding); return reader.ReadToEnd(); } finally { // 释放资源 if (reader != null) reader.Close(); if (stream != null) stream.Close(); if (rsp != null) rsp.Close(); } } } }