JAX-RS RESTful webservice 服务端及客户端实现(基于HTTPS双向认证)

Qt c++以restful方式模拟http与https请求方法 折腾了好几天终于搞定了,分享一下结果吧首先网上找的资料都说是要安装openssl,然后把它的两个dll引用进来,libeay32.dll和ssleay32.dll.出于跨平台的想法,不太想用这个方法,研究了QT其实提供了sslsonfiure方法,应该是支持的。但是各种尝试下来,各种连接失败。提示qt.network.ssl: QSslSocket: cannot call unresolved 阅读详情

在ApacheCXF的Sample里以及网上很多有关RESTful HTTPS双向认证的文章介绍仅仅是理论,没有涉及实际环境的实现(客户端和服务端都是localhost);这几天使用Apache的CXF以及 Apache portable HttpClient实现跨IP的JAXRS HTTPS双向认证实现。

在实践中发现tomcat版本7.0.70和7.0.68在TLS/SSL支持上也存在差异。


一,尝试成功的环境

1,JDK7u71(Server端&服务端);

2,Service端Tomcat7.0.68

3,ServiceSDK:apache-cxf-3.1.6


二,建立自签名服务端和客户端密钥库并都加入对方导出的授权证书

1,密钥及证书生成和导入过程:

(Server端IP:192.168.245.133,Client端IP:192.168.245.1)

密钥库生成:keytool -genkeypair -validity 730 -alias serverkey -keystore serverkeystore.jks -dname "CN=192.168.245.133"
keytool -genkeypair -validity 730 -alias clientkey -keystore clientkeystore.jks -dname "CN=merrick"
客户端密钥库导入服务端证书:
keytool -export -rfc -keystore serverkeystore.jks -alias serverkey -file myserver.cer  
keytool -import -noprompt -trustcacerts -file myserver.cer -alias serverkey -keystore clientkeystore.jks  
服务端密钥库导入客户端证书:
keytool -export -rfc -keystore clientkeystore.jks -alias clientkey -file myclient.cer  
keytool -import -noprompt -keystore serverkeystore.jks -trustcacerts -file myclient.cer -alias clientkey

三,建立JAX-RS CXF服务端(集成Spring)

1,建立Web项目,导入必要的库文件:

commons-logging-1.0.3.jar
cxf-core-3.1.6.jar
cxf-rt-frontend-jaxrs-3.1.6.jar
cxf-rt-rs-json-basic-3.1.6.jar
cxf-rt-transports-http-3.1.6.jar
javax.annotation-api-1.2.jar
javax.servlet-api-3.1.0.jar
javax.ws.rs-api-2.0.1.jar
spring-aop-4.1.9.RELEASE.jar
spring-beans-4.1.9.RELEASE.jar
spring-context-4.1.9.RELEASE.jar
spring-core-4.1.9.RELEASE.jar
spring-expression-4.1.9.RELEASE.jar
spring-web-4.1.9.RELEASE.jar
woodstox-core-asl-4.4.1.jar
xmlschema-core-2.2.1.jar

2,配置web.xml

