OpenAPI的使用代码-判断用户名和密码

原文地址:

http://www.java2000.net/p7714
http://blog.youkuaiyun.com/java2000_net/archive/2008/07/30/2736268.aspx

此文的版权归JAVA世纪网(www.java2000.net)和优快云(www.youkuaiyun.com)所有,转载请保留此声明、代码注释和原始链接

 

 

 

优快云的 OpenAPI 提供了WebService 接口,可以使用一些现有的框架直接生成客户端调用程序,比如axis。我这里提供了另外一个简单那的方法,直接使用URLConnection进行操作,并自行解析登录的结果。

 

方法的说明
  /**
   * 检查用户名和密码。
   *
   * @author 赵学庆,www.java2000.net
   * @param username 用户名
   * @param password 密码
   * @return 如果成功,则返回true,失败返回false
   */
  public static boolean checkLogin(String username, String password)


 

准备数据:
OpenAPI里面提供了GetUserProfile的方法

我们看一下协议里面的请求部分的格式,SOAP1.2格式
http://forum.youkuaiyun.com/OpenApi/forumapi.asmx?op=GetUserProfile

 

POST /OpenApi/forumapi.asmx HTTP/1.1
Host: forum.youkuaiyun.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetUserProfile xmlns="http://www.youkuaiyun.com/">
      <identity>
        <username>string</username>
        <password>string</password>
      </identity>
      <username>string</username>
    </GetUserProfile>
  </soap12:Body>
</soap12:Envelope>

 

此方法需要提供3个参数。
1 会员用户名
2 会员的密码
3 要查看人员的用户名

 

比如你想看aaa的情况,你的用户名和密码是bbb/ccc,则调用为
GetUserProfile(bbb,ccc,aaa);
我们使用中,可以让aaa和bbb相等,也就是自己看自己。

 

