webservice使用教程

(图文教程)java 使用JAX-WS框架发布Webservice以及客户端调用 作者:王勤为  转载 一、发布WebService  1.工具:使用myeclipse,因为它自带了JWS的架包。 2.创建Webservice工程                 3.创建Webservice类   4.编译刚刚创建的类,使用命令:apt -d .. WS_PUB.java (下个版本移植到javadoc里面去,请参考帮助页)     使用完该命令之后会生成J 阅读详情

Web Service实践之——开始XFire

一、Axis与XFire的比较
XFire是与Axis2 并列的新一代WebService平台。之所以并称为新一代,因为它:
1、支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security等;
2、使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现;

3、容易上手,可以方便快速地从pojo发布服务; 4、Spring的结合;5、灵活的Binding机制,包括默认的Acegis,xmlbeans,jaxb2,castor。 XFire与Axis1性能的比较1、XFire比Axis1.3快2-6倍2、XFire的响应时间是Axis1.3的1/2到1/5 XFire与Axis2的比较虽然XFire与Axis2都是新一代的WebService平台,但是Axis2的开发者太急于推出1.0版本,所以1.0还不是一个稳定的版本,它的开发者宣称1.1版本即将推出,希望1.1版本会是个稳定的版本。在XFire捐献给apache后有人认为Axis2将会灭亡。其实在很多人眼里,Axis2并不是pojo形式,现在也好象XFire比Axis更有市场,也有很多人开始从Axis转向XFire。据说,XFire确实比Axis2简单很多

AXIS VS CXF在SOA领域,我们认为Web Service是SOA体系的构建单元(building block)。对于作过WebService的开发人员来说,AXIS和CXF一定都不会陌生。这两个产品都是Apache孵化器下面的Web Service开源开发工具。 Axis2的最新版本是1.3,CXF现在已经到了2.0版本。

这两个框架 都是从已有的开源项目发展起来的。Axis2是从Axis1.x系列发展而来。CXF则是XFire和Celtix项目的结合产品。Axis2是从底层全部重新实现,使用了新的扩展性更好模块架构。 CXF也重新的深化了XFire和Celtix这两个开发工具。

新产品的退出导致了几个问题。是不是现有的使用Axis 1.x,XFire和Celix的应用需要迁移的新的版本上。如果一个开发人员确定要迁移它的应用到新的框架上,那么他应该选择哪一个呢?相反的,如果一个开发者决定从头开发一个新的Web Service,他应该使用哪个呢? 这两个框架哪一个更好一些呢?

对于系统迁移来说,也许迁移到新的框架并不难。Axis和CXF都提供了迁移的指导。能够给开发者一些迁移的技巧和经验。但是对于这样迁移,这两个开源项目都没有提供迁移的工具。对于这样的迁移工作,尽管很值得去寻找所有的可行方案。Axis2和CXF都有各自不同的WebService开发方法,每个方法都有相当数量拥护者。

通过一个比较矩阵来比较Axis2和CXF变得有现实的意义。这两个项目都开发不够成熟,但是最主要的区别在以下几个方面:1. CXF支持 WS-Addressing,WS-Policy, WS-RM, WS-Security和WS-I Basic Profile。Axis2不支持WS-Policy,但是承诺在下面的版本支持。2. CXF可以很好支持Spring。Axis2不能3. AXIS2支持更广泛的数据并对,如XMLBeans,JiBX,JaxMe和JaxBRI和它自定义的数据绑定ADB。注意JaxME和JaxBRI都还是试验性的。CXF只支持JAXB和Aegis。在CXF2.14. Axis2支持多语言-除了Java,他还支持C/C++版本。