<span style="font-size:12px;"><?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>cxfjaxrsbasicrestserver1</display-name>  
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/beans.xml</param-value>
    </context-param>
  
    <listener>
        <listener-class>
                        org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>  
    <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>/basiccxf/*</url-pattern>
    </servlet-mapping>  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app></span>

3,配置Spring的beans.xml(路径如上述)

<span style="font-size:12px;"><?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:aop="http://www.springframework.org/schema/aop" 
	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://www.springframework.org/schema/aop  
	http://www.springframework.org/schema/aop/spring-aop.xsd 
	http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
   	<import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>    
    <bean id="gameinfoservice" class="cxf.rest.basic.server.GameInfoServiceImpl"/>
    
    <jaxrs:server id="gameabc" address="/">
        <jaxrs:serviceBeans>
            <ref bean="gameinfoservice"/>
        </jaxrs:serviceBeans>
    </jaxrs:server>
</beans></span>

4,建立服务接口、服务实现类、XMLBean

<span style="font-size:12px;">package cxf.rest.basic.server;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/gameinfo/")
public interface GameInfoService {

	
	@GET
	@Path("/basicinfo/")
	Response getBasicinfo(@Context HttpServletRequest req);

	@GET
	@Path("/basicinfo/{id}/")
	@Produces(MediaType.APPLICATION_XML)
	GameEntity getOneGameinfo(@PathParam(value = "id") int id);
	
	@GET
	@Path("/basicinfo2/{id}/")
	Response getOneGameinfo2(@PathParam("id") String id);
	
	@GET
	@Path("/basicinfo3/")	
	Response getOneGameinfo3();
}
</span>

<span style="font-size:12px;">package cxf.rest.basic.server;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="EGame")
public class GameEntity {
	
	private int id;
	
	private String name;
	
	private String publishdate;
	
	private String producer;
	
	private String type;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPublishdate() {
		return publishdate;
	}

	public void setPublishdate(String publishdate) {
		this.publishdate = publishdate;
	}

	public String getProducer() {
		return producer;
	}

	public void setProducer(String producer) {
		this.producer = producer;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}
	

}
</span>

<span style="font-size:12px;">package cxf.rest.basic.server;

import java.util.Date;
import java.util.Hashtable;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

public class GameInfoServiceImpl implements GameInfoService {
	
	Map<Integer,GameEntity> gms = new Hashtable<Integer,GameEntity>();
	
	public GameInfoServiceImpl() {

		System.out.println("-----GameInfoServiceImpl constructor ");
		GameEntity et = new GameEntity();
		et.setId(123);
		et.setName("HEROS");
		et.setProducer("3DO ltd.");
		et.setPublishdate("1995-01-01");
		et.setType("Stratigy 回合游戏");
		gms.put(123, et);
		
	}

	@Override
	public Response getBasicinfo(HttpServletRequest req) {

		System.out.println("-------Invoking "+ this.getClass().getName() + ".getBasicinfo(), "+ req.getServletContext().getServerInfo());
		
		Response r = Response.ok(new String("123"),MediaType.TEXT_PLAIN).build();	
		
		
		return r;
	}

	@Override
	public GameEntity getOneGameinfo(int id) {

		System.out.println("-------Invoking "+ this.getClass().getName() + ".getOneGameinfo(), " + id);
		System.out.println(new Date().toString());
		GameEntity e = gms.get(123);
			
		System.out.println("entity null? " + (e==null));
		
		return e;
	}

	@Override
	public Response getOneGameinfo2(String id) {
		System.out.println("-------Invoking "+ this.getClass().getName() + ".getOneGameinfo2()");
		
		Response r = Response.ok(gms.get(123),MediaType.APPLICATION_XML_TYPE).build();	
		return r;
	}

	@Override
	public Response getOneGameinfo3() {

		System.out.println("-------Invoking "+ this.getClass().getName() + ".getOneGameinfo3()");
		GameEntity e = gms.get(123);
		Response r = Response.ok(gms.get(123),MediaType.APPLICATION_JSON_TYPE).build();
		//to be continued..............................//JSON 
		return r;
	}
	
	



}
</span>


5,RuntimeServer Tomcat7.0.68的Server.xml中配置HTTPS有关的Connector

由于是双向认证,服务端同样需要验证客户端,所以clientAuth需要配置为true

<span style="font-size:12px;"><Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="true" sslProtocol="TLS"
                 keystoreFile="conf/serverkeystore.jks" keystorePass="passwd"
                 truststoreFile="conf/serverkeystore.jks" truststorePass="passwd"
     /></span>

四,建立Client端

仅列出无论localhost还是跨IP的情况下都成功的code:

public static void getEntity_51() throws Throwable{//SSL client get
		
		/**
		 * Fail!: Javax.net.ssl.sslhandshakeexception: 
		 * received fatal alert: handshake_failure(when Server tomcat7.0.70, Server JDK 7u9; Client JDK 7u71)
		 * 
		 * Fail!: javax.net.ssl.SSLHandshakeException: 
		 * Received fatal alert: handshake_failure(when Server tomcat7.0.70, Server JDK 7u71; Client JDK 7u71)
		 * 
		 * Success !(server tomcat7.0.68, JDK 7u71;  client JDK 7u71)
		 * 
		 * tomcat7.0.70的ssl支持有问题
		 * 
		 * */
		DefaultHttpClient httpclient = getHTTPsClient("/clientkeystore.jks","passwd",8443);	
		HttpGet httpget = new HttpGet("https://192.168.245.133:8443/cxfjaxrsbasicrestserver1/basiccxf/gameinfo/basicinfo2/1234/");
	//	httpget.addHeader(new BasicHeader("Accept" , "text/xml"));
		
		httpclient.addRequestInterceptor(new HttpRequestInterceptor() {
			
			@Override
			public void process(HttpRequest arg0, HttpContext arg1) throws HttpException, IOException {				
				
				Header[] h  = arg0.getAllHeaders();
		        for (int i = 0; i < h.length; i++) {
					System.out.println("---request header: "+h[i]);
				}
		        
				
			}
		});
		httpclient.addResponseInterceptor(new HttpResponseInterceptor() {
			
			@Override
			public void process(HttpResponse arg0, HttpContext arg1) throws HttpException, IOException {
			
				Header[] h  = arg0.getAllHeaders();
		        for (int i = 0; i < h.length; i++) {
					System.out.println("reponse header: "+h[i]);
				}
				
			}
		});
		
		HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        String rss = EntityUtils.toString(entity, "utf-8");
        System.out.println(rss);//注意字符编码
        
        XMLparse.parsestringtoxml(rss);//Dom4j API, be used to parse response string to xml document object//DocumentHelper.parseText(s);
        
		
    //    entity.writeTo(System.out);
        httpclient.getConnectionManager().shutdown();
        httpclient.close();
		
	}

	public static DefaultHttpClient getHTTPsClient(String jksname, String password,  int httpsserverport){//success	
		
		DefaultHttpClient httpclient = null;			
		try {
			String keyStoreLoc =  Client1.class.getClassLoader().getResource("").getPath() + jksname;
			System.out.println("jks path: " + keyStoreLoc);
			KeyStore trustStore  = KeyStore.getInstance("JKS");			
			trustStore.load(new FileInputStream(keyStoreLoc), password.toCharArray());
			SSLSocketFactory sf = new SSLSocketFactory(trustStore, password, trustStore);
			Scheme httpsScheme = new Scheme("https", httpsserverport, sf);
			httpclient = new DefaultHttpClient();
			httpclient.getConnectionManager().getSchemeRegistry().register(httpsScheme);			
			
		} catch (Throwable e) {			
			e.printStackTrace();		}  
        
		return httpclient;
	}

