我已经使用Jersey工作了几天的REST Web服务,并设法让所有CRUD操作工作,有几种交换格式:XML,JSON,Google Protobuf.
但是,我面临一些与自动生成的WADL和XSD相关的问题.
为了定义以这三种格式交换的对象,我遵循了"契约优先"的方法:
但是,由于我希望我的用户也能够生成他们的类,我想分享这些模式文件(.xsd和.proto)并将它们与自动生成的WADL很好地集成.
为此,感谢这个维基页面:
/schema/schema.xsd/schema/schema.proto我添加了一个应用程序语法文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grammars xmlns="http://wadl.dev.java.net/2009/02"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xi="http://www.w3.org/1999/XML/xinclude">
<include href="../schema/schema.xsd" />
</grammars>
Run Code Online (Sandbox Code Playgroud)我添加了一个自定义的WADL生成器:
public class RichWadlGeneratorConfig extends WadlGeneratorConfig {
@Override
public List<WadlGeneratorDescription> configure() {
return generator(WadlGeneratorApplicationDoc.class)
.prop("applicationDocsStream", "application-doc.xml")
.generator(WadlGeneratorGrammarsSupport.class)
.prop("grammarsStream", "application-grammars.xml")
.descriptions();
}
}
Run Code Online (Sandbox Code Playgroud)这样,当我点击时,下面出现在WADL中/rest/application.wadl:
<grammars>
<include href="../schema/schema.xsd"/>
<include href="application.wadl/xsd0.xsd">
<doc title="Generated" xml:lang="en"/>
</include>
</grammars>
Run Code Online (Sandbox Code Playgroud)
/rest/application.wadl/xsd0.xsd是从我的课程自动生成的,但与我最初的课程有很大的不同schema.xsd.除此之外,调用像wadl2java这个WADL 这样的工具失败了,大概是因为
/schema/schema.xsd …哪种是开发Web服务的更好方法; 合同第一或合同最后?
各有哪些优缺点?
你有哪些经验?
编辑 这个问题是关于Web服务的实现(读取:SOAP)问题是实现类是否应该首先编码,WSDL和XSD模式是从那里生成的(最后合同)还是首先编写的WSDL和XSD模式以及生成的实现类(合同优先)
在实际情况中,这个问题更多的是探索人们在社区中所做的事情,而非特定目标问题.我已经对此进行了广泛的搜索,虽然我发现许多博客主张提出契约优先服务设计并且有一些评论支持它们,但我还没有找到关于实施与WCF合同优先的实用信息,优缺点我在最近对SOA进行了一些广泛的研究,主要是通过Thomas Erl的书籍,他提倡的主要概念之一是契约优先设计.
我的问题如下:
合同优先发展的主要问题之一似乎是工具.Svcutil是我发现的唯一可以从合同生成服务代码的东西,它有一些非常差的输出.它的单个文件,充满了属性和代码生成工件,它基本上需要在合同更新时重新生成和替换.我更喜欢更好的方法,最好是不需要再生更换的方法.我甚至可以手动创建服务端合同,假设它在实际场景中是实用的.
编辑:
我手动创建了一个WSDL,它只有一个没有输入参数且没有输出参数的操作.
当我尝试从此WSDL创建客户端时,我收到以下错误:
无法导入wsdl:portType详细信息:运行WSDL导入扩展时抛出异常:System.ServiceModel.Description.DataContractSerializerMessageContractImporter错误:具有目标命名空间的架构" http://www.xmlns.mycompany.com/GAME/service/Associate/ 1.1 / '无法找到.XPath到错误源:// wsdl:definitions [@ targetNamespace =' http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/']/wsdl:portType [@ name ='GAMEAssociateIntf'] C :\工具箱\ BlueTest\BloodRedTest\BloodRedTest \服务
的types (在客户机中使用)需要从本WSDL中的XML生成.我认为,在添加服务引用时,由于XML中的一些错误,该工具无法创建它.该XSD似乎是问题.
需要在WSDL中进行哪些更改才能创建代理?
注意:我试图包含WSDL本身定义的xml类型.[我不需要单独的文件进行架构保护]
WSDL
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="GAMEAssociate"
targetNamespace="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/"
xmlns:tns="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsp="http://www.w3.org/ns/ws-policy"
>
<types>
<xsd:schema>
</xsd:schema>
<xsd:element name="myData">
<xsd:complexType />
</xsd:element>
<xsd:element name="myDataResponse">
<xsd:complexType />
</xsd:element>
</types>
<message name="getAllVicePresidentsRequest">
<part element="tns:myData" name="getAllVicePresidentsRequest"/>
</message>
<message name="getAllVicePresidentsResponse">
<part element="tns:myDataResponse" name="getAllVicePresidentsResponse"/>
</message>
<portType name="GAMEAssociateIntf">
<operation name="getAllVicePresidents">
<input message="tns:getAllVicePresidentsRequest"/>
<output message="tns:getAllVicePresidentsResponse"/>
</operation>
</portType>
<binding name="GAMEAssociateIntfBinding" type="tns:GAMEAssociateIntf"> …Run Code Online (Sandbox Code Playgroud) 我使用SvcUtil.exe从wsdl文件生成IClassName.cs文件,这是正常的.我的问题是我不知道如何使用SvcUtil.exe的命令参数生成ClassName.svc文件.
运行SvcUtil.exe之后,我想获得WCF服务,就像从包含所有类*.svc,*.cs和interface的Visual Studio向导创建时一样.
谢谢,Skrch
我正在尝试使用Swagger Codegen » 2.2.1生成一些 Web 服务定义
所有配置都在工作,并且我的.yaml定义正确生成了类。
为什么该属性
basePath被忽略?
我@RestController只使用paths定义生成:
https://springboot-base-save-return.appdes.xnet/saveBackendReturn
Run Code Online (Sandbox Code Playgroud)
预期(使用basePath和paths定义):
https://springboot-base-save-return.appdes.xnet/v1/saveBackendReturn
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我忘记了什么吗?
我的.yaml合同:
swagger: '2.0'
info:
description: My Project
version: 1.0.0
title: Save Backend Return
host: springboot-base-save-return.appdes.xnet
basePath: /v1
tags:
- name: saveBackendReturn
description: Save Backend Return
schemes:
- https
paths:
/saveBackendReturn:
post:
tags:
- saveBackendReturn
summary: Save Backend Return
description: My Project
operationId: saveBackendReturn
consumes:
- application/json
produces:
- application/json
parameters:
- …Run Code Online (Sandbox Code Playgroud) 我有VisualStudio 2012,我正在尝试按照以下教程http://msdn.microsoft.com/en-us/library/hh674270.aspx
但是我无法从"模板"对话框的WCF窗格中找到" 架构定义 "选项.
我必须安装一些东西吗?那会是什么?也许延伸?
提前致谢.
schema xsd contract-first visual-studio-extensions visual-studio-2012
我有一个WSDL,我需要生成一个ServiceContract(OperationContract,DataContract)...
我找到了一种方法为ASMX WebServices做到这一点,但似乎无法在WCF中找到如何做到这一点.
我试过跑步
svcutil AuthPartnerWSDL.wsdl /i /messagecontract /tcv:version35
Run Code Online (Sandbox Code Playgroud)
但是生成的接口不会反序列化进入的调用,因此服务实现的所有请求参数都是 null
我有一个WCF服务和两个控制台应用程序客户端.
服务:使用WCSF Blue工具从wsdl联系人创建服务代码.
客户端1:此客户端使用通过浏览svc文件获得的wsdl.此浏览的wsdl文件与合同wsdl文件略有不同.
客户端2:此客户端使用原始wsdl合同创建.
Cleint1工作正常.客户端2无法正常工作.什么都可能是潜在的问题?
两个客户端的App.Config文件看起来相似 - 只有名称更改.我认为,问题将在客户端生成C#代码 - 最有可能在Action - ReplyAction中.这里有什么需要纠正的?
一个明显的区别在于Action和ReplyAction
客户1:
Action ="urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/GetMultiplied",ReplyAction ="urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/GetMultipliedRe"+"sponse"
客户2:
Action ="urn:lijo:demos:multiplyservice:calculation:v1:getMultipliedIn",ReplyAction ="*"
跟踪消息
由于EndpointDispatcher上的ContractFilter不匹配,因此无法在接收方处理具有Action'urn:lijo:demos:multiplyservice:calculation:v1:getMultipliedIn'的消息.这可能是由于合同不匹配(发送方与接收方之间的操作不匹配)或发送方与接收方之间的绑定/安全性不匹配.检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息,传输,无).
编辑
这可以通过更改Action和ReplyAction来更正,如下所示(从服务中复制).
[System.ServiceModel.OperationContractAttribute(Action = "urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/getMultiplied", ReplyAction = "urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/getMultipliedRe" +
"sponse")]
Run Code Online (Sandbox Code Playgroud)
注意:确保服务中的外壳正确是很重要的(即getMultiplied不是GetMultiplied)
从服务中复制不是一个好的选择,尽管它有效.什么是正确的Action和ReplyAction?
另外,您能否指出如何修改wsdl以使ReplyAction在生成的客户端代理中正确?这是将其标记为已回答的重要部分.
用于元数据发布的WsdlExporter忽略使用星号操作(Action和ReplyAction)的操作.
在服务中指定星号指示WCF不向消息添加回复操作,如果您直接对消息进行编程,这将非常有用.
参考文献:
RestaurantData.xsd
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="RestaurantData" targetNamespace="urn:lijo:demos:multiplyservice:data:v1"
elementFormDefault="qualified" xmlns="urn:lijo:demos:multiplyservice:data:v1"
xmlns:mstns="urn:lijo:demos:multiplyservice:data:v1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="multipliedResult">
<xs:sequence>
<xs:element name="resultNumber" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
原始合同wsdl
<definitions xmlns:import0="urn:lijo:demos:multiplyservice:messages:v1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:import1="urn:lijo:demos:multiplyservice:data:v1" xmlns:tns="urn:lijo:demos:multiplyservice:calculation:v1" …Run Code Online (Sandbox Code Playgroud)