WebService

it2024-12-25  9

一、WebService简介

–WebService是一个Web应用程序 –WebService的应用基于客户端、服务器端 –WebService是基于http协议的应用 –WebService是一个跨编程的语言、操作系统平台的远程调用技术 1、WebService三要素 (1)SOAP协议:简单对象访问协议;SOAP协议=HTTP协议+XML数据格式;SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML的,XML是SOAP的数据编码方式。 (2)WSDL文件:来说明有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。总的来说就是一个基于XML用于描述WebSevice及其函数、参数和返回值的使用说明书。 WSDL的xml一般从下往上看:

(3)UDDI目录:存放的是一些关于Web服务的信息。企业可以通过UDDI来注册和搜索Web服务实现资源共享。

2、WSDL结构 :服务视图,WebService的服务端点 :WebService的通信协议,还描述了WebService的方法、输入和输出 :描述了WebService可执行的操作,通过binding指向portType :描述服务中心发布的方法,包括参数,返回值等 :定义了WebService中使用的数据类型

二、Jaxws规范下webservice单独开发ApacheCXF

CXF支持的数据类型 (1)基本数据类型 ——int、float、boolean等 (2)引用数据类型 ——String ——集合:数组,List、Set、Map ——自定义类型:Student

1、利用CXF发布jaxws服务 (1)安装CXF 需要在环境变量中添加CXF,然后cmd控制台可以运行:wsdl2java验证CXF可能正常工作。 (2)发布服务 A、服务器端 a.引入CXF的jar包 b.利用CXF发布服务,需要在相应服务接口上面添加@WebService注解

@WebService //加了该注解标识这个接口可以发布成一个服务 public interface IWeatherService { public String queryTqByCity(String city); }

c.编写一个main函数发布服务