我们看着部分代码

    // 以下构造提交用的web服务的内容
    StringBuilder b = new StringBuilder();
    b.append("<?xml version=/"1.0/" encoding=/"utf-8/"?>");
    b.append("<soap12:Envelope xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" ");
    b.append("xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" ");
    b.append("xmlns:soap12=/"http://www.w3.org/2003/05/soap-envelope/">");
    b.append("<soap12:Body>");
    // 这里是调用的功能标识
    b.append(" <GetUserProfile xmlns=/"http://www.youkuaiyun.com//">");
    // 这里是调用的用户信息标识
    b.append("  <identity>");
    // 登录用户名
    b.append("   <username>" + username + "</username>");
    // 登录密码
    b.append("   <password>" + password + "</password>");
    b.append("  </identity>");
    // 要查看的用户名,和登录用户相同
    b.append("  <username>" + username + "</username>");
    b.append(" </GetUserProfile>");
    b.append("</soap12:Body>");
    b.append("</soap12:Envelope>");

 

 

数据的提交
直接使用URLConnection进行模拟的POST提交,并读取提交的结果

 

    // 提交数据,并获取返回结果
    String textXml = postPage("http://forum.youkuaiyun.com/OpenApi/forumapi.asmx", "forum.youkuaiyun.com",
        null, b.toString())[1];


其中的postPage我将放在最后面的代码列表里面

 


返回结果的分析
我们看一下协议里面的返回数据的格式,SOAP1.2格式


HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetUserProfileResponse xmlns="http://www.youkuaiyun.com/">
      <GetUserProfileResult>boolean</GetUserProfileResult>
      <profile>
        <point>int</point>
        <techExpertPoint>int</techExpertPoint>
        <topForums>
          <TopForum>
            <forumId>guid</forumId>
            <expertPoint>int</expertPoint>
            <rank>string</rank>
          </TopForum>
          <TopForum>
            <forumId>guid</forumId>
            <expertPoint>int</expertPoint>
            <rank>string</rank>
          </TopForum>
        </topForums>
        <nonTechExpertPoint>int</nonTechExpertPoint>
        <nickName>string</nickName>
        <username>string</username>
      </profile>
      <error>
        <errId>int</errId>
        <errInfo>string</errInfo>
        <description>string</description>
      </error>
    </GetUserProfileResponse>
  </soap12:Body>
</soap12:Envelope>

 

其中有用的就是  <GetUserProfileResult>boolean</GetUserProfileResult>

 

由于返回的是xml,可以采用
1 jdom等xml解析工具,我这个例子使用了jdom进行解析
2 可以直接用正则表达式

 

我们看代码
    // 使用jdom进行解析
    SAXBuilder builder = new SAXBuilder();
    Document doc = null;
    Reader in = new StringReader(textXml);
    try {
      doc = builder.build(in);
      Element root = doc.getRootElement();
      List ls = root.getChildren();// 注意此处取出的是root节点下面的一层的Element集合
      Element body = (Element) ls.get(0);
      Element response = (Element) body.getChildren().get(0);
      List content = response.getChildren();
      Element result = (Element) content.get(0);
      // 这个是运行结果的数据
      if ("GetUserProfileResult".equals(result.getName())) {
        // 失败
        if ("true".equals(result.getText())) {
          return true;
        }
      } else {
        return false;
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    } catch (JDOMException ex) {
      ex.printStackTrace();
    }

 


总结:
  我们可以通过系统提供的一个并非检测登录的服务接口,实现对用户登录信息的检测。我的网站可以使用csdn的用户名和密码登录,就是调用了这个方法进行判断。

 

 

完整的代码
  /**
   * 检查用户名和密码。
   *
   * @author 赵学庆,www.java2000.net
   * @param username 用户名
   * @param password 密码
   * @return 如果成功,则返回true,失败返回false
   */
  public static boolean checkLogin(String username, String password) {
    // 以下构造提交用的web服务的内容
    StringBuilder b = new StringBuilder();
    b.append("<?xml version=/"1.0/" encoding=/"utf-8/"?>");
    b.append("<soap12:Envelope xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" ");
    b.append("xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" ");
    b.append("xmlns:soap12=/"http://www.w3.org/2003/05/soap-envelope/">");
    b.append("<soap12:Body>");
    // 这里是调用的功能标识
    b.append(" <GetUserProfile xmlns=/"http://www.youkuaiyun.com//">");
    // 这里是调用的用户信息标识
    b.append("  <identity>");
    // 登录用户名
    b.append("   <username>" + username + "</username>");
    // 登录密码
    b.append("   <password>" + password + "</password>");
    b.append("  </identity>");
    // 要查看的用户名,和登录用户相同
    b.append("  <username>" + username + "</username>");
    b.append(" </GetUserProfile>");
    b.append("</soap12:Body>");
    b.append("</soap12:Envelope>");
    // 提交数据,并获取返回结果
    String textXml = postPage("http://forum.youkuaiyun.com/OpenApi/forumapi.asmx", "forum.youkuaiyun.com",
        null, b.toString())[1];
    // 使用jdom进行解析
    SAXBuilder builder = new SAXBuilder();
    Document doc = null;
    Reader in = new StringReader(textXml);
    try {
      doc = builder.build(in);
      Element root = doc.getRootElement();
      List ls = root.getChildren();// 注意此处取出的是root节点下面的一层的Element集合
      Element body = (Element) ls.get(0);
      Element response = (Element) body.getChildren().get(0);
      List content = response.getChildren();
      Element result = (Element) content.get(0);
      // 这个是运行结果的数据
      if ("GetUserProfileResult".equals(result.getName())) {
        // 失败
        if ("true".equals(result.getText())) {
          return true;
        }
      } else {
        return false;
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    } catch (JDOMException ex) {
      ex.printStackTrace();
    }
    return false;
  }


  /**
   * 提交数据到指定的地址
   *
   * @param urlTo 指定提交的地址
   * @param host 主机名称
   * @param cookies cookies的数据
   * @param data 提交的数据
   * @return 返回提交的结果数组,[0] 为返回的cookie 数据,[1]为返回的内容本体数据
   */
  private static String[] postPage(String urlTo, String host, String cookies, String data) {
    try {
      URL url = new URL(urlTo);
      HttpURLConnection con = (HttpURLConnection) url.openConnection();
      con.setDoOutput(true); // POST方式
      con.setRequestMethod("POST");
      con.addRequestProperty("Host", host);
      con.addRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
      if (cookies != null) {
        con.addRequestProperty("Cookie", cookies);
      }
      byte[] bs = data.getBytes("UTF-8");
      con.addRequestProperty("Content-Length", Integer.toString(bs.length));
      OutputStream os = con.getOutputStream(); // 输出流,写数据
      os.write(bs);
      Map<String, List<String>> map = con.getHeaderFields();
      String[] rtn = new String[2];
      String cookie = "";
      if (map.get("Set-Cookie") != null)
        for (String v : map.get("Set-Cookie")) {
          cookie += v.substring(0, v.indexOf(";") + 1);
        }
      rtn[0] = cookie;
      BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(),
          "UTF-8")); // 读取结果
      String line;
      StringBuilder b = new StringBuilder();
      while ((line = reader.readLine()) != null) {
        b.append(line);
      }
      reader.close();
      rtn[1] = b.toString();
      return rtn;
    } catch (Exception ex) {
      ex.printStackTrace();
      return null;
    }
  }











<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<think>嗯,用户之前问过关于使用openapi-generator生成JMeter测试脚本的例子,现在他们想了解openapi-generator-cli的使用方法常用选项示例。我需要先回顾之前的对话,确保这次回答保持一致,并且补充更多的细节。 首先,用户可能需要的是基本的CLI使用方法,包括安装步骤、基本命令结构,以及常用选项。他们可能已经按照之前的指引安装了CLI,但现在需要更深入的使用说明。要记得用户之前是在SpringBoot项目中生成JMeter脚本,所以可能需要相关的例子,但这次的问题更通用。 接下来,我得整理常用的命令选项,比如生成器类型、输入文件、输出目录、配置参数等。需要给出具体示例,比如生成Spring Boot服务器代码或TypeScript客户端,这样用户可以看到不同场景下的应用。 可能用户对如何自定义模板或跳过某些文件生成感兴趣,所以需要包含--template-dir--skip-validate-spec这样的选项。另外,他们可能遇到需要覆盖文件的情况,所以--skip-overwrite也是有用的。 还要注意用户可能的常见问题,比如如何查看支持的语言列表,这时候openapi-generator-cli list命令就很重要。另外,环境变量Java选项可能对高级用户有帮助,需要简要提及。 需要确保回答结构清晰,分步骤说明,让用户容易跟随。同时,保持语言口语化,避免技术术语堆砌,但又要准确。最后,补充注意事项,比如版本兼容性自定义模板的维护,帮助用户避免常见陷阱。</think>以下是一个关于 `openapi-generator-cli` 的详细使用指南及常用选项示例: --- ### **一、基础使用方法** #### 1. 安装工具 ```bash npm install -g @openapitools/openapi-generator-cli ``` #### 2. 查看版本 ```bash openapi-generator-cli version # 输出示例:6.6.0 ``` #### 3. 核心命令格式 ```bash openapi-generator-cli generate \ -i <输入文件> \ # 必填:OpenAPI/Swagger描述文件路径 -g <生成器类型> \ # 必填:目标语言/工具(如java、typescript、jmeter等) -o <输出目录> \ # 必填:生成文件的保存路径 [附加选项] # 可选:自定义参数 ``` --- ### **二、常用选项示例** #### 1. 基础生成示例 **生成SpringBoot服务端代码:** ```bash openapi-generator-cli generate \ -i swagger.yaml \ -g spring \ -o ./server-code \ --additional-properties=library=spring-boot,apiPackage=com.example.api,modelPackage=com.example.model ``` **生成TypeScript客户端:** ```bash openapi-generator-cli generate \ -i https://api.example.com/swagger.json \ -g typescript-axios \ -o ./client-sdk \ --skip-validate-spec # 跳过规范校验(适用于非标准文档) ``` --- #### 2. 关键参数说明 | 参数 | 说明 | 示例 | |------|------|------| | `-i` | 输入文件路径(支持JSON/YAML) | `-i ./api-docs/swagger.json` | | `-g` | 生成器类型([支持列表](#支持语言列表)) | `-g kotlin` | | `-o` | 输出目录路径 | `-o ./generated-code` | | `-p` | 直接传递配置参数 | `-p sourceFolder=src/main/java` | | `-c` | 配置文件路径(JSON格式) | `-c config.json` | | `--global-property` | 全局参数(如控制生成范围) | `--global-property apis,models` | | `--reserved-words-mappings` | 保留字映射 | `--reserved-words-mappings async=await` | --- #### 3. 进阶配置示例 **通过配置文件生成(`config.json`):** ```json { "apiPackage": "com.example.api", "modelPackage": "com.example.model", "invokerPackage": "com.example.invoker", "useOptional": true, "serializationLibrary": "jackson" } ``` 执行命令: ```bash openapi-generator-cli generate -i spec.yaml -g java -o ./out -c config.json ``` **指定模板目录(自定义生成模板):** ```bash openapi-generator-cli generate \ -i swagger.json \ -g go \ -o ./golang-client \ --template-dir ./custom-templates # 使用自定义模板覆盖默认模板 ``` --- ### **三、常用生成器类型** | 生成器名称(`-g`) | 用途 | 典型附加参数 | |------------------|------|-------------| | `jmeter` | JMeter性能测试脚本 | `testSuiteName` | | `spring` | SpringBoot服务端 | `library=spring-boot,reactive=true` | | `typescript-axios` | TypeScript客户端 | `npmName=@myorg/sdk` | | `python-flask` | Python Flask服务端 | `packageName=mypackage` | | `kotlin` | Kotlin客户端 | `serializationLibrary=moshi` | --- ### **四、实用技巧** #### 1. 查看支持的所有语言 ```bash openapi-generator-cli list ``` #### 2. 生成时跳过文件覆盖 ```bash --skip-overwrite # 保留已存在的文件(避免误覆盖) ``` #### 3. 仅生成指定API或模型 ```bash --global-property apis # 仅生成API接口 --global-property models # 仅生成数据模型 ``` #### 4. 调试模式 ```bash --log-to-stderr # 输出详细日志 ``` --- ### **五、环境变量配置** ```bash # 设置JAVA堆内存(处理大文件时使用) export JAVA_OPTS="-Xmx2048M -Xms512M" # 设置自定义仓库(私有模板) export OPENAPI_GENERATOR_TEMPLATES=/path/to/custom-templates ``` --- ### **注意事项** 1. **版本兼容性**:生成器版本需与OpenAPI规范版本匹配(2.0/3.0) 2. **预处理文档**:建议使用 [Swagger Editor](https://editor.swagger.io/) 校验文档有效性 3. **模板定制**:修改模板后建议添加版本控制(避免工具升级导致模板失效) 通过上述配置,可以快速生成适用于不同场景的代码/脚本,典型应用场景包括: - 自动生成API客户端SDK - 创建服务端桩代码 - 生成接口测试脚本(JMeter/Gatling) - 构建API文档站点
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值