soap和http get获取qq在线webservice服务

本文介绍了如何通过SOAP协议和HTTP GET方法查询QQ在线状态。提供了XML文件代码示例,并指出HTTP GET实现方式更为简洁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一个是利用SOAP实现QQ在线查询的代码

import java.io.*;

import java.net.*;

import javax.xml.parsers.*;

import org.w3c.dom.*;



public class qqGet

{    

	//读取请求的xml文件

    private static String getSoapRequest(String qqnumber)

    {

        try 

        {   //一个对象的运行实例

            Class cls=Object.class;

            //getResourceAsStream查找具有给定名称的资源。

            InputStreamReader isr=new InputStreamReader(cls.getResourceAsStream("/1.xml"));

               //缓冲输入流

            BufferedReader reader=new BufferedReader(isr);

            String soap="";

            String tmp;

            while((tmp=reader.readLine())!=null)

            {

                soap+=tmp;

            }   

            System.out.println(soap);

            reader.close();

            isr.close();

            return soap.replace("${qqnumber}$;,qqnumber);//用传入的参数qqnumber替换原来的${qqnumber}$

        } 

        catch (Exception ex) 

        {

            ex.printStackTrace();

            return null;

        }

    }

      /*

    *返回InputStream是因为w3c DOM中Document的parse方法可

    *以接受InputStream类型的参数,方面在下一步对XML的解释

    */

    private static InputStream getSoapInputStream(String city)throws Exception

    {

        try

        {

            String soap=getSoapRequest(city);

            if(soap==null)

            {

                return null;

            }

            URL url=new URL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx");

            URLConnection conn=url.openConnection();

            //忽略用户缓存

            conn.setUseCaches(false);

            //URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输入,

            //则将 DoInput 标志设置为 true;如果不打算使用,则设置为 false。

            //默认值为 true。 

           conn.setDoInput(true);

           //输出设置

            conn.setDoOutput(true);

            //设置一般请求属性。如果已存在具有该关键字的属性,则用新值改写其值。 

           // 这里进行下面3个属性的设置

            //Content-Type: text/xml; charset=utf-8

           // Content-Length: length

            //SOAPAction: "http://tempuri.org/getWeather"



            conn.setRequestProperty("Content-Length", Integer.toString(soap.length()));

            conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");

            conn.setRequestProperty("SOAPAction","/"http://WebXml.com.cn/qqCheckOnline/"");

       //得到输出流   此抽象类是表示输出字节流的所有类的超类。

            //这里得到上面设置的字节输出流

            OutputStream os=conn.getOutputStream();

            //创建使用指定字符集的 OutputStreamWriter

            //OutputStreamWriter 是字符流通向字节流的桥梁。

            //每次调用 write() 方法都会针对给定的字符(或字符集)调用编码转换器。

            OutputStreamWriter osw=new OutputStreamWriter(os,"utf-8");

            //将结果写入字符串soap 

            //给soap加入请求头

            osw.write(soap);

            System.out.println(soap);

            //刷新该流的缓冲.

            osw.flush();

            //关闭输出流

            osw.close();

            //得到输入流

            //这里得到服务器给我们的响应

            InputStream is=conn.getInputStream();  

            System.out.println(is+"yes or no");

            return is;   

        }

        catch(Exception e)

        {

            e.printStackTrace();

            return null;

        }

    }

/*

  *用W3C DOM对返回的XML进行解释

  *

  */

    public static String getQQOnline(String qqNumber)

    {

        try

        {

            Document doc;

            //定义工厂 API,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器。 

            /*获取 DocumentBuilderFactory 的新实例。此 static 方法创建一个新的工厂实例。

             * 此方法使用下面有序的查找过程来确定要加载的 DocumentBuilderFactory 实现类: 

            //使用 javax.xml.parsers.DocumentBuilderFactory 系统属性。 

           // 使用 JRE 文件夹中的属性文件 "lib/jaxp.properties"。

            * 此配置文件格式为标准的 java.util.Properties 且包含实现类的完全限定名, 

            其中实现类的键是上述定义的系统属性。 JAXP 实现只读取一次 jaxp.properties 文件,

    然后缓存其值供以后使用。如果首次尝试读取文件时,文件不存在,则不会再次尝试检查该文件是

    否存在。首次读取 jaxp.properties 后,其中的属性值不能再更改。 

           // 如果可以,使用 Services API(在 JAR 规范中进行了详细描述)来确定类名称。

            * Services API 将查找在运行时可用的 jar 中 META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文件中的类名。 

            //平台默认的 DocumentBuilderFactory 实例。 

            //在应用程序获取对 DocumentBuilderFactory 的引用后,它可以使用工厂来配置和获取解析器实例。 */

            DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();

            //指定由此代码生成的解析器将提供对 XML 名称空间的支持。

            dbf.setNamespaceAware(true);

            //定义 API, 使其从 XML 文档获取 DOM 文档实例。

            //使用此类,应用程序员可以从 XML 获取一个 Document。



           // 此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取。

            //获取此类的实例之后,将可以从各种输入源解析 XML。

            //这些输入源为 InputStreams、Files、URL 和 SAX InputSources。



            DocumentBuilder db=dbf.newDocumentBuilder();

            //得到服务器返回的响应内容

            InputStream is=getSoapInputStream(qqNumber);

            //parse()将给定 InputStream 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。

            //如果 InputStream 为 null,则抛出一个 IllegalArgumentException。 

            doc=db.parse(is);

           

            NodeList nl=doc.getElementsByTagName("qqCheckOnlineResult");

           

            //返回集合中的第 index 个项。

            Node n=nl.item(0);

            String weather=n.getFirstChild().getNodeValue();

            is.close();

            return weather;

        }

        catch(Exception e)

        {

            e.printStackTrace();

            return null;

        }

    }

   public static void main(String[] args)throws Exception

    {

        System.out.println(qqGet.getQQOnline("17072576"));

    }

}

 

 





 

 

 

1.xml文件代码如下

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

  <soap:Body>

    <qqCheckOnline xmlns="http://WebXml.com.cn/">

      <qqCode>${qqnumber}___FCKpd___1lt;/qqCode>

    </qqCheckOnline>

  </soap:Body>

</soap:Envelope>

第2个是利用http协议的get实现这个更简单

import java.io.*;

import java.net.*;

import javax.xml.parsers.*;

import org.w3c.dom.*;

public class HttpGetTest

{    

	//读取请求的xml文件

    /*private static String getSoapRequest(String qqnumber)

    {

        try 

        {   //一个对象的运行实例

            Class cls=Object.class;

            //getResourceAsStream查找具有给定名称的资源。

            InputStreamReader isr=new InputStreamReader(cls.getResourceAsStream("/1.xml"));

            //读取存在weathersoap的SOAP信息,一般放在class文件同一目录

            //缓冲输入流

            BufferedReader reader=new BufferedReader(isr);

            String soap="";

            String tmp;

            while((tmp=reader.readLine())!=null)

            {

                soap+=tmp;

            }   

            System.out.println(soap);

            reader.close();

            isr.close();

            return soap.replace("${qqnumber}___FCKpd___3quot;,qqnumber);       } 

        catch (Exception ex) 

        {

            ex.printStackTrace();

            return null;

        }

    }*/

      /*

    *返回InputStream是因为w3c DOM中Document的parse方法可

    *以接受InputStream类型的参数,方面在下一步对XML的解释

    */

    private static InputStream getSoapInputStream()throws Exception

    {

        try

        {

           // String soap=getSoapRequest(city);

            //if(soap==null)

            //{

             //   return null;

           // }

            URL url=new URL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=17072576");

            URLConnection conn=url.openConnection();

            //忽略用户缓存

            conn.setUseCaches(false);

            //URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输入,

            //则将 DoInput 标志设置为 true;如果不打算使用,则设置为 false。

            //默认值为 true。 

           conn.setDoInput(true);//这里可以设置成false

           //输出设置

            conn.setDoOutput(true);

            //设置一般请求属性。如果已存在具有该关键字的属性,则用新值改写其值。 

           // 这里进行下面3个属性的设置

            //Content-Type: text/xml; charset=utf-8

           // Content-Length: length

            //SOAPAction: "http://tempuri.org/getWeather"



            //conn.setRequestProperty("Content-Length", Integer.toString(soap.length()));

           // conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");

            //conn.setRequestProperty("SOAPAction","/"http://WebXml.com.cn/qqCheckOnline/"");

       //得到输出流   此抽象类是表示输出字节流的所有类的超类。

            //这里得到上面设置的字节输出流

           // OutputStream os=conn.getOutputStream();

            //创建使用指定字符集的 OutputStreamWriter

            //OutputStreamWriter 是字符流通向字节流的桥梁。

            //每次调用 write() 方法都会针对给定的字符(或字符集)调用编码转换器。

            //OutputStreamWriter osw=new OutputStreamWriter(os,"utf-8");

            //将结果写入字符串soap 

            //给soap加入请求头

            //osw.write(soap);

           // System.out.println(soap);

            //刷新该流的缓冲.

           // osw.flush();

            //关闭输出流

           // osw.close();

            //得到输入流

            //这里得到服务器给我们的响应

            InputStream is=conn.getInputStream();  

          //测试代码  System.out.println(is+"yes or no");

            return is;   

        }

        catch(Exception e)

        {

            e.printStackTrace();

            return null;

        }

    }

/*

  *用W3C DOM对返回的XML进行解释

  *

  */

    public static String getQQOnline(String qqNumber)

    {

        try

        {

            Document doc;

            //定义工厂 API,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器。 

            /*获取 DocumentBuilderFactory 的新实例。此 static 方法创建一个新的工厂实例。

             * 此方法使用下面有序的查找过程来确定要加载的 DocumentBuilderFactory 实现类: 

            //使用 javax.xml.parsers.DocumentBuilderFactory 系统属性。 

           // 使用 JRE 文件夹中的属性文件 "lib/jaxp.properties"。

            * 此配置文件格式为标准的 java.util.Properties 且包含实现类的完全限定名, 

            其中实现类的键是上述定义的系统属性。 JAXP 实现只读取一次 jaxp.properties 文件,

    然后缓存其值供以后使用。如果首次尝试读取文件时,文件不存在,则不会再次尝试检查该文件是

    否存在。首次读取 jaxp.properties 后,其中的属性值不能再更改。 

           // 如果可以,使用 Services API(在 JAR 规范中进行了详细描述)来确定类名称。

            * Services API 将查找在运行时可用的 jar 中 META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文件中的类



名。 

            //平台默认的 DocumentBuilderFactory 实例。 

            //在应用程序获取对 DocumentBuilderFactory 的引用后,它可以使用工厂来配置和获取解析器实例。 */

            DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();

            //指定由此代码生成的解析器将提供对 XML 名称空间的支持。

            dbf.setNamespaceAware(true);

            //定义 API, 使其从 XML 文档获取 DOM 文档实例。

            //使用此类,应用程序员可以从 XML 获取一个 Document。



           // 此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取。

            //获取此类的实例之后,将可以从各种输入源解析 XML。

            //这些输入源为 InputStreams、Files、URL 和 SAX InputSources。



            DocumentBuilder db=dbf.newDocumentBuilder();

            //得到服务器返回的响应内容

            InputStream is=getSoapInputStream();

            //parse()将给定 InputStream 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。

            //如果 InputStream 为 null,则抛出一个 IllegalArgumentException。 

            doc=db.parse(is);

           

            NodeList nl=doc.getElementsByTagName("string");

           

            //返回集合中的第 index 个项。

            Node n=nl.item(0);

            String weather=n.getFirstChild().getNodeValue();

            is.close();

            return weather;

        }

        catch(Exception e)

        {

            e.printStackTrace();

            return null;

        }

    }

   public static void main(String[] args)throws Exception

    {

        System.out.println(HttpGetTest.getQQOnline("17072576"));

    }

}

 
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值