比较这两个框架的Web Service开发方法与比较它们的特性同样重要。 从开发者的角度,两个框架的特性相当的不同。 Axis2的开发方式类似一个小型的应用服务器,Axis2的开发包要以WAR的形式部署到Servlet容器中,比如Tomcat,通过这些容器可以对工作中的Web Service进行很好的监控和管理。Axis2 的Web administrion模块可以让我们动态的配置Axis2.一个新的服务可以上载,激活,使之失效,修改web服务的参数。管理UI也可以管理一个或者多个处于运行状态的服务。这种界面化管理方式的一个弊端是所有在运行时修改的参数没有办法保存,因为在重启动之后,你所做的修改就会全部失效。

Axis2允许自己作为独立的应用来发布Web Service,并提供了大量的功能和一个很好的模型,这个模型可以通过它本身的架构(modular architecture)不断添加新的功能。有些开发人员认为这种方式对于他们的需求太过于繁琐。这些开发人员会更喜欢CXF。

CXF更注重开发人员的工效(ergonomics)和嵌入能力(embeddability)。大多数配置都可以API来完成,替代了比较繁琐的XML配置文件, Spring的集成性经常的被提及,CXF支持Spring2.0和CXF's API和Spring的配置文件可以非常好的对应。CXF强调代码优先的设计方式(code-first design),使用了简单的API使得从现有的应用开发服务变得方便。

不过你选择Axis2还是CXF,你都可以从开源社区得到大量的帮助。这两个框架都有商业公司提供服务,WSO2提供AXIS2的支持,Iona提供CXF的支持。这两公司都有很活跃的开发者社区。 Axis2出现的时间较早,CXF的追赶速度快。我的建议是:如果你需要多语言的支持,你应该选择AXIS2。如果你需要把你的实现侧重JAVA并希望和Spring集成,CXF就是更好的选择,特别是把你的Web Service嵌入其他的程序中。如果你觉得这两个框架的新特性对于你并没有太大的用处,你会觉得Axis1也是不错的选择,你应该继续使用它知道你有充分的理由去更换它。

 

二、开始XFire的生火之旅:1、配置XFire运行环境:在Tomcat下新建一个Web Applications,命名为stove,然后在其WEB-INF目录下新建一个web.xml文件,文件中输入:

Xml代码

<?xml version="1.0" encoding="GB2312">  
<!DOCTYPE web-app   
  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"   
  "http://java.sun.com/dtd/web-app_2_3.dtd">  
   
