读取API文档获得前后端对接信息

需要事先将api模块打成jar,这样就可以只读取该jar里面的controller

import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import lombok.var;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.*;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ApiReader {

    public static void main(String[] args) {
        new ApiReader().read();
    }

    private void read() {
        File api=new File("api");
        var target=new File(api,"target");
        var jars=target.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".jar");
            }
        });
        Preconditions.checkArgument(jars.length==1);

        List<Class> clazzs = new ArrayList<Class>();

        JarFile jarFile = null;
        try {
            jarFile = new JarFile(jars[0]);
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        List<JarEntry> jarEntryList = new ArrayList<JarEntry>();

        Enumeration<JarEntry> ee = jarFile.entries();
        while (ee.hasMoreElements()) {
            JarEntry entry = (JarEntry) ee.nextElement();
            // 过滤我们出满足我们需求的东西
            if ( entry.getName().endsWith(".class")) {
                jarEntryList.add(entry);
            }
        }
        for (JarEntry entry : jarEntryList) {
            String className = entry.getName().replace('/', '.');
            className = className.substring(0, className.length() - 6);
            // 也可以采用如下方式把类加载成一个输入流
            // InputStream in = jarFile.getInputStream(entry);
            try {
                clazzs.add(Thread.currentThread().getContextClassLoader()
                        .loadClass(className));
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        clazzs.stream().filter(c->c.getName().endsWith("Controller")).forEach(controller->consume(controller));
    }

    private void consume(Class<?> controller) {
        var api=controller.getAnnotation(Api.class);
        if(null==api){
            System.err.println("can not get Api from "+controller.getName());
            return;
        }
        Page page=new Page();
        page.setName(api.tags()[0]);
        page.setController(controller);
        Stream.of(controller.getDeclaredMethods()).forEach(method -> {
            Page.Function i=page.new Function();
            page.getFunctions().add(i);
            i.setJavaMethod(method);
            String methodName = controller.getName() + "." + method.getName();
            ApiOperation apiOperation=method.getAnnotation(ApiOperation.class);
            if(null==apiOperation){
                System.err.println("can not get operation from " + methodName);
            }else{
                i.setName(apiOperation.value());
            }
            RequestMapping requestMapping= AnnotationUtils.findAnnotation(method,RequestMapping.class);
            if(null==requestMapping){
                System.err.println("can not get request mapping from "+methodName);
            }else{
                var methods=requestMapping.method();
                if(methods.length==1){
                    RequestMethod m = requestMapping.method()[0];
                    i.setHttpMethod(m);
                    String[] paths = requestMapping.value();
                    switch (m){
                        case GET:
                            GetMapping getMapping=method.getAnnotation(GetMapping.class);
                            if(null!=getMapping){
                                paths=getMapping.value();
                            }
                            break;
                        case POST:
                            PostMapping postMapping=method.getAnnotation(PostMapping.class);
                            if(null!=postMapping){
                                paths=postMapping.value();
                            }
                            break;
                        case PUT:
                            PutMapping putMapping=method.getAnnotation(PutMapping.class);
                            if(null!=putMapping){
                                paths=putMapping.value();
                            }
                            break;
                        case PATCH:
                            PatchMapping patchMapping=method.getAnnotation(PatchMapping.class);
                            if(null!=patchMapping){
                                paths=patchMapping.value();
                            }
                            break;
                        case DELETE:
                            DeleteMapping deleteMapping=method.getAnnotation(DeleteMapping.class);
                            if(null!=deleteMapping){
                                paths=deleteMapping.value();
                            }
                            break;
                    }
                    if(paths.length==1){
                        i.setPath(paths[0]);
                    }else{
                        System.err.println("can not get path from "+methodName);
                    }
                }else{
                    System.err.println("can not get HttpMethod from "+methodName);
                }

            }
        });
        System.out.println(page);
    }

    @Data
    public static class Page {
        private String name;
        @Data
        class Function {
            private String name;
            private RequestMethod httpMethod;
            private String path;
            private Method javaMethod;
    
            @Override
            public String toString() {
                return "接口:"+name+"\t,来自"+javaMethod.getName()+"\t,请求方式为:"+ httpMethod +" "+path;
            }
        }
        private List<Function> functions = Lists.newArrayList();
        private Class<?> controller;
    
        @Override
        public String toString() {
            return "页面:"+name+"\t,来自"+controller.getName()+"\t,包含以下方法:\n"+ functions.stream().map(i->"\t"+i+"\n").collect(Collectors.joining());
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下代码进行淘宝 API对接,以读取指定商品的价格信息:import requestsurl = 'https://api.taobao.com/{version}/{namespace}/{method}'headers = { 'Authorization': 'Bearer {token}', 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8' }data = { 'item_id': '123456' }response = requests.post(url, headers=headers, data=data)price_info = response.json()['data']['price'] ### 回答2: 要对接淘宝的API读取商品的价格信息,以下是一段简单的示例代码。 首先,你需要安装Python的HTTP请求库requests和淘宝SDK。 ```python import requests from taobao import * # 设置淘宝开放平台的appkey和appsecret appkey = 'your_appkey' appsecret = 'your_appsecret' # 设置请求的URL和参数 url = 'https://eco.taobao.com/router/rest' params = { 'method': 'taobao.item.get', 'app_key': appkey, 'format': 'json', 'v': '2.0', 'fields': 'price', 'num_iids': '12345678' } # 发送请求并获取响应 response = requests.get(url, params=params) result_json = response.json() # 解析响应数据 if 'item' in result_json: item = result_json['item'] price = item['price'] print('商品价格为:', price) else: print('获取商品信息失败') ``` 以上代码将使用requests库发送HTTP GET请求到淘宝API的`taobao.item.get`接口,通过`num_iids`参数传入商品的ID,获取该商品的价格信息。请记得将`your_appkey`和`your_appsecret`替换为你在淘宝开放平台申请的App Key和App Secret。 需要注意的是,以上代码仅为简单示例,实际开发中可能还需要处理认证、错误处理、结果的保存等其他逻辑。本示例只是一个起点,具体的对接过程和实现会根据你所选择的具体的淘宝API和业务需求而有所不同。 ### 回答3: 要对接淘宝的API,并读取商品的价格信息,可以按照以下步骤进行: 1. 首先,注册成为淘宝开放平台的开发者,并创建一个应用,获取到App Key和App Secret,这是后续进行API调用的凭证。 2. 选择合适的API接口,淘宝提供了多种API接口,可以根据需求选择获取商品价格信息接口,例如"淘宝客商品详情查询"接口。 3. 在代码中引入相关的API调用库,例如可以使用Python的requests库发送HTTP请求。 4. 在代码中设置请求参数,包括App Key、App Secret、API接口名以及其他必要的参数,例如要查询的商品ID。 5. 构建请求URL,将参数拼接到URL中。 6. 使用HTTP请求方法发送请求,并获取服务器返回的响应。 7. 解析服务器返回的响应,获取商品的价格信息。 8. 对返回的价格信息进行处理和展示,可以将价格信息输出到控制台,或者保存到文件中。 需要注意的是,对接淘宝的API需要遵循淘宝开放平台的相关规范和安全机制,例如签名验证等。在代码开发过程中,可以参考淘宝开放平台的文档和示例代码,以确保API调用的正确性和安全性。 总之,根据以上步骤,编写代码可以实现对接淘宝的API,并读取商品的价格信息。具体实现过程可能因编程语言而异,可以根据具体情况进行调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值