zoukankan      html  css  js  c++  java
  • Java生成C#可用Model包

    项目需要提供接口给.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();
                }
            }
        }
    }
    

      

  • 相关阅读:
    《程序设计与数据结构》 课程教学
    ISO GPS定位,坐标转换以及如何显示
    iOS_生成pem推送证书(用于百度云推送)
    iOS 基础-----关于UIView 的 frame 与 bounds
    IOS开发之UIScrollVIew运用
    ios 精简日历
    IOS UIView自动调整尺寸
    IOS 实现录音PCM转MP3格式(边录音边转码)
    IOS开发UIImage中stretchableImageWithLeftCapWidth方法的解释
    ios Coredata 关联 UITableView 数据自动更新
  • 原文地址:https://www.cnblogs.com/lixx/p/9394752.html
Copyright © 2011-2022 走看看