Saturday, October 12, 2019

Postman API – Tips and Tricks

I have seen many people using POSTMAN tools but very few of them know how to exactly use all the features of POSTMAN application. So, in this article, I am going to share a few tips/tricks which can be really helpful in our API testing.

  • Set Environment Variables


Let’s assume we have an endpoint to get some data after authenticating yourself bypassing username/password.

Now, you have to test this endpoint which is deployed on multiple environments like a local machine, test environment and on SIT environment as well. Also, the credential is different for each environment.

So, how are we going to test it?

Most of the time, I have seen that people create one-one requests for each environment or create one request and then modify the existing username/password and hostname to point to a different environment.

The Simple Solution is to set changing parameters as an Environment variable and switch environment to test for different regions.

E.g. http://<HOSTNAME:POST>/token and <username>/<password> as basic Authentication 


How to set environment variables?

  • Click "Manage Environments" icon in the upper right corner of the Postman app.
  • Click the Add button.
  • Click "Environment" and enter a name for the new environment.
  • Add the variables you want to save as key-value pairs.
  • Click the Add button.





Selecting an active environment

  • Click the dropdown menu in the upper right corner of the Postman app to select an active environment, or type in the environment name.
  • Once you select an environment, you can access variables in the active environment scope.

All the parameters get changed as we switch from one environment to another one.

  • Set Global variable


Global variables provide a set of variables that are available in all scopes. You can have multiple environments, but only one environment can be active at a time with one set of global variables.

To manage global variables, click the gear icon in the upper right corner of the Postman app and select "Manage Environments".

Click the Globals button at the bottom of the modal to bring up a key-value editor to add, edit, and delete global variables.




 

  • Set Response to the global variable


There are so many scenarios where we wanted to add one of the API responses as a request parameter to the second request like getting token from one API and then passing this token to another endpoint to access the resources.

Assuming, I am hitting API to get access token and then setting access-token as a global variable. 




  • Once you get the access_token in your response then go to Tests tab.
  • Click on ‘set a global variable’ or add scripts as shown below
    • let response = pm.response.json();
    • pm.globals.set("access_token", response.access_token);
  • To access this variable in some other request, just pass the access_token parameter as {{access_token}} as we have done something similar for dev_hostname.
E.g. 


  • How to pass the path variable dynamically

I guess this is one of the major mistakes I have seen people doing it i.e. passing hardcoded path variable in the URL request

The below diagram will show you the correct way of passing it. Using this, you can update params value very easily.

http://hostname/users/:userId

To edit the path variable, click on Params to see it already entered as the key. Update the value as needed.



  • Save custom headers

You can save commonly used headers together in a header preset. Under the Headers tab, you can add a header preset to your request when you select "Manage Presets" from the Presets dropdown on the right. 





  • Check all request/response send to API

Goto View-> Show Postman Console



Sunday, September 8, 2019

Spring Boot Tutorial

Prerequisite: Basic knowledge of Spring boot application

I am working on a series of implementing frameworks with Spring boot application but not getting enough time to blog it and post it here or on my LinkedIn profile.

So, I have started uploading my work on my GitHub repository from where it can be downloaded easily. I tried my best to add short notes for each annotation/configuration/properties in README and even I have uploaded a few screenshots to understand in a more better way.

Try it out and Please do let me know in case of any confusion.
  1. Spring Boot Actuator
  2. Spring Boot Ehcache
  3. Spring Boot Swagger
  4. Spring Boot JPA

Will keep uploading with others framework as well.

Feedback is also most welcome.

Thank you.
Happy Learning!

Thursday, August 29, 2019

MicroServices: Spring cloud ribbon with Discovery Server

In this article, I am going to share my knowledge on Spring Cloud Ribbon and how can we use Ribbon with RestTemplate as well as with Feign Client. We will also see how Enabling discovery Sever will improve the scalability of Microservice.

Before jumping into Spring Cloud, I am assuming you must be having knowledge of Eureka Server, Feign Client, and Client-Side load balancer. If not then read my below blog before jumping to Spring Cloud ribbon. Also, I am going to use my existing code to implement Ribbon.

URLs:
In my previous blog, I have already talked about the Eureka Server and how other applications are taking advantages of Eureka Server to fetch the host/port of client application.

We have seen that three microservices application are up and running i.e.
  • Discovery Server
  • Product Service
  • Price Service
Where Product and Price service will register themselves to Discovery Server and Product-service will always communicate to Discovery Server to get the exact location of Price-service and then only it will talk to the price-service application.

Imagine there is a high load on the price-service application and to handle it, we have started two more instances of price-service.

  • How will you make sure your product-service should talk to all three instances of price-service and divides the load equally to each server?
  • How will you manage the heartbeat of the application so that product-service should not hit INACTIVE instance of price-service which just got shut down because of some internal reason?
  • How will you get to know how many instances are up and running of price-service?
For all the question, there is only answer which is Netflix Cloud Ribbon. It's a Spring cloud library which primarily provides client-side load balancing algorithms.

let's implement it and see how it can solve our problem.

Add below dependency to product-server pom.xml file as it is the one which is going to consume price-service API.

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>


Case 1: Ribbon + Eureka Server + RestTemplate

As our application is already acting as Eureka Client and using RestTemplate to fetch price record. Let's just add @LoadBalanced annotation to RestTemplate to enables Ribbon functionality.

It will allow the product-service application to use price-service as the address of price-service application and will discover the host/port of all instances of price-service from discovery-server.



Note:

@EnableCircuitBreaker <-> Used to enable Netflix Hystrix
@EnableHystrixDashboard <-> Used to check circuit state on Dashboard.
@EnableFeignClients <-> To enable feign client (Needed for case 2 scenario)

Start discovery-server, product-service and start two instances of price-service. You can do it easily by just overriding port number under Eclipse Run As Configuration.



Let's confirm it, whether all the instances are up and running or not by hitting discovery-server URL (http://localhost:8761/)



Now hit product-service URL multiple times from the browser and then go and check both the price-service logs. you will observe that few requests are coming to one instance and others on second one.



Great! Netflix Cloud Ribbon is successfully implemented and working absolutely fine.

If you start another price-service instance and hit the product-service URL again then you will find the request logs in the third instance too without doing any modification/configuration to any files.


Case 2: Ribbon + Eureka Server + Feign Client

If you are not aware of the feign client then you can read my blog here.

I'll just talk about Ribbon Integration with existing FeignClient application assuming you are already aware of Feign Client and implemented it.

In product-service application, I have already exposed another Endpoint (http://localhost:7001/products/feign/1) which consume price-service API using Feign Client.

To enable Netflix Ribbon, Add @RibbonClient annotation to the feighClient interface and pass your consuming service name (price-service).



Now restart your application and hit new endpoint. you will observe that the requests are distributed to all the instances of price-service.

Case 3: Ribbon + (RestTemaple/FeignClient) + NO Eureka Server


Can we use Netflix ribbon without integrating Eureka Server, The answer is YES but it would not be a good design. So, I would not recommend it.

When your application is not integrated with Eureka Server, in that case you have to list down all the address manually to properties file.

Remove @RibbonClients annotation.
Add below entry to your application.properties file under 
product-service.

#Enable this property if you are not using Eureka Server
price-service.ribbon.listOfServers=http://localhost:8002,http://localhost:7002

Imagine there are 1000 instances of price-services are up and running so we have to add all the instances manually. It could be a nightmare if we have to do it. :)

That's all for Netflix Ribbon now and do let me know if you have any confusion/query or you think I am not right somewhere. Please feel free to comment. Thank you!

As usual, you can download the spring-boot-microservices from GITHUB.