`
java2000.net
  • 浏览: 660751 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

阅读更多

原文地址:

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

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

 

 

 

CSDN的 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.csdn.net/OpenApi/forumapi.asmx?op=GetUserProfile

 

POST /OpenApi/forumapi.asmx HTTP/1.1
Host: forum.csdn.net
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.csdn.net/">
      <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.csdn.net/\">");
    // 这里是调用的用户信息标识
    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.csdn.net/OpenApi/forumapi.asmx", "forum.csdn.net",
        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.csdn.net/">
      <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.csdn.net/\">");
    // 这里是调用的用户信息标识
    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.csdn.net/OpenApi/forumapi.asmx", "forum.csdn.net",
        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 src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
分享到:
评论

相关推荐

    aliyun-openapi-java-sdk-master.zip

    这个名为"aliyun-openapi-java-sdk-master.zip"的压缩包包含了完整的Java SDK源代码,使得开发者可以方便地集成到自己的Java应用中,进行云计算资源的管理和操作。 首先,我们要了解的是SDK的基本概念。SDK,即...

    openapi-typescript-code-generator:通过OpenAPI方案的TypeScript代码生成器

    @ himenon / openapi-typescript-code-generator该软件包根据OpenAPI v3系列API规范生成TypeScript typedef和API客户端。 它使用TypeScript AST生成代码,并将其完全转换为TypeScript代码。 它不仅将allOf和oneOf...

    openapi-generator,openapi生成器允许自动生成api客户端库(sdk生成)、服务器存根、文档和配置,并给出openapi规范(v2,v3).zip

    在`openapi-generator-master`这个压缩包中,包含了OpenAPI Generator的源码,这通常是一个Git仓库的克隆。你可以通过浏览源码了解其工作原理,或者根据自己的需求对其进行定制。如果你想要使用OpenAPI Generator,...

    openapi-demo-php-master_openapi_DEMO_

    7. **版本控制与Git**:文件名为"openapi-demo-php-master"暗示这是一个Git仓库的主分支,意味着该项目使用Git进行版本控制,便于协作和追踪代码变更。 8. **开发流程与测试**:在实际开发中,可能会包含单元测试、...

    openapi-generator-cli:https:github.comOpenAPIToolsopenapi-generator的节点包包装器

    @ openapitools / openapi-generator-cli OpenAPI Generator允许在给定OpenAPI规范(同时支持2.0和3.0)的情况下自动生成API客户端库(SDK生成),服务器存根,文档和配置。 请参阅版本2.xx[更新]该命令已重命名从...

    openapi-typescript-codegen:基于OpenAPI规范生成Typescript或Javascript客户端的NodeJS库

    OpenAPI Typescript代码生成 根据OpenAPI规范生成Typescript客户端的Node.js库。...npm install openapi-typescript-codegen --save-dev 用法 $ openapi --help Usage: openapi [options] Options: -V, --version

    aliyun-openapi-php-sdk.zip

    aliyun-openapi-php-sdk 是阿里云官方为 PHP 开发者提供的阿里云 Open API SDK。示例:include_once '../aliyun-php-sdk-core/Config.php'; use Ecs\Request\V20140526 as Ecs; $iClientProfile = Default...

    Laravel开发-laravel-openapi-schema-generator

    本文将深入探讨使用Laravel进行API开发时,如何利用`laravel-openapi-schema-generator`这一工具来生成OpenAPI规范文档,从而提高开发效率和API的标准化。 首先,OpenAPI(原名Swagger)是一种广泛采用的API描述...

    openapi-schema-validator:OpenApi 版本 v2、v3.0.x 和 v3.1.x 的 OpenApi 架构验证

    npm install @seriousme/openapi-schema-validator 用法 // ESM import Validator from "@seriousme/openapi-schema-validator" ; // CommonJS const Validator = require ( "@seriousme/openapi-schema-validator...

    openapi-to-graphql:将OpenAPI规范(OAS)描述的API转换为GraphQL

    OpenAPI到GraphQL ... 使用以下命令安装OpenAPI-to-GraphQL CLI: npm i -g openapi-to-graphql-cli 然后,运行OpenAPI-to-GraphQL命令并将其指向OpenAPI规范: openapi-to-graphql &lt; OAS&gt; [options

    Python库 | pydantic_openapi-0.1.4-py3-none-any.whl

    安装`pydantic_openapi-0.1.4-py3-none-any.whl`文件非常简单,只需要使用Python的包管理器pip。首先,确保你已经安装了pip,然后通过以下命令进行安装: ```bash pip install path/to/pydantic_openapi-0.1.4-py3-...

    openapi-merger-demo.zip

    通过"openapi-merger-demo.zip"中的示例,开发者可以学习到如何使用工具和策略有效地合并OpenAPI规范,这对于构建和管理大型、模块化的API服务至关重要。这不仅可以提高开发效率,还能确保API的统一性和一致性。

    openapi-demo-java-master.7z

    完整的阿里钉钉集成API(Java)项目,包括了src和demo用例等.非corpid和corpsecret旧版,而是 appkey和appsecret新版.2019-2020最新

    openapi-spec-validator:OpenAPI Spec验证器

    $ pip install openapi-spec-validator 或者,您可以下载代码并从存储库安装: $ pip install -e git+https://github.com/p1c2u/openapi-spec-validator.git#egg=openapi_spec_validator 用法 命令行界面 直截了当...

    openapi-python-client:从OpenAPI生成现代Python客户端

    openapi-python-客户端 从OpenAPI 3.x文档生成现代Python客户端。 该生成器不支持OpenAPI 2.x FKA Swagger。 如果需要使用较旧的文档,请尝试首先使用许多可用的转换器之一将其升级到版本3。 该项目仍在开发中,不...

    openapi-demo-java-mater.zip

    【标题】"openapi-demo-java-mater.zip" 是一个针对钉钉开放平台API的Java示例项目,旨在帮助开发者快速理解和使用钉钉的企业应用开发。这个压缩包包含了一个完整的Java项目,可以指导开发者如何集成钉钉的OpenAPI,...

    openapi-demo-php-master_openapi_DEMO_源码.zip

    这个压缩包包含了 "master" 分支的 "openapi-demo-php" 项目的源代码,专门用于演示如何在 PHP 开发环境中实施 OpenAPI 规范。 【描述】"openapi-demo-php-master_openapi_DEMO_源码" 指出,这是一个开源项目,可能...

    PyPI 官网下载 | openapi-codec-1.1.7.tar.gz

    "openapi-codec"是一个专门用于处理OpenAPI规范的编码和解码工具。OpenAPI,原名Swagger,是一种定义RESTful API接口的标准,它允许开发者以JSON格式描述API,以便于文档编写、客户端生成和服务器端实现。"openapi-...

    PyPI 官网下载 | bmlx-openapi-client-0.0.90.8.tar.gz

    在云原生环境中,bmlx-openapi-client可能被设计为与Kubernetes、Docker等容器化技术配合使用,实现灵活、可扩展的服务部署和管理。 在使用bmlx-openapi-client时,开发者需要首先安装这个库,可以利用Python的pip...

Global site tag (gtag.js) - Google Analytics