我正在玩我的jersey2休息服务.为了更好地概述给定的服务(描述,类型等),我大量使用了swagger(swagger-jersey2-jaxrs).所以我能够创建我的服务描述(swagger.json),我可以通过swagger ui来查看和探索它们.
现在,我需要创建一些客户端来使用这些服务.我来了accrooss swagger codegen cli这是一个很好的工具来生成你的客户端和许多不同的语言(在我的情况下为java).我能够生成api客户端和正在使用的模型.
在这里,我遇到了第一个问题.REST服务和swagger描述是http基本身份验证保护.我阅读了文档 ,它给了我一些暗示,有可能使用基本的auth.在这一点上,我不得不提到,从我的观点来看,doucmentation非常差.它说:
-a, - auth在远程获取swagger定义时添加授权标头.传入URL编码的name:header字符串,并用逗号分隔多个值.
我首先要做的是传递一个字符串,就像在http标题中,但这不起作用甚至谷歌搜索如何使用基本的auth与swagger cli没有导致一些明确的答案.经过大量的尝试和错误后我(我使用CLI 2.1.2)我最终得到了正确的格式,例如:
java -jar swagger-codegen-cli-2.1.2.jar generate -a"授权:基本YWRtaW46YWRtaW4 =" - i http:// localhost:8080/webproject/restapi/swagger.json -l java -o restclient
其中YWRtaW46YWRtaW4 =是我的情况下admin:admin的base64编码值.
到现在为止还挺好.生成的Java客户端也必须使用基本身份验证.我看了一下ApiClient中的方法,发现了setUsername和setPassword.我认为这种方法使客户端能够使用基本身份验证,但没有运气.
所以我深入研究了生成的类,特别是ApiClient和几个生成的ApiService类.我发现setUsername和setPassword没有效果,原因如下:
/**
* Helper method to set username for the first HTTP basic authentication.
*/
public void setUsername(String username) {
for (Authentication auth : authentications.values()) {
if (auth instanceof HttpBasicAuth) {
((HttpBasicAuth) auth).setUsername(username);
return;
}
}
throw new RuntimeException("No HTTP basic authentication configured!");
}
Run Code Online (Sandbox Code Playgroud)
同时HashMap定义如下:
// Setup authentications …Run Code Online (Sandbox Code Playgroud) 我在服务器上创建了一个枚举,其中手动设置了整数值,而不是从 0 开始默认增量
public enum UserType
{
Anonymous = 0,
Customer = 10,
Technician = 21,
Manager = 25,
Primary = 30
}
Run Code Online (Sandbox Code Playgroud)
我的服务器正在使用 AspNetCore.App 2.2.0 运行。它在 Startup.cs 中使用 swashbuckle aspnetcore 4.0.1 进行配置,以在每次服务器启动时生成一个 swagger json 文件来描述 api。
然后,我使用 NSwag Studio for windows v 13.2.3.0 生成带有该 swagger JSON 文件的 C Sharp api 客户端,以在 Xamarin 应用程序中使用。生成的 c Sharp api 客户端中生成的枚举如下所示 - 底层整数值与原始枚举不匹配。
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")]
public enum UserType
{
[System.Runtime.Serialization.EnumMember(Value = @"Anonymous")]
Anonymous = 0,
[System.Runtime.Serialization.EnumMember(Value = @"Customer")]
Customer = 1, …Run Code Online (Sandbox Code Playgroud) 我想使用Swagger Codegen for OpenAPI 3.0 YAML文件.我看到Swagger Codegen 3.0.0-rc0可用.但是当我尝试使用它时,我遇到了问题.以下是详细信息:
我的pom.xmlswagger-codegen插件文件:
<plugin>
<groupId>io.swagger</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>3.0.0-rc0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${basedir}/src/main/resources/mySpec.yaml</inputSpec>
<output>target/generated-sources</output>
<language>spring</language>
<generateApis>false</generateApis>
<modelPackage>com.kj.model</modelPackage>
<apiPackage>com.kj</apiPackage>
<configOptions>
<sourceFolder>swagger</sourceFolder>
<library>spring-mvc</library>
<interfaceOnly>true</interfaceOnly>
<useBeanValidation>true</useBeanValidation>
<dateLibrary>java8</dateLibrary>
<java8>true</java8>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
使用上面的插件,当我运行maven构建时,我得到了这个ServiceConfigurationError,这里是堆栈跟踪:
Exception in thread "main" java.util.ServiceConfigurationError: io.swagger.codegen.CodegenConfig: Provider io.swagger.codegen.languages.java.JavaClientCodegen not found
at java.util.ServiceLoader.fail(ServiceLoader.java:239)
at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:372)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at io.swagger.codegen.CodegenConfigLoader.forName(CodegenConfigLoader.java:19)
at io.swagger.codegen.config.CodegenConfigurator.toClientOptInput(CodegenConfigurator.java:392)
at io.swagger.codegen.plugin.CodeGenMojo.execute(CodeGenMojo.java:512)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我在 pom文件的maven插件部分添加了swagger-codegen-generators依赖项:
<dependencies> …Run Code Online (Sandbox Code Playgroud) 我用招摇,代码生成与-l typescript-angular选项生成的REST消费服务的库.生成的代码看起来像this(DefaultApi.ts):
namespace API.Client {
'use strict';
export class DefaultApi {
protected basePath = 'http://localhost:7331/v1';
public defaultHeaders : any = {};
static $inject: string[] = ['$http', '$httpParamSerializer', 'basePath'];
constructor(protected $http: ng.IHttpService, protected $httpParamSerializer?: (d: any) => any, basePath?: string) {
if (basePath !== undefined) {
this.basePath = basePath;
}
}
private extendObj<T1,T2>(objA: T1, objB: T2) {
for(let key in objB){
if(objB.hasOwnProperty(key)){
objA[key] = objB[key];
}
}
return <T1&T2>objA;
}
/**
* Delete a person. …Run Code Online (Sandbox Code Playgroud) 貌似官方招摇的OpenAPI的规范V3支持接近释放https://blog.readme.io/an-example-filled-guide-to-swagger-3-2/和招摇,代码生成了3.0.0支持开发并在分支上传递一定程度的测试https://github.com/swagger-api/swagger-codegen3.0.0
我有一个swagger规范(从我现有的2.0规范通过https://github.com/mermade/swagger2openapi生成,输出看起来不错)
是否有一种简单的方法来运行swagger-codegen而无需自己打包jar?
[main] INFO io.swagger.parser.Swagger20Parser - 从/input/myspec.openapi3.json读取[main] INFO io.swagger.codegen.ignore.CodegenIgnoreProcessor - 找不到.swagger-codegen-ignore文件.线程"main"中的异常java.lang.RuntimeException:缺少swagger输入或配置!at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:685)at io.swagger.codegen.cmd.Generate.run(Generate.java:285)at io.swagger.codegen.SwaggerCodegen.main(SwaggerCodegen.java) :35)
看起来swagger-codegen repo 在你构建之后运行一个docker容器有一些支持的方式; 我只是希望/猜测有一种支持的方法来做到这一点,而不需要在本地编译,因为我需要在几个地方设置它.
我刚刚开始使用Swagger和NodeJS.我能够将Swagger实现到我的NodeExpress应用程序,并且能够准确地生成带有Swagger-Codegen(Typescript-Angular)的typescript-client-code.
我遇到的一个问题是生成的代码分散了很多不同的文件.我希望它只输出一个文件api.ts,它包含API调用和接口/模型的所有内容.
我一直在寻找解决这个问题的方法,因为随着后端的增长,很难读取和维护生成的客户端代码.
任何建议或指示将不胜感激.
节日快乐!谢谢
编辑:我一直在寻找这个问题的答案,但仍然没有找到答案.我目前正在开发一个使用ASP.NET Core的项目,他们可以NSwag实现我想要实现的目标Node Swagger.
我正在构建一个React Native应用,它将使用Swagger 2.0定义的API。我去了https://github.com/swagger-api/swagger-codegen#where-is-javascript的 Swagger仓库,它指向了https://github.com/swagger-api/swagger-js的Javascript生成器。
问题在于生成器是动态的,并且由于我将客户端嵌入到移动应用程序中,因此动态生成器不是一种选择。他们还说,https://github.com/wcandillon/swagger-js-codegen上有一个第三方项目,该项目不再维护,并指向https://github.com/swagger-。 api / swagger-codegen。(虽然该第三方生成器正常工作,但我不希望使用可能随时中断的弃用工具,因为当新端点到达时我将更新API客户端。而且该工具也不会生成任何真正好的代码,因为它在自己的仓库中说)。
在这一点上,我被困住了。从Swagger定义生成静态Javascript客户端以在React Native中使用的受支持方式是什么?
我正在为具有 OpenAPI (Swagger) 定义的 REST API 构建模糊器。
我想测试 OpenAPI 定义中的所有可用路径,生成数据以测试服务器,分析响应代码和内容,并验证响应是否符合 API 定义。
我正在寻找一种从模型定义生成数据(JSON 对象)的方法。
例如,给定这个模型:
...
"Pet": {
"type": "object",
"required": [
"name",
"photoUrls"
],
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
"category": {
"$ref": "#/definitions/Category"
},
"name": {
"type": "string",
"example": "doggie"
},
"photoUrls": {
"type": "array",
"items": {
"type": "string"
}
},
"tags": {
"type": "array",
"items": {
"$ref": "#/definitions/Tag"
}
},
"status": {
"type": "string",
"description": "pet status in the store"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想生成随机数据并得到如下内容: …
codegen没有生成任何构造函数.我提到了petstore swagger文件,使用了最新的swagger codegen jar文件.
但是只生成了默认构造函数.
它不是基于其字段生成构造函数.
如何启用它?
有没有办法记录以下查询?
GET api/v1/users?name1=value1&name2=value
Run Code Online (Sandbox Code Playgroud)
其中查询参数名称是动态的,将从客户端接收.
我正在使用最新的Swagger API.
swagger-codegen ×10
swagger ×8
openapi ×4
swagger-2.0 ×3
java ×2
javascript ×2
angular ×1
asp.net-core ×1
c# ×1
express ×1
json ×1
maven ×1
nswagstudio ×1
react-native ×1
rest ×1
typescript ×1
webpack ×1