测试情况:

jks path: /D:/workspace_ElipseJEE_mars2/cxfjaxrsbasicrestclient1/bin//clientkeystore.jks
---request header: Host: 192.168.245.133:8443
---request header: Connection: Keep-Alive
---request header: User-Agent: Apache-HttpClient/4.5.2 (Java/1.7.0_71)
reponse header: Server: Apache-Coyote/1.1
reponse header: Date: Tue, 18 Oct 2016 05:58:41 GMT
reponse header: Content-Type: application/xml
reponse header: Content-Length: 200
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><EGame><id>123</id><name>HEROS</name><producer>3DO ltd.</producer><publishdate>1995-01-01</publishdate><type>Stratigy 回合游戏</type></EGame>
root name: EGame
Node : id ====> 123
Node : name ====> HEROS
Node : producer ====> 3DO ltd.
Node : publishdate ====> 1995-01-01
Node : type ====> Stratigy 回合游戏


`javax.ws.rs.core` 是Java Representational State Transfer (JAX-RS)规范的一部分 JAX-RS规范的主要目标是提供一种简单而统一的方式来开发基于REST架构的Web服务,使得Java开发者能够利用Java语言创建符合REST原则(如资源定位、无状态性、自描述消息等)的HTTP服务。它是Java EE的一部分,支持通过注解驱动的方式进行开发,简化了API的定义与客户端的访问过程。是Java Representational State Transfer (JAX-RS)规范的核心组成部分,它提供了一系列的类和接口来支持RESTful Web服务的开发。),以及与资源处理相关的类(如。 阅读详情

相关推荐

apache-cxf-3.1.6所有jar包

apache-cxf-3.1.6所有jar包

Restful架构2

网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备......)。 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API构架的流行,甚至出现"API First"的设计思想。RESTful API是目前比较成熟的一套互联网应用程序的API设计理论。我以前写过一篇《理解RESTful架构》,探讨如何理解这个概