<web-app>  
 
 <servlet>  
 <servlet-name>XFireServlet</servlet-name>  
   <display-name>XFire Servlet</display-name>  
   <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>  
 </servlet>  
 <servlet-mapping>  
  <servlet-name>XFireServlet</servlet-name>  
 <url-pattern>/servlet/XFireServlet/*</url-pattern>  
 </servlet-mapping>  
 
<servlet-mapping>  
 <servlet-name>XFireServlet</servlet-name>  
<url-pattern>/services/*</url-pattern>  
</servlet-mapping>  
 
</web-app>  

 

其中主要就是引入了XFireServlet,用以处理Web Service请求,并且负责提供Web Service的WSDL,如果你发布了一个名为BookService的WebService,则可以通过网址:
http://<服务器>[:端口]/<webapp名>/services/BookService
来访问这个WebService,并且通过地址:
http://<服务器>[:端口]/<webapp名>/services/BookService?WSDL  来得到这个WebService的WSDL信息。

2、开发最简单的WebService
在WEB-INF目录下新建src文件夹,然后再建一个package:
cn.com.pansky.webservice.xfire.study
,在这个包下面新建一个接口:

Java代码

package cn.com.pansky.webservice.xfire.study;   
 
public interface SayHiService{   
 public String sayHi(String name);   
}  
package cn.com.pansky.webservice.xfire.study;

public interface SayHiService{
  public String sayHi(String name);
}


这个接口是告诉服务器你的WebService哪些方法可以被用户调用的。下面我们再来写一个SayHiService的实现类,以完成业务逻辑:

Java代码

package cn.com.pansky.webservice.xfire.study;   
  
public class SayHiServiceImpl implements SayHiService{   
  public String sayHi(String name){   
    if(name==null){   
      return "连名字也不肯告诉我吗?";   
    }   
    return name+", 你吃了吗?没吃回家吃去吧。";   
  }   

  
  public String 不告诉你(){   
   return "我的名字不告诉你!";   
 }   
}  

 

这个类实现了sayHi方法,该方法是可以通过WebService调用访问到的。另外还实现了一个方法“不告诉你”,该方法因为没有在接口SayHiService中定义,所以不能被WebService调用到。
   这个例子足够简单吧,就跟我们刚学Java时写的"Hello world"没什么两样。
到这里为止,我们做的跟平时的Java开发没啥区别,该如何来发布WebService呢?

3、把JAVA类发布为WebService:
在WEB-INF/classes目录下新建文件夹:META-INF/xfire,然后在该文件夹下新建一个XML文件:services.xml,文件内容如下:

Xml代码 

 这个文件

<beans xmlns="http://xfire.codehaus.org/config/1.0">  
  <service>  
    <name>SayHiService</name>  
    <namespace>http://cn.com.pansky/SayHiService</namespace>  
    <serviceClass>cn.com.pansky.webservice.xfire.study.SayHiService</serviceClass>  
    <implementationClass>cn.com.pansky.webservice.xfire.study.SayHiServiceImpl</implementationClass>  
  </service>  
</beans>  
<beans xmlns="http://xfire.codehaus.org/config/1.0">
  <service>
    <name>SayHiService</name>
    <namespace>http://cn.com.pansky/SayHiService</namespace>
    <serviceClass>cn.com.pansky.webservice.xfire.study.SayHiService</serviceClass>
    <implementationClass>cn.com.pansky.webservice.xfire.study.SayHiServiceImpl</implementationClass>
  </service>
</beans>


定义一个WebService: SayHiService,并同时定义了接口和实现类。
好了,该建的文件基本建完了,现在想办法把src下的java文件编译成class,并复制到WEB-INF/classes目录下

 

4、启动Tomcat,测试WebService
如果Tomcat还没配置好,抽两分钟再配一下。再把Tomcat启动起来。
再打开浏览器,输入:
http://localhost/stove/services
,服务器返回的结果如下:
Available Services:
    * SayHiService [wsdl]
     Generated by XFire ( http://xfire.codehaus.org/ )
我们看到我们的WebService已经布署成功了,我们再看看它的WSDL信息:

Xml代码

<?xml version="1.0" encoding="UTF-8"?>  
<wsdl:definitions targetNamespace="http://cn.com.pansky/SayHiService" xmlns:tns="http://cn.com.pansky/SayHiService" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">  
  <wsdl:types>  
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://cn.com.pansky/SayHiService">  
<xsd:element name="sayHi">  
<xsd:complexType>  
<xsd:sequence>  
<xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:string"/>  
</xsd:sequence>  
</xsd:complexType>  
</xsd:element>  
<xsd:element name="sayHiResponse">  
<xsd:complexType>  
<xsd:sequence>  
<xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string"/>  
</xsd:sequence>  
</xsd:complexType>  
</xsd:element>  
</xsd:schema>  
  </wsdl:types>  
  <wsdl:message name="sayHiRequest">  

    <wsdl:part name="parameters" element="tns:sayHi">  
    </wsdl:part>  
  </wsdl:message>  
  <wsdl:message name="sayHiResponse">  
    <wsdl:part name="parameters" element="tns:sayHiResponse">  
    </wsdl:part>  
  </wsdl:message>  
  <wsdl:portType name="SayHiServicePortType">  
    <wsdl:operation name="sayHi">  
      <wsdl:input name="sayHiRequest" message="tns:sayHiRequest">  
    </wsdl:input>  
      <wsdl:output name="sayHiResponse" message="tns:sayHiResponse">  
    </wsdl:output>  
    </wsdl:operation>  
  </wsdl:portType>  
  <wsdl:binding name="SayHiServiceHttpBinding" type="tns:SayHiServicePortType">  
    <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>  
    <wsdl:operation name="sayHi">  
      <wsdlsoap:operation soapAction=""/>  
      <wsdl:input name="sayHiRequest">  
        <wsdlsoap:body use="literal"/>  
      </wsdl:input>  
      <wsdl:output name="sayHiResponse">  
        <wsdlsoap:body use="literal"/>  
      </wsdl:output>  
    </wsdl:operation>  
  </wsdl:binding>  
  <wsdl:service name="SayHiService">  
    <wsdl:port name="SayHiServiceHttpPort" binding="tns:SayHiServiceHttpBinding">  
      <wsdlsoap:address location="http://localhost/stove/services/SayHiService"/>  
    </wsdl:port>  
  </wsdl:service>  
</wsdl:definitions> 

 

这个文件跟我们用Axis生成的基本是一样的。

5、享受美味的时刻
WebService这道大餐算是烹制好了,现在是享用美餐的时候了。
我们写一个客户端吃掉这道大餐:

Java代码

package cn.com.pansky.webservice.xfire.study;   
  
import java.net.MalformedURLException;   
import java.util.Map;   
  
import org.codehaus.xfire.client.Client;   
import org.codehaus.xfire.client.XFireProxyFactory;   
import org.codehaus.xfire.service.Service;   
import org.codehaus.xfire.service.binding.ObjectServiceFactory;   
import org.codehaus.xfire.transport.http.CommonsHttpMessageSender;   
  
public class SayHiClient{   
  public static void main(String args[]) {   
    String serviceURL = "http://localhost/stove/services/SayHiService";   
    Service serviceModel = new ObjectServiceFactory().create(SayHiService.class,null,"http://cn.com.pansky/SayHiService",null);   
  
    XFireProxyFactory serviceFactory = new XFireProxyFactory();   
  
    try{   
      SayHiService service = (SayHiService) serviceFactory.create(serviceModel, serviceURL);   
      Client client = Client.getInstance(service);   
      //client.addOutHandler(new OutHeaderHandler());   
  
      // disable timeout   
      client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, "1");   
  
      String hello = service.sayHi("张山疯");   
      System.out.println("服务器对[张山疯] 的回答是:" + hello );   
  

      hello = service.sayHi(null);   
      System.out.println("服务器胡言乱语说:" + hello );   
  
    } catch (MalformedURLException e) {   
      e.printStackTrace();   
    }   
  }   
}  

 

编译这个类,再执行一下,服务器服务的结果是:

2008-5-22 17:39:17 org.apache.commons.httpclient.HttpMethodBase writeRequest
信息: 100 (continue) read timeout. Resume sending the request
2008-5-22 17:39:17 org.apache.commons.httpclient.HttpMethodBase readResponse
信息: Discarding unexpected response: HTTP/1.1 100 Continue
服务器对[张山疯] 的回答是:张山疯, 你吃了吗?没吃回家吃去吧。
2008-5-22 17:39:20 org.apache.commons.httpclient.HttpMethodBase writeRequest
信息: 100 (continue) read timeout. Resume sending the request
2008-5-22 17:39:20 org.apache.commons.httpclient.HttpMethodBase readResponse
信息: Discarding unexpected response: HTTP/1.1 100 Continue
服务器胡言乱语说:连名字也不肯告诉我吗?

好了,WebService布署成功。

下课!

 

XFire 和spring完整集成实例 package com.xfire.core.client; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.codehaus.xfire.client.XFireProxyFactory; import org.codehaus.xfire.service.Service; import org.codehaus.xfire.service.binding.ObjectServiceFactory; import com.xfire.core.entity.UserInfo; import com.xfire.core.service.IUserInfoService; /** *@author jilongliang *@Date 2012-3-5 * */ public class UserInfoClient { public static void main(String[] args) { getServiceList(); setServiceList(); } static String url = "http://localhost:8081/xfire/services/UserInfo"; /** * */ public static void getServiceList() { Service service = new ObjectServiceFactory() .create(IUserInfoService.class); try { IUserInfoService iAddressService = (IUserInfoService) new XFireProxyFactory() .create(service, url); List list = (ArrayList) iAddressService .getAddressList(); System.out.println("一共多少条数据:" + list.size()); for (Iterator iter = list.iterator(); iter.hasNext();) { UserInfo a = iter.next(); System.out.println(a); } } catch (MalformedURLException e) { e.printStackTrace(); } } public static void setServiceList() { Service service = new ObjectServiceFactory() .create(IUserInfoService.class); try { IUserInfoService iAddressService = (IUserInfoService) new XFireProxyFactory() .create(service, url); List listAdd = new ArrayList(); UserInfo address = new UserInfo(); address.setIdentifier(1); address.setCountry("中國"); address.setProivice("廣東省"); address.setCity("陽江"); address.setAddress("廣東陽春"); address.setPostCode("1111111"); address.setExist(false); address.setArrary(new String[] { "22", "23", "24" }); listAdd.add(address); address.setIdentifier(2); address.setCountry("中國"); address.setProivice("廣東省"); address.setCity("陽江"); address.setAddress( 立即下载

相关推荐

Web Service实践之——开始XFire

Web Service实践之——开始XFire 一、Axis与XFire的比较XFire是与Axis2 并列的新一代WebService平台。之所以并称为新一代,因为它:1、支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security等;2、使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现;3、容易上手,可以...

听雨轩 228

WebService流行框架之Axis和CXF

前言 上节课我们对WebService进行了简单的介绍,对于其所应用到的技术有了一定的了解。今天主要讲解下WebService的两个流行的框架Axis和CXF。 正题 一、服务端发布WebService 在讲解之前,我们先来看一下这篇博客主要讲解的内容: 每一种框架都有自己的特点,有自己的侧重,但是他们的共同之处在于对发布WebService进行了封装,所以我们只需编写一个配置文件或者使用@WebService注解就可以发布WebService,我们这里着重说一下他们各自的特点: 1.Axis1 Axi

weixin_43758377的博客 998

ws之XFireProxyFactory简单配置

创建一个web service工程web.xml文件会有以下内容      XFireServlet    org.codehaus.xfire.transport.http.XFireConfigurableServlet    0        XFireServlet    /services/* 运行http://.../services/*就会执行相应的service  定义一个接口

Fenice 1186

XFire的Client的三种模式(转)

1.     Client开发者拥有Web服务端的class 即:能拿到服务端的接口Class和Entity类及aegis 配置文件 //传统POJO模式 Service srvcModel = new ObjectServiceFactory().create(Hello.class);                 XFireProxyFactory factory = new ...

轻耘智科技CTO 尤胜荣 的专栏 364

Pa11y Webservice 使用教程

Pa11y Webservice 使用教程 1. 项目介绍 Pa11y Webservice 是一个基于 Node.js 的服务,用于为多个 URL 安排定期的可访问性测试。它使用 Pa11y 工具来执行这些测试,并通过 RESTful API 与用户进行交互。如果你希望通过 API 来协调测试,Pa11y Webservice 是一个理想的选择。对于其他场景,如需要可视化界面或命令行工具,Pa1...

gitblog_00629的博客 1004

2024 年使用 Postman 调用 WebService 接口图文教程

使用 Postman 调用 WebService 接口图文教程

weixin_45017726的博客 1215

idea使用xfire方式发布webservice教程

近日在熟悉webservice发布的过程,此处主要讲解xfire方式。 1.使用idea新建一个web项目 步骤1: 按照图中的指定序号建立对应的web项目即可。 步骤2: 填写组织ID和具体项目id,点击进行“下一步”即可。 步骤3: 设置相关参数,例如maven所在的位置,可以选择idea集成的或者选择自己下载使用的,下方参数的地方根据需要进行设置,点击“下一步”即可,最后一次点击完成即可。 2.建立项目后,如果前面的参数未设置,需要进行单独的设置,例如生成的项目为: 即圈里面的内容没有相应的目

weixin_40471414的博客 1568

webService使用教程

1.pom.xml <!--Web service--> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.2.6</version> </dep

darlene2929的博客 618

C 操作XML 读取、生成与WEBSERVICE接口使用教程

C# 操作XML 读取、生成与WEBSERVICE接口使用教程 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了关于C#操作XML文件的详细说明和实例,涵盖了读取、生成XML文件的方法。同时,教程还介绍了如何通过WEBSERVICE接口进行XML数据的传输,帮助开发者更好地理解和掌握C#操作XML的相关技术。 内容概要 C# 读取XML文件的方法和实例 C# 生成X...

gitblog_06779的博客 453

Java WebService使用简单教程

一、准备工作(以下为本实例使用工具) 1、MyEclipse10.7.1 2、JDK 1.6.0_22   二、创建服务端 1、创建【Web Service Project】,命名为【TheService】。       2、创建【Class】类,命名为【ServiceHello】,位于【com.hyan.service】包下。       3、编

public 1025

VS2010使用c++、gSOAP创建WebService 图文教程

VS2010使用c++、gSOAP创建WebService 图文教程

thanklife的专栏 917

WebService简单使用教程

根据说明书获取信息 代码示例: 1 import com.gyf.weather.ws.ArrayOfString; 2 import com.gyf.weather.ws.WeatherWS; 3 import com.gyf.weather.ws.WeatherWSSoap; 4 5 public class Main { 6 7 public...

weixin_30662539的博客 167

使用XFire开发WebService入门教程

首先,我们在eclipse中建立一个WebService工程作为服务端,并编写如下代码:IHelloService.java  服务接口,有一个方法,参数和返回值均为复杂类型User package test;public interface IHelloService ...{   public User getUser(User user);} User.java

我的世界我的梦 1万+

VS2010使用c++、gSOAP调用WebService 图文教程

上篇写了“VS2010使用c++、gSOAP创建的WebService 图文教程”,有创建就要有调用,这里就讲一下相同语言框架技术下的调用功能。一、下载WSDL文件上篇中 “五、启动WebService并测试》5、打开浏览器,输入你的IP:端口号/itoa?wsdl 访问看看吧,正常的话应该显示“itoa.wsdl”文件的内容”我们知道对方提供的WebService地址,理论上就可以通过以上方式取

无知人生,记录点滴 1万+

C操作XML读取生成与WEBSERVICE接口使用教程:让数据交互更高效

C#操作XML读取生成与WEBSERVICE接口使用教程:让数据交互更高效 去发现同类优质开源项目:https://gitcode.com/ C#操作XML读取生成与WEBSERVICE接口使用教程,为您提供全面的技术支持,助您轻松掌握C#操作XML的核心技能。 项目介绍 本项目是一个开源教程,专注于C#语言对XML文件的读取、生成,以及如何利用WEBSERVICE接口实现XML数据传输。教程旨在...

gitblog_06797的博客 942

WebService服务和ajax使用教程

题外话:WebService技术已经有好几年的历史了,关于基础的理论知识,此处省去,不说了。最近被炒了的ajax技术也被滥用的很是严重,至于细节,不是我说的重点。ajax技术的入门比较低,javascript和xml的一点利用,个人以为没啥含量,不能在根本上解决企业的需求或者问题,在安全性,线路传输的低级等方面都有致命的问题.为什么要把WebService和ajax放一起,原因很简单,

knownchen的专栏 959

WebService之Axis2引擎的使用教程

说明:服务端的功能即将项目ORM层获取到的数据,通过WebService服务发布。例如,通过MyBatis获取到数据库里的数据,提供一个Service接口来获取数据。通过Axis2将数据组装成OMElement对象,在通过Service.xml发布到tomcat服务器上。外界可以通过URL直接访问,获取数据。

五道口 2058
上一篇: mysql查询中实现oracle中的rownum函数的效果,返回每行查询结果的行序号
下一篇: 用xfire的Eclipse Plugin生成web服务的客户端
Ivan_mo
博客等级 码龄15年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值