Git Product home page Git Product logo

agoda-com / autorest Goto Github PK

View Code? Open in Web Editor NEW

This project forked from azure/autorest

8.0 14.0 9.0 61.18 MB

Swagger (OpenAPI) Specification code generator featuring C# and Razor templates. Supports C#, Java, Node.js, TypeScript, Python and Ruby.

License: MIT License

Ruby 0.01% C# 73.34% JavaScript 23.35% PowerShell 0.30% Shell 0.01% CSS 0.01% HTML 1.32% Go 0.76% TypeScript 0.92% Smalltalk 0.01% Dockerfile 0.01%

autorest's Introduction

Repo Status Issue Stats Issue Stats

AutoRest

The AutoRest tool generates client libraries for accessing RESTful web services. Input to AutoRest is a spec that describes the REST API using the Open API Initiative format.

##Getting AutoRest The AutoRest tools can be installed with Nuget for use in a Visual Studio project: AutoRest NuGet

Alternatively it can be installed from Chocolatey by running: AutoRest Chocolatey

choco install autorest

Nightlies are available via MyGet: AutoRest MyGet

AutoRest can be run on macOS and *nix using Mono:

Download & Unpack Autorest

curl -LO https://github.com/Azure/autorest/releases/download/AutoRest-0.16.0/autorest.0.16.0.zip &&
unzip autorest.0.16.0.zip -d autorest/ &&
cd autorest && \

Download Swagger.json example

curl -O https://raw.githubusercontent.com/Azure/autorest/master/Samples/petstore/petstore.json && \

Run AutoRest using mono

mono AutoRest.exe
-CodeGenerator CSharp
-Input petstore.json
-OutputDirectory CSharp_PetStore -Namespace PetStore

Or Docker:

Download Swagger.json example

curl -O https://raw.githubusercontent.com/Azure/autorest/master/Samples/petstore/petstore.json

Download latest AutoRest Docker image

docker pull azuresdk/autorest:latest

Run AutoRest using Docker, mounting the current folder (pwd) into /home inside the container

docker run -it --rm -v $(pwd):/home azuresdk/autorest:latest autorest
-CodeGenerator CSharp
-Input /home/petstore.json
-OutputDirectory /home/CSharp_PetStore -Namespace PetStore

Building AutoRest

AutoRest is developed primarily in C# but generates code for multiple languages. See this link to build and test AutoRest.

Hint: There is a powershell script (verify-settings.ps1) in the Tools folder that can verify that you have the required compilers/tools/libraries installed on your development system before trying to build.

Hello World

For this version of Hello World, we will use AutoRest to generate a client library and use it to call a web service. The trivial web service that just returns a string is defined as follows:

public class HelloWorldController : ApiController
{
    // GET: api/HelloWorld
    public string Get()
    {
        return "Hello via AutoRest.";
    }
}

By convention, Swagger documents are exposed by web services with the name swagger.json. The title property of the info object is used by AutoRest as the name of the client object in the generated library. The host + path of the operation corresponds to the URL of the operation endpoint. The operationId is used as the method name. The spec declares that a GET request will return an HTTP 200 status code with content of mime-type application/json and the body will be a string. For a more in-depth overview of swagger processing, refer to Defining Clients With Swagger section of the documentation.