凡夫不俗子 441

javax-ws java自带webservice实现方式

javax-ws java自带webservice实现方式 简单代码实现

java jax-rs拦截器_rest – 使用拦截器和注入在JAX-RS中进行身份验证/授权

在我看来,只要您不尝试使用此用户对象构建类似会话的内容,此方法就是有效的.作为answered here你可以使用@Context和@Provider,但这不完全是你想要的.使用Resteasy Dispatcher可以直接为每个@Context注入一个类.但是在这里你必须注册应该注入的Object.我认为这对请求范围的参数没有意义.您可以做的是注入这样的提供者:// Constructor of...

weixin_42143092的博客 461

从原始数据到农学模型:DJI M3M/P4M多光谱影像全链路处理实战

本文详细介绍了使用DJI M3M/P4M多光谱无人机进行农学建模的全链路流程。核心在于强调辐射标定的首要性,它将原始DN值转换为具有物理意义的反射率,是确保后续植被指数计算与模型反演准确性的基石。文章通过大疆智图和Pix4Dfields的实战演示,手把手指导完成数据处理、影像镶嵌及光谱信息提取,最终构建从光谱指数到叶面积指数等关键农学参数的反演模型,实现精准农业分析。

weixin_29281941的博客 243

IDEA中Maven工具栏与命令执行全攻略:高效开发必备技巧

IntelliJ IDEA 作为强大的 Java 开发工具,其 Maven 功能独具优势。Maven 工具栏位于工作区右侧,图标功能丰富,涵盖项目导入、源码处理、依赖操作等。执行 Maven 命令有多种途径,Run Anything 窗口可输入或选目标执行,上下文菜单能右键运行目标,还可创建运行配置,指定命令参数后运行,为开发者高效管理 Maven 项目、便捷执行命令提供有力支持。

2301_82300081的博客 2029

apache-cxf-3.1.6(webService接口开发maven)

1 结构图 2 jar包 pom.xml     org.apache.cxf cxf-core 3.1.5   org.apache.cxf cxf-rt-frontend-jaxws 3.1.5 org.apache.cxf cxf-rt-transports-http-jetty 3.1.5         junit

doutao6677的专栏 5804

FC游戏Hack实战:从零开始修改游戏数据

本文以《忍者神龟3》为例,详细介绍了从零开始进行FC游戏Hack的完整实战流程。通过使用FCEUX模拟器和调试器,结合“递减法”精准定位生命值内存地址,并利用十六进制编辑器修改关键指令,最终实现“无限生命”效果。文章旨在引导读者理解游戏数据修改的核心原理与操作技巧,重温经典的同时深入计算机程序运行机制。

weixin_28366353的博客 356

Style of WebService: REST vs. SOAP

       在SOA的基础技术实现方式中WebService占据了很重要的地位,通常我们提到WebService第一想法就是SOAP消息在各种传输协议上交互。近几年REST的思想伴随着SOA逐渐被大家接受,同时各大网站不断开放API提供给开发者,也激起了REST风格WebService的热潮。        在收到新需求Email之前,我对REST的理解仅仅是通过半懂不懂的看了Fieldin