public class WeatherDemo { public static void main(String[] args) { //1.创建JaxWsServerFactoryBean工厂 JaxWsServerFactoryBean jwsfb = new JaxWsServerFactoryBean(); //2.设置地址 jwsfb.setAddress("http://localhost:8080/WeatherService"); //3.设置服务的接口 jwsfb.setServiceClass(IWeatherService.class); //4.设置服务的实现类 jwsfb.setServiceBean(new WeatherServiceImpl()); //5.发布 jwsfb.create(); System.out.println("发布成功!"); } }

运行main函数让服务处于运行状态

B、客户端 a.创建一个客户端工程,在cmd控制台进入该工程src目录下:cd /d D:\eclipse_workspace\Webservice_client\src b.执行wsdl2java -d ./ http://localhost:8080/WeatherService?wsdl命令让服务加载到客户端(图中所示即是CXF从服务器端加载到客户端的接口和类) c.客户端测试数据:

public class WeatherClient { public static void main(String[] args) { //1.创建JaxWsPortProxyFactoryBean代理工厂 JaxWsProxyFactoryBean jwsc = new JaxWsProxyFactoryBean(); //2.指定服务地址 jwsc.setAddress("http://localhost:8080/WeatherService"); //3.设置服务视图 jwsc.setServiceClass(IWeatherService.class); //4.得到服务接口 IWeatherService weatherService = (IWeatherService) jwsc.create(); String result = weatherService.queryTqByCity("广州"); System.out.println(result); } }

以上即为Jax-ws应用远程调用的方式,具体原理图如下(客户端和服务器端通过soap来请求和响应): 2、CXF日志拦截器 (1)服务器端日志拦截器

public class ServerRelease { public static void main(String[] args) { //1.创建JaxWsServerFactoryBean工厂 JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean(); /** * 2.设置参数 */ //2.1设置访问地址(让客户端访问) factoryBean.setAddress("http://localhost:8080/userService"); //2.2设置接口类型 factoryBean.setServiceClass(UserService.class); //2.3设置实现类对象 factoryBean.setServiceBean(new UserServiceImpl()); /** * 设置日志拦截器 */ //输入拦截器 factoryBean.getInInterceptors().add(new LoggingInInterceptor()); //输出拦截器 factoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); //3.发布接口(阻塞方式) factoryBean.create(); System.out.println("发布成功!"); } }

需要注意的是设置日志拦截器要引入log4j配置文件,控制台才会打印日志信息(这里设置的log4j.rootLogger=info级别):

log4j.rootLogger=info,CONSOLE,file #log4j.rootLogger=ERROR,ROLLING_FILE log4j.logger.cn.smbms.dao=debug log4j.logger.com.ibatis=debug log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug log4j.logger.java.sql.Connection=debug log4j.logger.java.sql.Statement=debug log4j.logger.java.sql.PreparedStatement=debug log4j.logger.java.sql.ResultSet=debug log4j.logger.org.tuckey.web.filters.urlrewrite.UrlRewriteFilter=debug ###################################################################################### # Console Appender \u65e5\u5fd7\u5728\u63a7\u5236\u8f93\u51fa\u914d\u7f6e ###################################################################################### log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=error log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern= [%p] %d %c - %m%n ###################################################################################### # DailyRolling File \u6bcf\u5929\u4ea7\u751f\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u683c\u5f0f:log2009-09-11 ###################################################################################### log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.DatePattern=YYYY-MM-DD log4j.appender.file.File=log.log log4j.appender.file.Append=true log4j.appender.file.Threshold=error log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{YYYY-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n log4j.logger.com.opensymphony.xwork2=error

再次运行客户端程序请求服务,控制台打印如下,可以看出服务器和客户端直接通过soap进行请求和响应,且内容格式为:text/xml: (2)客户端日志拦截器

public class ClientReceive { public static void main(String[] args) { User user = new User(); //1.创建JaxWsPortProxyFactoryBean代理工厂 JaxWsProxyFactoryBean jwsc = new JaxWsProxyFactoryBean(); /** * 2.设置参数 */ //2.1设置访问地址 jwsc.setAddress("http://localhost:8080/userService?wsdl"); //2.2设置服务接口 jwsc.setServiceClass(UserService.class); //2.3创建接口代理类对象 UserService userService = (UserService) jwsc.create(); /** * 设置日志拦截器 */ //设置日至拦截器 Client client = ClientProxy.getClient(userService); //输入拦截器器(响应) client.getInInterceptors().add(new LoggingInInterceptor()); //输出拦截器(请求) client.getInInterceptors().add(new LoggingOutInterceptor()); List<User> list = userService.queryAllUser(); for(int i=0;i<list.size();i++) { System.out.println(list.get(i)); } } }

同样客户端也需要引入log4j配置文件:客户端是先输出在输入,服务器端时先输入再输出Message

三、Jax-ws规范下Spring整合ApacheCXF

1、开发服务端 (1)创建一个Maven工程 (2)在poem.xml引入依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.chen</groupId> <artifactId>webservice-cxf-spring-client</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <!-- cxf对jaxws的支持 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-core</artifactId> <version>3.1.4</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.1.4</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.4</version> </dependency> <!-- spring框架 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.2.0.RELEASE</version> </dependency> <!-- junit测试框架 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <!-- tomcat插件 --> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>8080</port> <server>tomcat7</server> </configuration> </plugin> </plugins> </build> </project>

(3)实现业务接口(跟之前UserService相同) 此处略… (4)配置web.xml,将spring配置文件和cxf设置成项目启动加载

<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 监听器启动Spring --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 启动CXF --> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> </web-app>

(5)编写spring配置文件方式发布接口(之前是通过类的mian函数发布)

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- Spring整合cxf发布服务关键点: 1、服务地址 2、服务类 服务完整访问路径:http://localhost:8080/ws//userService(/ws为web.xml中CXFServlet的urlMapping的<url-pattern>/ws/*</url-pattern>地址) --> <jaxws:server address="/userService" serviceClass="cn.cxf.service.UserService"> <jaxws:serviceBean> <bean class="cn.cxf.service.impl.UserServiceImpl" /> </jaxws:serviceBean> <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" /> </jaxws:inInterceptors> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" /> </jaxws:outInterceptors> </jaxws:server> </beans>

(6)启动Tomcat访问:http://localhost:8080/ws//userService?wsdl 2、开发客户端(可以选择建一个quickstart-Maven模块) (1)创建一个Maven工程 (2)在poem.xml引入依赖 (3)配置spring配置文件,创建服务接口代理类对象

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- Spring整合cxf客户端关键点: 1、服务地址:http://localhost:8080/ws/hello 2、服务接口类型 --> <jaxws:client id="helloService" serviceClass="com.chen.service.HelloService" address="http://localhost:8080/ws/hello"></jaxws:client> </beans>

(4)测试

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class Client { //注入对象 @Resource private HelloService helloService; @Test public void testServer(){ //查看接口代理对象 System.out.println(helloService.getClass()); //远程访问服务端方法 System.out.println(helloService.sayHello("Mary")); } }

结果:

三、Restful-Jaxrs

1、Restful编程风格 访问url地址更加简洁、更有层次感、 更易于浏览器缓存。 2、HTTP里面四个表示操作的的动词 GET:用来获取资源 POST:用来新建资源 PUT:用来更新资源 DELETE:用来删除资源 3、Jaxrs规范下webservice单独开发ApacheCXF (1)服务端 A、创建工程Maven-Models-quickstart引入依赖,引入log4j.properties

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.chen</groupId> <artifactId>jaxrs_server</artifactId> <version>1.0-SNAPSHOT</version> <name>jaxrs_server</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <!--客户端调用--> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-client</artifactId> <version>3.0.1</version> </dependency> <!--对json的支持--> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-extension-providers</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> <version>1.3.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.0.0</version> </dependency> </dependencies> <build> <plugins> <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --> <plugin> <artifactId>maven-site-plugin</artifactId> <version>3.7.1</version> </plugin> <plugin> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.0.0</version> </plugin> </plugins> </build> </project>

B、创建发布服务需要的实体类和接口以及接口实现类 为了简便这里只提供下IUserService接口的RESTFUL风格的接口方法:

@Path("/userService") //访问当前服务接口对应的路径 @Produces("*/*") public interface IUserService { @POST //增加 @Path("/user") //访问当前服务接口方法对应的路径 @Consumes({"application/xml","application/json"}) public void saveUser(User user); @PUT //修改 @Path("/user") @Consumes({"application/xml","application/json"}) public void updateUser(User user); @GET //查询 @Path("/user") @Produces({"application/xml","application/json"}) public List<User> findUsers(); @GET @Path("/user/{id}") @Consumes("application/xml") //服务器支持的请求数据格式类型 @Produces({"application/xml","application/json"}) //服务器支持的返回数据格式类型 public User findUserById(@PathParam("id") Integer id); @DELETE //删除 @Path("/user/{id}") @Consumes({"application/xml","application/json"}) public void deleteUser(@PathParam("id") Integer id); }

C、编写一个发布服务类:

public class Server { public static void main(String[] args) { //1.创建发布服务的工厂 JAXRSServerFactoryBean jaxrsServerFactoryBean = new JAXRSServerFactoryBean(); //2.设置服务的地址 jaxrsServerFactoryBean.setAddress("http://localhost:8080/ws/"); //3.设置服务类 jaxrsServerFactoryBean.setServiceBean(new UserServiceImpl()); //添加日志拦截器 jaxrsServerFactoryBean.getInInterceptors().add(new LoggingInInterceptor()); jaxrsServerFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); //4.发布服务 jaxrsServerFactoryBean.create(); System.out.println("发布服务成功!!"); } }

(2)客户端 A、创建工程Maven-Models-quickstart引入依赖(为了快速可直接复制服务端的依赖) 最主要的区别是客户端需要引入:

<!--客户端调用--> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-client</artifactId> <version>3.0.1</version> </dependency>

B、引入上述依赖后可以直接用WebClient调用服务端方法无需代理对象:

public class Client { @Test public void testSave(){ User user = new User(); user.setId(1); user.setUserName("Tom"); user.setCity("NewYork"); //通过WebClient对象远程调用服务端 //1、create():传入一个address返回一个WebClient对象 //2、post():以post方式请求,传入的参数user为方法->public void saveUser(User user);中的参数 WebClient.create("http://localhost:8080/ws/userService/user").post(user); } }

C、服务端日志显示的请求信息:

补充:WebClient .creat():指定服务端地址 .type():指定请求数据格式(xml/json) .accept():制定响应数据格式 .post()/.put()/.delete()/.get():指定请求类型

三、Jaxrs规范下webservice开发Spring整合ApacheCXF

1、服务端 (1)创建spring-web Model,引入依赖,编写web.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.chen</groupId> <artifactId>jaxrs_spring_server</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>jaxrs_spring_server Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!-- cxf 进行rs开发 必须导入 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>3.0.1</version> </dependency> <!-- 日志引入 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <!-- 客户端 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-client</artifactId> <version>3.0.1</version> </dependency> <!-- 扩展json提供者 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-extension-providers</artifactId> <version>3.0.1</version> </dependency> <!-- 转换json工具包,被extension providers 依赖 --> <dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> <version>1.3.7</version> </dependency> <!-- spring 核心 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> <!-- spring web集成 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.2.4.RELEASE</version> </dependency> <!-- spring 整合junit --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.2.4.RELEASE</version> </dependency> <!-- junit 开发包 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <showWarnings>true</showWarnings> </configuration> </plugin> <!-- 运行tomcat7方法:tomcat7:run --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!-- 指定端口 --> <port>8080</port> <!-- 请求路径 --> <path>/</path> </configuration> </plugin> </plugins> </build> </project>

(2)配置spring配置文件application.xml:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> <!-- Spring整合cxf发布基于restful风格的服务关键点: 1、服务地址 2、服务类 服务完整访问路径:http://localhost:8080/rs/user --> <jaxrs:server address="/user"> <jaxrs:serviceBeans> <bean class="service.UserServiceImpl"></bean> </jaxrs:serviceBeans> </jaxrs:server> </beans>

(3)启动tomcat即可,跟jaxws的区别就是applicationCotext.xml往容器里加组件的方式不同。 2、客户端 客户端请求服务跟jaxws整合spring相同,只需要更改一下WebClient.creat(address)中的adress即可。

四、其他方式请求webservice(Ajax、JQuery、HttpUrlConnection)

最新回复(0)