{
  "swagger": "2.0",
  "info": {
    "title": "MyClient",
    "version": "1.0.0"
  },
  "host": "swaggersample.azurewebsites.net",
  "paths": {
    "/api/HelloWorld": {
      "get": {
        "operationId": "GetGreeting",
        "produces": [
          "application/json"
        ],
        "responses": {
          "200": {
            "description": "GETs a greeting.",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}

Next, we invoke AutoRest.exe with this swagger document to generate client library code (see Command Line Interface documentation for details).

AutoRest is extensible and can support multiple types of input and output. AutoRest.exe comes with the AutoRest.json configuration file that defines the available inputs (Modelers) and outputs (CodeGenerators). When invoking AutoRest.exe, if you don't specify the -Modeler then Swagger is assumed and if you don't specify -CodeGenerator then CSharp is used.

The Swagger schema is language agnostic and doesn't include the notion of namespace, but for generating code, AutoRest requires -Namespace be specified. By default, the CodeGenerator will place output in a directory named Generated. This can be overridden by providing the -OutputDirectory parameter.

AutoRest.exe -CodeGenerator CSharp -Modeler Swagger -Input swagger.json -Namespace MyNamespace

Now, we will use the generated code to call the web service.

Create a console application called HelloWorld. Add the generated files to it. They won't compile until you add the NuGet package the generated code depends on: Microsoft.Rest.ClientRuntime.

You can add it to the Visual Studio project using the NuGet package manager or in the Package Manager Console with this command:

Install-Package Microsoft.Rest.ClientRuntime

Add the namespace that was given to AutoRest.

using MyNamespace;

Access the REST API with very little code (see Client Initialization and Client Operations for details).

var myClient = new MyClient();
var salutation = myClient.GetGreeting();
Console.WriteLine(salutation);

Running the console app shows the greeting retrieved from the service API.

C:\>HelloWorld.exe
Hello via AutoRest.

With that same basic pattern in place, you can now explore how different REST API operations and payloads are described in Swagger and exposed in the code generated by AutoRest.


This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.

autorest's People

Contributors

abhivijay96 avatar amarzavery avatar annatisch avatar bretjohnson avatar brjohnstmsft avatar devigned avatar dicko2 avatar dsgouda avatar fearthecowboy avatar jenol avatar jhancock93 avatar jianghaolu avatar joeldickson avatar john-hart avatar kevin-bronsdijk avatar kkchamp avatar lmazuel avatar markcowl avatar matthchr avatar nicklebedev37 avatar niklasgustafsson avatar ogail avatar olydis avatar ratchapol-an avatar stankovski avatar tbombach avatar veronicagg avatar vishrutshah avatar xingwu1 avatar yugangw-msft avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

autorest's Issues

collection types must be have a name ending with List or IList<T> will be used

This is a pretty sinister error. You must name your collections List or the type IList will be used instead of List. This is causing a compilation error:

[16:25:58]	[build] Models\PublishContext.cs(183,80): error CS1503: Argument 3: cannot convert from 'out System.Collections.Generic.List<string>' to 'out System.Collections.Generic.IList<string>'
[16:25:58]	[build] Models\CalSyncItemsResponse.cs(61,56): error CS1503: Argument 3: cannot convert from 'out System.Collections.Generic.List<Agoda.HostManage.TasksApi.Client.Models.CalSyncItem>' to 'out System.Collections.Generic.IList<Agoda.HostManage.TasksApi.Client.Models.CalSyncItem>'
[16:25:58]	[build] Models\PublishContext.cs(183,80): error CS1503: Argument 3: cannot convert from 'out System.Collections.Generic.List<string>' to 'out System.Collections.Generic.IList<string>'```

Empty Responses aren't handled well

Not working

  /v1/conversations/{id}/guest/read:
    post:
      tags:
        - conversations
      description: |
        Reset the unread count of the guest to 0
      operationId: GetConversationGuestRead
      parameters:
        - name: id
          in: path
          description: Conversation id
          type: integer
          format: int64
          required: true
      responses:
        '200':
          description: The request has succeeded

Work around is to add a string as the response (last 2 lines).

  /v1/conversations/{id}/guest/read:
    post:
      tags:
        - conversations
      description: |
        Reset the unread count of the guest to 0
      operationId: GetConversationGuestRead
      parameters:
        - name: id
          in: path
          description: Conversation id
          type: integer
          format: int64
          required: true
      responses:
        '200':
          description: The request has succeeded
          schema:
            type: string

Should support empty response

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.