WEB(RoR)_C(性能)_Elrang(并发)|周期迭代+持续集成+及时沟通 1004

MFC中的CMFCToolBar:自定义按钮提示消息

通过以上步骤,您可以在MFC应用程序中使用CMFCToolBar创建自定义按钮,并设置按钮的提示消息。通过以上步骤,您可以在MFC应用程序中使用CMFCToolBar创建自定义按钮,并设置按钮的提示消息。通过上述代码,您可以在MFC应用程序中添加一个名为"ID_BUTTON_CUSTOM"的自定义按钮,并将其提示消息设置为"自定义提示消息"。通过上述代码,您可以在MFC应用程序中添加一个名为"ID_BUTTON_CUSTOM"的自定义按钮,并将其提示消息设置为"自定义提示消息"。

PixelInk的博客 1084

【U-Net 数据集制作】如何制作自己的图像分割数据集?(标注与格式转换),图像分割数据集制作与转换神器

在前面的课程中,我们像搭积木一样手写了 U-Net 的网络架构。很多同学迫不及待地想把自己的图片喂进网络开始“炼丹”。但是,深度学习界有一句名言:“数据决定了模型的上限,而网络结构只是在逼近这个上限。用标注工具标出来的是 JSON 文件,怎么变成 U-Net 需要的黑白掩码(Mask)图?为什么我的 Mask 肉眼看是黑白的,一放进 PyTorch 训练就报?如何快速按 8:2 的比例把几千张图片和标签划分成训练集和验证集?

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 191

WebService接口客户端生成与调试实战指南

**WebService**接口? 刚入职场时听到这个词时,对于中登的我来说很陌生。 上大学都学的是**RESTful**风格的接口,对于这个接口如何调用都不清楚。     但又一想,不都是接口传数据嘛。这有什么难的! 等到真正对接时,客户发来一串地址,直接让我对接接口。我懵了~ 这都没有接口文档的嘛?什么意思?     相信大家在刚接触**WebService**接口时,也有同样的疑惑,毕竟目前主流的都是**RESTful*

心态的博客 451

YOLOv11全网首发:注意力独家魔改 | 具有切片操作的SimAM注意力,魔改SimAM助力小目标检测

1)直接作为注意力使用,效果秒杀SimAM;2)高效和卷积结合,代替原始网络的卷积操作;

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1571

配置restful接口https访问

最近项目中有个需求,把以前的restful接口采用https的形式访问,从网上查了一下资料,经过亲测之后实现了需求。 网上的资料整理之后如下,请阅。 1、按照上篇文章tomcat6.0配置https单向(服务器)加密方法配置服务器https访问。 2、两种方式配置rest接口https方式: 第一种:web.xml中增加             securedapp

zhanglu5116的专栏 7847

Android 12.0 framework系统修改安兔兔等显示的屏幕尺寸大小功能实现

在12.0的系统rom定制化开发中,在使用第三方app检测系统的一些信息中,比如安兔兔 设备信息等检测app中,有时候显示的屏幕尺寸大小和 产品规格书等信息不同,稍微有些差异,所以就需要看下系统framework层中,相关的设备信息是怎么读出来的,然后做些调整 接下来就来分析相关功能

安卓兼职framework和app工程师的博客 477

物联网通信中NB-IoT、Cat.1、LTE-M该如何选择?

首先我们要确定我们产品的关键需求,例如:我们的设备是否对数据传输速率有较高的要求,有较高要求我们就需要选择较高传输速率的Cat.1来开发我们的产品。同时关于产品性能方面,我们对功耗、延迟、可靠性也会有所要求,例如我们的产品为移动端产品,不方便布线以及安装电源,那我们就会采用电池供电的方式,所以在选择时可以优先考虑低功耗产品,最终结合其他需求选择出合适的协议。首先,我们需求的产品是不同的,我们需要根据产品需求或项目需求来进行选择,NB-IoT、Cat.1、Cat.M都有属于自己的优势。

