Ballerina is a general purpose, concurrent and strongly typed programming language with both textual and graphical syntaxes, optimized for integration. In this post we will discuss how we can use ballerina swagger connector development tool to develop connector using already designed swagger API.
First download zip file content and unzip it into your local machine. Also you need to download ballerina composer and run time from the ballerinalang web site to try this.
First download zip file content and unzip it into your local machine. Also you need to download ballerina composer and run time from the ballerinalang web site to try this.
Now we need to start back end for generated connector.
Goto student-msf4j-server directory and build it.
/swagger-connector-demo/student-msf4j-server>> mvn clean install |
Now you will see micro service jar file generated. Then run MSF4J service using following command.
/swagger-connector-demo/student-msf4j-server>> java -jar target/swagger-jaxrs-server-1.0.0.jar starting Micro Services 2017-02-19 21:37:44 INFO MicroservicesRegistry:55 - Added microservice: io.swagger.api.StudentsApi@25f38edc 2017-02-19 21:37:44 INFO MicroservicesRegistry:55 - Added microservice: org.wso2.msf4j.internal.swagger.SwaggerDefinitionService@17d99928 2017-02-19 21:37:44 INFO NettyListener:68 - Starting Netty Http Transport Listener 2017-02-19 21:37:44 INFO NettyListener:110 - Netty Listener starting on port 8080 2017-02-19 21:37:44 INFO MicroservicesRunner:163 - Microservices server started in 307ms |
Now we can check MSF4J service running or not using CuRL as follows.
curl -v http://127.0.0.1:8080/students * Trying 127.0.0.1... * Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0) > GET /students HTTP/1.1 > Host: 127.0.0.1:8080 > User-Agent: curl/7.43.0 > Accept: */* > < HTTP/1.1 200 OK < Connection: keep-alive < Content-Length: 41 < Content-Type: application/json < * Connection #0 to host 127.0.0.1 left intact {"code":4,"type":"ok","message":"magic!"} |
Please use following sample swagger definition to generate connector(this is available in zip file attached).
swagger: '2.0' info: version: '1.0.0' title: Swagger School (Simple) description: A sample API that uses a school as an example to demonstrate features in the swagger-2.0 specification termsOfService: http://helloreverb.com/terms/ contact: name: Swagger API team email: foo@example.com url: http://swagger.io license: name: MIT url: http://opensource.org/licenses/MIT host: schol.swagger.io basePath: /api schemes: - http consumes: - application/json produces: - application/json paths: /students: get: description: Returns all students from the system that the user has access to operationId: findstudents produces: - application/json - application/xml - text/xml - text/html parameters: - name: limit in: query description: maximum number of results to return required: false type: integer format: int32 responses: '200': description: student response schema: type: array items: $ref: '#/definitions/student' default: description: unexpected error schema: $ref: '#/definitions/errorModel' post: description: Creates a new student in the school. Duplicates are allowed operationId: addstudent produces: - application/json parameters: - name: student in: body description: student to add to the school required: true schema: $ref: '#/definitions/newstudent' responses: '200': description: student response schema: $ref: '#/definitions/student' default: description: unexpected error schema: $ref: '#/definitions/errorModel' /students/{id}}: get: description: Returns a user based on a single ID, if the user does not have access to the student operationId: findstudentById produces: - application/json - application/xml - text/xml - text/html parameters: - name: id in: path description: ID of student to fetch required: true type: integer format: int64 - name: ids in: query description: ID of student to fetch required: false type: integer format: int64 responses: '200': description: student response schema: $ref: '#/definitions/student' default: description: unexpected error schema: $ref: '#/definitions/errorModel' delete: description: deletes a single student based on the ID supplied operationId: deletestudent parameters: - name: id in: path description: ID of student to delete required: true type: integer format: int64 responses: '204': description: student deleted default: description: unexpected error schema: $ref: '#/definitions/errorModel' definitions: student: type: object required: - id - name properties: id: type: integer format: int64 name: type: string tag: type: string newstudent: type: object required: - name properties: id: type: integer format: int64 name: type: string tag: type: string errorModel: type: object required: - code - textMessage properties: code: type: integer format: int32 textMessage: type: string |
./ballerina swagger connector /home/sanjeewa/Desktop/sample.
import ballerina.net.http;
@http:BasePath("/testService")
service echo {
@http:POST
resource echo(message m) {
Default defaultConnector = create Default();
message response1 = Default.employeeIDGet( defaultConnector, m);
reply response1;
}
}
connector Default() {
http:ClientConnector endpoint = create http:ClientConnector("http://127.0.0.1:8080/students");
action employeeIDDelete(Default c, message msg)(message ) {
message response;
response = http:ClientConnector.delete(endpoint, http:getRequestURL(msg), msg);
return response;
}
action employeeIDGet(Default c, message msg)(message ) {
message response;
response = http:ClientConnector.get(endpoint, http:getRequestURL(msg), msg);
return response;
}
action employeeIDPut(Default c, message msg)(message ) {
message response;
response = http:ClientConnector.put(endpoint, http:getRequestURL(msg), msg);
return response;
}
action rootGet(Default c, message msg)(message ) {
message response;
response = http:ClientConnector.get(endpoint, http:getRequestURL(msg), msg);
return response;
}
action rootPost(Default c, message msg)(message ) {
message response;
response = http:ClientConnector.post(endpoint, http:getRequestURL(msg), msg);
return response;
}
}
Then you will see relevant files in output directory.
├── test
└── org
└── wso2
├── default.bal
├── LICENSE
├── README.md
└── types.jsonThen you can copy generated connector code into composer and start your service development. How its appear in composer source view.
How its loaded in composer UI.
Then run it.
./ballerina run service ./testbal.bal
Now invoke ballerina service as follows.
curl -v -X POST http://127.0.0.1:9090/ testService
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 9090 (#0)
> POST /testService HTTP/1.1
> Host: 127.0.0.1:9090
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< Content-Length: 49
< Content-Type: application/json
<
* Connection #0 to host 127.0.0.1 left intact
{"code":4,"type":"ok"," message":"test-ballerina"}
curl -v -X POST http://127.0.0.1:9090/
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 9090 (#0)
> POST /testService HTTP/1.1
> Host: 127.0.0.1:9090
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< Content-Length: 49
< Content-Type: application/json
<
* Connection #0 to host 127.0.0.1 left intact
{"code":4,"type":"ok","