a1809032425的博客 1215

beego RESTful API工程下使用https访问api接口

1、开启https,关闭http: 在app.conf中设置即可,相关设置项如下: EnableHTTP=false httpport = 8080 EnableHTTPS=true EnableHttpTLS = true HttpsPort = 443 HTTPSCertFile = "server.crt" HTTPSKeyFile = "server.key" https端口可...

余欲与鱼御雨渔 1340

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

restful请求方式调用采用 https协议的接口

额外的注解说明: @Autowired -------根据类型从spring容器里进行自动装配 @Qualifier -------@Qualifier(“XXX”) 中的 XX是某一处声明的Bean 的名称(@Bean(name=“XXX”)),所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了 首先直接上忽略https证书验证的代码: package com.dic.dms.config; import org.apa

98小哥哥的博客 1347

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

使用restful请求https身份不通过, unable to find valid certification path to requested target,使用java生成签名证书

在用spring的RestOperations(顶层类),RestTemplate发送restful请求https(ssl)时候 身份验证失败 因为我们是请求的https格式,服务器端是要求你有签名证书的 第一种解决方法,使用InstallCert.java文件生成 /* * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.

偶是一只小小鸟~ 4336

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# 请求Restful 兼容http和https

using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Net.Security; using System.Security.Cryptography.X509Certificates; namespace Test.NetCore.Communication { public enum HttpVerb { .

牛宝宝的专栏 714

使用javax.ws.rs构建Restful API和借助Dubbo实现远程RPC调用

java.ws.rs 是 jax-rs 规范中定义的包名。 jax-rs全程 Java API for RESTful Services 关于jax-rs相关的参考: https://blog.youkuaiyun.com/wabiaozia/article/details/70487306 https://www.cnblogs.com/caogen1991/p/7902722.html htt...

weixin_42465125的博客 3130

javax.ws.rs-api 常用注解

javax.ws.rs-api 常用注解 WebService 文章目录javax.ws.rs-api 常用注解@Path@GET @POST @PUT @DELETE@Consumes示例@Produces示例@PathParam示例@QueryParam示例@FormParam示例@FormDataParam@HeaderParam示例@CookieParam@MatrixParam示例@DefaultValue示...

七乘563的博客 3万+

javax.​ws.​rs注解:@Conumes 和 @Produces等

1、概述 @Consumes 注释代表的是一个资源可以接受的 MIME 类型。 @Produces 注释代表的是一个资源可以返回的 MIME 类型。 这些注释均可在资源、资源方法、子资源方法、子资源定位器或子资源内找到。   2、@Produces:返回的类型   a.返回给client字符串类型(text/plain)   @Produces(MediaType.TEXT_P...

aaaliuwei的博客 3047

rest架构风格

REST是一种混合的架构风格,它的由来以及它的架构元素在笔者的前一篇文章《REST 架构风格的由来 & 元素》中已经描述了。本篇主要描述一下J2EE对REST的支持。Java是在J2EE6中引入了对REST的支持,即JSR-311(JAX-RS 1.1: The JavaTM API for RESTful Web Services),现在JAX-RS到2.0版本了,对应的是JSR-339,JSR是

琦琦可乐的博客 931

01_学习使用javax_ws_rs_上传文件

如果我们不使用 Spring MVC , 而是 javax.ws.rs 的注解,该如何实现文件上传呢?

ShiJunzhiCome的博客 1481

java restful接口开发_Java基于JAX-RS开发Restful接口总结

JAX-RS常用注解:@Path,标注资源类或者方法的相对路径@GET,@PUT,@POST,@DELETE,标注方法是HTTP请求的类型。@Produces,标注返回的MIME媒体类型@Consumes,标注可接受请求的MIME媒体类型@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参...

weixin_29006701的博客 818
上一篇: 速度还可以的几个Maven Mirror
下一篇: jaxws soap webservice 使用apache cxf tool ——wsdl2java
johnsearcher
博客等级 码龄17年 12粉丝 55原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值