├── .gitignore ├── src ├── index.js ├── config │ └── index.js ├── lib │ ├── file-scraper.js │ ├── fs.js │ ├── logger.js │ └── parsers.js ├── main │ └── index.js ├── dostman │ └── index.js └── request │ └── index.js ├── .prettierrc ├── nodemon.json ├── jest.config.js ├── tests ├── index.test.js ├── dostman.test.js ├── request.test.js └── parsers.test.js ├── sample-requests ├── posts_error.dostman ├── posts.dostman ├── posts_error.dostman.json └── posts.dostman.json ├── .github └── workflows │ └── main.yml ├── LICENSE ├── package.json ├── docs ├── ProjectPlan.md └── SampleUsage.md └── Readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | module.exports = require('./main')(); 4 | -------------------------------------------------------------------------------- /src/config/index.js: -------------------------------------------------------------------------------- 1 | const fileExtension = 'dostman'; 2 | 3 | module.exports = { fileExtension }; 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 4, 4 | "semi": true, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "verbose": false, 3 | "ignore": ["*.test.js", "config.js", "*.json", "fixtures/*"], 4 | "execMap": { 5 | "rb": "ruby", 6 | "pde": "processing --sketch={{pwd}} --run" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | testEnvironment: 'node', 3 | testTimeout: 10000, 4 | verbose: true, 5 | collectCoverage: true, 6 | collectCoverageFrom: ['src/**/*.{js, jsx}'], 7 | coverageReporters: ['text'], 8 | coveragePathIgnorePatterns: ['/node_modules/', '/config/', 'src/index.js'], 9 | }; 10 | -------------------------------------------------------------------------------- /tests/index.test.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const main = require('../src/main'); 3 | 4 | /** 5 | * @end_to_end_test Execute main function and make sure getting output files for each input file. 6 | */ 7 | 8 | test('E2E test: Read files, execute and write output.', async () => { 9 | await main(false); 10 | const cwd = process.cwd(); 11 | const files = fs.readdirSync(`${cwd}/sample-requests`); 12 | let outputFiles = 0; 13 | for (const file of files) { 14 | if (file.endsWith('.json')) { 15 | outputFiles++; 16 | } 17 | } 18 | expect(outputFiles).toBe(files.length / 2); 19 | }); 20 | -------------------------------------------------------------------------------- /src/lib/file-scraper.js: -------------------------------------------------------------------------------- 1 | const glob = require('glob'); 2 | const { fileExtension } = require('../config'); 3 | const { logger } = require('./logger'); 4 | /** 5 | * Scrapes all .dostman files 6 | * @returns file paths as array. 7 | */ 8 | const scrapeDostmanFiles = async () => { 9 | const paths = glob.sync(`**/*.${fileExtension}`); 10 | if (!paths || paths.length < 1) { 11 | logger.info('No .dostman files were found.'); 12 | return []; 13 | } 14 | logger.suc('Found files'); 15 | for (let p of paths) { 16 | logger.colored(`- ${p}`, 'yellow'); 17 | } 18 | return paths; 19 | }; 20 | 21 | module.exports = { scrapeDostmanFiles }; 22 | -------------------------------------------------------------------------------- /src/main/index.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const cwd = process.cwd(); 3 | const { scrapeDostmanFiles } = require('../lib/file-scraper'); 4 | const Dostman = require('../dostman'); 5 | const { logger } = require('../lib/logger'); 6 | 7 | async function main(verbose = true) { 8 | const paths = await scrapeDostmanFiles(); 9 | for (let p of paths) { 10 | try { 11 | const filePath = path.join(cwd, p); 12 | const dostman = new Dostman(filePath, verbose); 13 | await dostman.executeRequests(); 14 | dostman.writeOutput(); 15 | } catch (err) { 16 | logger.error(`Unable to process file ${p}`); 17 | } 18 | } 19 | } 20 | 21 | module.exports = main; 22 | -------------------------------------------------------------------------------- /sample-requests/posts_error.dostman: -------------------------------------------------------------------------------- 1 | @config 2 | const SERVER_URL = `https://jsonplaceholder.typicode.com`; 3 | const anotherVar = 123; 4 | const lala = () => 555; 5 | 6 | exports = {SERVER_URL, anotherVar, lala}; 7 | 8 | ### 9 | 10 | @desc This will get user's info 11 | 12 | @method GET 13 | @url {{SERVER_URL}}/posts 14 | 15 | @headers 16 | content-type: application/json 17 | 18 | @body 19 | { 20 | "public": true, 21 | "lala": {{lala}}, 22 | "another": {{anotherVar}} 23 | } 24 | 25 | ### 26 | 27 | @desc Get posts by id. 28 | 29 | @url {{SERVER_URL}}/posts/1 30 | 31 | @headers 32 | content-type: application/json 33 | 34 | ### 35 | 36 | @desc Create a new post. 37 | 38 | @method POST 39 | 40 | @url {{SERVER_URL}}/posts 41 | 42 | @headers 43 | content-type: application/json 44 | 45 | @body 46 | { 47 | "title": "foo", 48 | "body": "bar", 49 | "userId": 1 50 | } -------------------------------------------------------------------------------- /sample-requests/posts.dostman: -------------------------------------------------------------------------------- 1 | @config 2 | const SERVER_URL = `https://jsonplaceholder.typicode.com`; 3 | const anotherVar = 123; 4 | const lala = () => 555; 5 | 6 | exports = {SERVER_URL, anotherVar, lala}; 7 | 8 | ### 9 | 10 | @desc This will get user's info 11 | 12 | @method GET 13 | @url {{SERVER_URL}}/posts 14 | 15 | @headers 16 | content-type: application/json 17 | 18 | @body 19 | { 20 | "public": true, 21 | "lala": {{lala}}, 22 | "another": {{anotherVar}} 23 | } 24 | 25 | ### 26 | 27 | @desc Get posts by id. 28 | 29 | @method GET 30 | 31 | @url {{SERVER_URL}}/posts/1 32 | 33 | @headers 34 | content-type: application/json 35 | 36 | ### 37 | 38 | @desc Create a new post. 39 | 40 | @method POST 41 | 42 | @url {{SERVER_URL}}/posts 43 | 44 | @headers 45 | content-type: application/json 46 | 47 | @body 48 | { 49 | "title": "foo", 50 | "body": "bar", 51 | "userId": 1 52 | } -------------------------------------------------------------------------------- /src/lib/fs.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const { execSync } = require('child_process'); 3 | const { logger } = require('./logger'); 4 | 5 | const readFile = (filePath) => { 6 | try { 7 | return fs.readFileSync(filePath, 'utf-8'); 8 | } catch (err) { 9 | logger.error(`${err}`); 10 | return false; 11 | } 12 | }; 13 | 14 | const writeFile = (filePath, content, prettify = true) => { 15 | if (typeof content != +'string') { 16 | content = JSON.stringify(content); 17 | } 18 | try { 19 | fs.writeFileSync(filePath, content, 'utf8', { flag: 'wx' }); 20 | if (prettify) { 21 | execSync(`npx prettier --write ${filePath}`); 22 | } 23 | logger.log(`✏️ Writing file output to ${filePath}`); 24 | return true; 25 | } catch (err) { 26 | logger.error(`Unable to write file to ${filePath}. ${err}`); 27 | return false; 28 | } 29 | }; 30 | 31 | module.exports = { 32 | readFile, 33 | writeFile, 34 | }; 35 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: build 4 | 5 | # Controls when the workflow will run 6 | on: 7 | # Triggers the workflow on push or pull request events but only for the main branch 8 | push: 9 | branches: [main] 10 | pull_request: 11 | branches: [main] 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 17 | jobs: 18 | publish: 19 | runs-on: ubuntu-latest 20 | steps: 21 | - uses: actions/checkout@v1 22 | - uses: actions/setup-node@v1 23 | with: 24 | node-version: 14 25 | - run: npm install 26 | - run: npm run remove-output-files 27 | - run: npm test 28 | - uses: JS-DevTools/npm-publish@v1 29 | with: 30 | token: ${{ secrets.NPM_TOKEN }} 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Ege Çavuşoğlu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dostman", 3 | "version": "1.0.3", 4 | "description": "Maintain your API development, documentation and experimentation all within your codebase.", 5 | "main": "src/main/index.js", 6 | "bin": { 7 | "dostman": "src/index.js" 8 | }, 9 | "files": [ 10 | "src/*" 11 | ], 12 | "scripts": { 13 | "dev": "nodemon src/index.js", 14 | "start": "node src/index.js", 15 | "test": "jest", 16 | "prettify": "npx prettier --write .", 17 | "prettify-output": "npx prettier --write ./output.json", 18 | "remove-output-files": "rm ./sample-requests/*.json || true" 19 | }, 20 | "keywords": [ 21 | "Postman", 22 | "REST", 23 | "API", 24 | "Client" 25 | ], 26 | "author": "Ege Cavusoglu egecavusoglu99@gmail.com https://egecavusoglu.com", 27 | "license": "MIT", 28 | "devDependencies": { 29 | "jest": "^27.0.6", 30 | "nodemon": "^2.0.7", 31 | "prettier": "^2.3.1" 32 | }, 33 | "dependencies": { 34 | "axios": "^0.21.1", 35 | "chalk": "^4.1.1", 36 | "glob": "^7.1.7" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/lib/logger.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Global logger for the cli. 3 | */ 4 | 5 | const chalk = require('chalk'); 6 | class Logger { 7 | verbose; 8 | constructor(verbose = true) { 9 | this.verbose = verbose; 10 | } 11 | 12 | consoleLog(m) { 13 | if (this.verbose) console.log(m); 14 | } 15 | 16 | log(m) { 17 | this.consoleLog(m); 18 | } 19 | 20 | info(m) { 21 | this.consoleLog(`ℹ️ ${m}`); 22 | } 23 | 24 | suc(m) { 25 | this.consoleLog(`✅ ${m}`); 26 | } 27 | 28 | warn(m) { 29 | this.consoleLog(`⚠️ ${m}`); 30 | } 31 | 32 | error(m) { 33 | this.consoleLog(`❌ ${m}`); 34 | } 35 | 36 | newLine() { 37 | this.consoleLog(''); 38 | } 39 | 40 | value(m) { 41 | this.consoleLog(chalk.cyan(m)); 42 | } 43 | 44 | colored(m, color = 'cyan') { 45 | const clr = chalk[color]; 46 | this.consoleLog(clr(m)); 47 | } 48 | 49 | json(j, colored = false) { 50 | let str = JSON.stringify(j, null, 2); 51 | if (colored) str = chalk.cyan(str); 52 | this.consoleLog(str); 53 | } 54 | } 55 | 56 | const logger = new Logger(true); // For const exports, a verbose logger you can use without constructing. 57 | 58 | const myModule = (module.exports = Logger); 59 | myModule.logger = logger; 60 | -------------------------------------------------------------------------------- /docs/ProjectPlan.md: -------------------------------------------------------------------------------- 1 | # Project Plan 2 | 3 | ## Steps 4 | 5 | 1. Parse chunks of .dostman files. 6 | 7 | Used decorators (@) and Regex to parse the individual requests. 8 | 9 | - [x] Parsing with decorators. 10 | - [x] Parse multiple requests seperated by `###`. 11 | - [x] Inject env variables, variables as functions (for refresh cases..). 12 | 13 | 2. Make requests, store response. Format and output. 14 | 15 | - [x] Output as JSON. 16 | - [ ] Output in both human readable or .dostman like (Maybe later) 17 | 18 | ```js 19 | //JSON format might be an array of requests like this 20 | { 21 | method: "GET", 22 | url: "https://api.github.com/users/egecavusoglu", 23 | headers: ["content-type: application/json", "Authorization: Bearer"], 24 | body: { 25 | public: true, 26 | }, 27 | response: { 28 | status: 200, 29 | data: true, 30 | }, 31 | error: undefined 32 | } 33 | ``` 34 | 35 | 3. Create a CLI that reads all dostman files (like Jest), processes them and outputs. 36 | 37 | - [x] Read all files, execute, save outputs. 38 | - [x] Make sure verbose logging mode. 39 | - [ ] Add verbose option as flag. 40 | 41 | 4. Write Tests 42 | 43 | - [x] Test for different inputs, fault tolerance. 44 | 45 | 4. Release to npm! 46 | 47 | ## Project Todos 48 | 49 | - [x] Proper Docs 50 | - [x] Prettier 51 | - [x] Tests 52 | - [x] CI/CD. 53 | - [ ] Timing for requests, perf analysis? 54 | 55 | ## Bugs 56 | 57 | - [x] More error tolerant parsing mechanism. 58 | - [x] More error tolerant headers parsing. 59 | - [x] No body on GET's. 60 | -------------------------------------------------------------------------------- /src/lib/parsers.js: -------------------------------------------------------------------------------- 1 | const { logger } = require('./logger'); 2 | 3 | /** 4 | * 5 | * @param {string} chunk: string 6 | * @returns {string} with all newlines, tabs and multiple spaces replaced by 1 whitespace. 7 | */ 8 | const removeSpaces = (chunk) => { 9 | chunk = chunk.replace(/(\r\n|\n|\r)/gm, ' '); // Remove all line breaks 10 | chunk = chunk.replace(/\s\s+/g, ' '); // Trim all whitespace to 1 space. 11 | return chunk; 12 | }; 13 | 14 | /** 15 | * 16 | * @param {string} decorator expression that starts with @ eg. to extract @method => parseDecorator('method', chunk) 17 | * @param {string} chunk 18 | * @returns {string} the value of the decorator expression. 19 | */ 20 | const parseDecorator = (decorator, chunk) => { 21 | const regex = new RegExp(`(@${decorator})(.*?)(?=(@|$))`); 22 | const match = chunk.match(regex); 23 | if (!match || match.length < 1) { 24 | logger.warn(`Unable to parse decorator '${decorator}'`); 25 | return null; 26 | } 27 | const extracted = match[0].replace(`@${decorator} `, '').trim(); 28 | return extracted; 29 | }; 30 | 31 | /** 32 | * Returns variable expressions so that values can be injected. 33 | * @param {*} chunk string that will be searched 34 | * @returns array of variable expressions eg. [ {{my-variable}} , {{other-variable}}] 35 | */ 36 | const extractVariables = (chunk) => { 37 | const matches = chunk.match(/\{\{(.*?)\}\}/g); 38 | if (!matches) return []; 39 | return matches; 40 | }; 41 | 42 | module.exports = { 43 | parseDecorator, 44 | extractVariables, 45 | removeSpaces, 46 | }; 47 | -------------------------------------------------------------------------------- /tests/dostman.test.js: -------------------------------------------------------------------------------- 1 | const Dostman = require('../src/dostman/index.js'); 2 | 3 | /** 4 | * @unit_test Construct dostman: multiple valid requests. 5 | */ 6 | test('Construct dostman: multiple valid requests.', () => { 7 | const filePath = './sample-requests/posts.dostman'; 8 | const dost = new Dostman(filePath, false); 9 | expect(dost.requests.length).toBe(3); 10 | }); 11 | 12 | /** 13 | * @unit_test Construct dostman: multiple valid requests, some faulty requests. 14 | */ 15 | test('Construct dostman: multiple valid requests, some faulty requests.', () => { 16 | const filePath = './sample-requests/posts_error.dostman'; 17 | const dost = new Dostman(filePath, false); 18 | expect(dost.requests.length).toBe(2); 19 | }); 20 | 21 | /** 22 | * @unit_test Execute requests: multiple valid requests. 23 | */ 24 | test('Construct dostman: multiple valid requests.', async () => { 25 | const filePath = './sample-requests/posts.dostman'; 26 | const dost = new Dostman(filePath, false); 27 | await dost.executeRequests(); 28 | for (let req of dost.requests) { 29 | expect(req.response.status).toBeGreaterThan(199); 30 | expect(req.response.status).toBeLessThan(300); 31 | } 32 | }); 33 | 34 | /** 35 | * @unit_test Execute requests: multiple valid requests, some faulty requests. 36 | */ 37 | test('Execute requests: multiple valid requests, some faulty requests.', async () => { 38 | const filePath = './sample-requests/posts_error.dostman'; 39 | const dost = new Dostman(filePath, false); 40 | await dost.executeRequests(); 41 | let success = 0; 42 | for (let req of dost.requests) { 43 | if (req.response.status >= 200 && req.response.status < 300) { 44 | success++; 45 | } 46 | } 47 | expect(success).toBe(2); 48 | }); 49 | -------------------------------------------------------------------------------- /tests/request.test.js: -------------------------------------------------------------------------------- 1 | const Request = require('../src/request'); 2 | const validChunk = 3 | '@desc Create a new post. @method POST @url https://jsonplaceholder.typicode.com/posts @headers content-type: application/json @body { "title": "foo", "body": "bar", "userId": 1 }'; 4 | 5 | const chunkMissingHeaders = 6 | '@desc Create a new post. @method POST @url https://jsonplaceholder.typicode.com/posts @body { "title": "foo", "body": "bar", "userId": 1 }'; 7 | 8 | const chunkValidEndpoint = 9 | '@desc Get posts by id. @method GET @url https://jsonplaceholder.typicode.com/posts/1 @headers content-type: application/json'; 10 | 11 | const chunkInvalidEndpoint = 12 | '@desc Get posts by id. @method GET @url https://nonexistentapiendpoint.typicode.com/posts/1 @headers content-type: application/json'; 13 | 14 | /** 15 | * @unit_test Construct Request: correct chunk 16 | */ 17 | test('Construct Request: correct chunk', () => { 18 | const request = new Request(validChunk, false); 19 | expect(request.method).toBe('POST'); 20 | expect(request.url).toBe('https://jsonplaceholder.typicode.com/posts'); 21 | expect(request.headers).toEqual({ 22 | 'content-type': 'application/json', 23 | }); 24 | expect(request.body).toEqual({ 25 | title: 'foo', 26 | body: 'bar', 27 | userId: 1, 28 | }); 29 | }); 30 | 31 | /** 32 | * @unit_test Construct Request: chunk missing either @url, @desc, @header, @body 33 | */ 34 | test('Construct Request: chunk missing either @url, @desc, @header, @body', () => { 35 | const request = new Request(chunkMissingHeaders, false); 36 | expect(request.method).toBe('POST'); 37 | expect(request.url).toBe('https://jsonplaceholder.typicode.com/posts'); 38 | expect(request.headers).toEqual({}); 39 | expect(request.body).toEqual({ 40 | title: 'foo', 41 | body: 'bar', 42 | userId: 1, 43 | }); 44 | }); 45 | 46 | /** 47 | * @unit_test Execute Request: correct endpoint 48 | */ 49 | test('Execute Request: correct endpoint', async () => { 50 | const request = new Request(chunkValidEndpoint, false); 51 | const respone = await request.execute(); 52 | expect(respone.status).toBe(200); 53 | }); 54 | 55 | /** 56 | * @unit_test Execute Request: non existent endpoint 57 | */ 58 | test('Execute Request: none existent endpoint', async () => { 59 | const request = new Request(chunkInvalidEndpoint, false); 60 | const respone = await request.execute(); 61 | expect(respone).toBeFalsy(); 62 | }); 63 | 64 | module.exports = { 65 | validChunk, 66 | chunkMissingHeaders, 67 | chunkValidEndpoint, 68 | chunkInvalidEndpoint, 69 | }; 70 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 | npm version 6 | [![Publish to NPM](https://github.com/egecavusoglu/dostman/actions/workflows/main.yml/badge.svg)](https://github.com/egecavusoglu/dostman/actions/workflows/main.yml) 7 | weekly downloads from npm 8 | 9 | ## dostman 10 | 11 | Maintain your API development, documentation and experimentation all within your codebase. 12 | 13 | - This project is a new release! Feel free to contact me @egecavusoglu to collaborate or see [Project Plan](./docs/ProjectPlan.md) for to do items. Pull requests welcome! 14 | 15 | ### Why dostman instead of Postman? 16 | 17 | - Remove the need of an external app. 18 | - Don't deal with Postman's business logic or plan restrictions. 19 | - Get formatted output of your API requests in JSON, use & distribute it anywhere you like. 20 | - Track your API documentation with your project's version management. No more outdated API docs! 21 | ## Installation 22 | You can install dostman as a dev dependency to your project like this. 23 | ``` 24 | npm i -D dostman 25 | ``` 26 | 27 | Or globally like this 28 | ``` 29 | npm i -g dostman 30 | ``` 31 | 32 | ## How to use 33 | 34 | 1. Create files with .dostman extension file in following format. Find a more detailed how to use guide at [sample usage](./docs/SampleUsage.md). 35 | 36 | - @desc: Description of your endpoint 37 | - @method: HTTP method of the request (GET | POST | PUT | DELETE) 38 | - @headers: Specify headers, seperated by commas `,` . 39 | - @body: Specify request body as JSON. 40 | 41 | To see example .dostman files visit [sample-requests](./sample-requests). 42 | 43 | 2. Run dostman at the root of your directory. 44 | - If installed globally 45 | ```bash 46 | dostman 47 | ``` 48 | - If installed as a dev dependency: 49 | Add a script to your package.json 50 | ```json 51 | "scripts": { 52 | "dostman": "dostman" 53 | }, 54 | ``` 55 | 56 | Dostman will find all files under the directory ending with `.dostman` extension, execute your requests and give you API docs. 57 | 58 | ### Configure your dostman file with `@config` 59 | 60 | Are you also tired of refreshing tokens for requests whenever you open your project after a while? Or want randomized variables? You can save your variables as functions to automate the process. 61 | 62 | Dostman will evaluate your config as JavaScript and replace your variables with your exported values. 63 | 64 | ``` 65 | @config 66 | const SERVER_URL = `https://jsonplaceholder.typicode.com/todos/1`; 67 | const variable_as_func = () => 555; 68 | 69 | exports = {SERVER_URL, variable_as_func}; 70 | 71 | ### 72 | ``` 73 | -------------------------------------------------------------------------------- /docs/SampleUsage.md: -------------------------------------------------------------------------------- 1 | ## Sample Usage 2 | 3 | Let's assume your input file is sample.dostman 4 | 5 | `sample.dostman` 6 | 7 | ``` 8 | @desc This will get user's info 9 | 10 | @method POST 11 | @url https://api.github.com/users/egecavusoglu 12 | 13 | @headers 14 | content-type: application/json 15 | 16 | @body 17 | { 18 | "public": true 19 | } 20 | ``` 21 | 22 | You will get output 23 | 24 | `sample.dostman.json` 25 | 26 | ```json 27 | { 28 | "requests": [ 29 | { 30 | "method": "GET", 31 | "url": "https://api.github.com/users/egecavusoglu", 32 | "headers": { "content-type": "application/json" }, 33 | "body": { "public": true }, 34 | "response": { 35 | "status": 200, 36 | "data": { 37 | "login": "egecavusoglu", 38 | "id": 42681882, 39 | "node_id": "MDQ6VXNlcjQyNjgxODgy", 40 | "avatar_url": "https://avatars.githubusercontent.com/u/42681882?v=4", 41 | "gravatar_id": "", 42 | "url": "https://api.github.com/users/egecavusoglu", 43 | "html_url": "https://github.com/egecavusoglu", 44 | "followers_url": "https://api.github.com/users/egecavusoglu/followers", 45 | "following_url": "https://api.github.com/users/egecavusoglu/following{/other_user}", 46 | "gists_url": "https://api.github.com/users/egecavusoglu/gists{/gist_id}", 47 | "starred_url": "https://api.github.com/users/egecavusoglu/starred{/owner}{/repo}", 48 | "subscriptions_url": "https://api.github.com/users/egecavusoglu/subscriptions", 49 | "organizations_url": "https://api.github.com/users/egecavusoglu/orgs", 50 | "repos_url": "https://api.github.com/users/egecavusoglu/repos", 51 | "events_url": "https://api.github.com/users/egecavusoglu/events{/privacy}", 52 | "received_events_url": "https://api.github.com/users/egecavusoglu/received_events", 53 | "type": "User", 54 | "site_admin": false, 55 | "name": "Ege Çavuşoğlu", 56 | "company": "Washington University in St Louis", 57 | "blog": "egecavusoglu.tech", 58 | "location": "Seattle, WA", 59 | "email": null, 60 | "hireable": null, 61 | "bio": "Senior computer science student. JS, TS and some Swift. Co founder @chember.co.\r\nInterning at @microsoft.\r\n", 62 | "twitter_username": "egecavusoglu_", 63 | "public_repos": 21, 64 | "public_gists": 9, 65 | "followers": 13, 66 | "following": 24, 67 | "created_at": "2018-08-24T19:03:29Z", 68 | "updated_at": "2021-06-22T00:43:53Z" 69 | } 70 | } 71 | } 72 | ] 73 | } 74 | ``` 75 | -------------------------------------------------------------------------------- /tests/parsers.test.js: -------------------------------------------------------------------------------- 1 | const { 2 | parseDecorator, 3 | removeSpaces, 4 | extractVariables, 5 | } = require('../src/lib/parsers'); 6 | 7 | /** 8 | * @unit_test Remove extra spaces 9 | */ 10 | test('Remove spaces', () => { 11 | const text = 'value value'; 12 | const parsed = removeSpaces(text); 13 | expect(parsed).toEqual('value value'); 14 | }); 15 | /** 16 | * @unit_test Remove extra spaces, newlines, tabs 17 | */ 18 | test('Remove extra spaces, newlines, tabs', () => { 19 | const text = '\n\t\n value \t \nvalue'; 20 | const parsed = removeSpaces(text); 21 | expect(parsed).toEqual(' value value'); 22 | }); 23 | 24 | /** 25 | * @unit_test Parse decorator 26 | */ 27 | test('Parse decorator', () => { 28 | const text = '@decorator value'; 29 | const parsed = parseDecorator('decorator', text); 30 | expect(parsed).toEqual('value'); 31 | }); 32 | 33 | /** 34 | * @integration_test Parse decorator: absurd spaces and tabs. 35 | */ 36 | test('Parse decorator with absurd whitespaces', () => { 37 | const text = ' \t@decorator \t value \t '; 38 | const removedSpaces = removeSpaces(text); 39 | const parsed = parseDecorator('decorator', removedSpaces); 40 | expect(parsed).toEqual('value'); 41 | }); 42 | 43 | /** 44 | * @integration_test Parse decorator: absurd new lines. 45 | */ 46 | test('Parse decorator with absurd newlines', () => { 47 | const text = '\n @decorator \t \n value\n \t '; 48 | const removedSpaces = removeSpaces(text); 49 | const parsed = parseDecorator('decorator', removedSpaces); 50 | expect(parsed).toEqual('value'); 51 | }); 52 | 53 | /** 54 | * @unit_test Parse decorator: no decorator present. 55 | */ 56 | 57 | test('Parse decorator with no decorator', () => { 58 | const text = '\n @ decorator \t \n value\n \t '; 59 | const removedSpaces = removeSpaces(text); 60 | const parsed = parseDecorator('decorator', removedSpaces); 61 | expect(parsed).toBeNull(); 62 | }); 63 | 64 | /** 65 | * @unit_test Extract single variable 66 | */ 67 | test('Extract multiple variables', () => { 68 | const text = '\n {{var-one}} {another}'; 69 | 70 | const vars = extractVariables(text); 71 | expect(vars.length).toEqual(1); 72 | expect(vars).toContain('{{var-one}}'); 73 | }); 74 | 75 | /** 76 | * @unit_test Extract multiple variables 77 | */ 78 | test('Extract multiple variables', () => { 79 | const text = '\n {{var-one}} {{var-two}} '; 80 | const vars = extractVariables(text); 81 | expect(vars.length).toEqual(2); 82 | expect(vars).toContain('{{var-one}}'); 83 | expect(vars).toContain('{{var-two}}'); 84 | }); 85 | 86 | /** 87 | * @unit_test Extract no variables 88 | */ 89 | test('Extract no variables', () => { 90 | const text = '\n }}{{ '; 91 | const vars = extractVariables(text); 92 | expect(vars.length).toEqual(0); 93 | }); 94 | 95 | /** 96 | * @todo 97 | * @unit_test Extract variable: function. 98 | */ 99 | 100 | /** 101 | * @todo 102 | * @unit_test Evaluate config with variable 103 | */ 104 | 105 | /** 106 | * @todo 107 | * @unit_test Evaluate config with variable as function 108 | */ 109 | -------------------------------------------------------------------------------- /src/dostman/index.js: -------------------------------------------------------------------------------- 1 | const { readFile, writeFile } = require('../lib/fs'); 2 | const { parseDecorator, extractVariables } = require('../lib/parsers'); 3 | const Request = require('../request'); 4 | const Logger = require('../lib/logger'); 5 | class Dostman { 6 | // Member variables 7 | filePath; 8 | fileName; 9 | file; 10 | config; 11 | variables; 12 | requests; 13 | logger; 14 | verbose; 15 | 16 | constructor(filePath, verbose = true) { 17 | this.verbose = verbose; 18 | this.logger = new Logger(verbose); 19 | this.filePath = filePath; 20 | this.fileName = filePath.split('/').slice(-1).pop(); 21 | this.logger.newLine(); 22 | this.logger.info(`Processing ${this.fileName}`); 23 | this.file = this.readFile(filePath); 24 | this.requests = []; 25 | this.parseFile(); 26 | } 27 | 28 | readFile(filePath) { 29 | let file = readFile(filePath); 30 | if (!file) { 31 | this.logger.error(`Unable to read file ${filePath}`); 32 | throw new Error('Unable to read file.'); 33 | } 34 | 35 | return this.cleanFile(file); 36 | } 37 | 38 | cleanFile(file) { 39 | file = file.replace(/(\r\n|\n|\r)/gm, ' '); // Remove all line breaks 40 | file = file.replace(/\s\s+/g, ' '); // Trim all whitespace to 1 space. 41 | return file; 42 | } 43 | 44 | parseFile() { 45 | const chunks = this.getChunks(); 46 | chunks.forEach((c) => { 47 | if (this.isConfigChunk(c)) { 48 | this.parseConfig(c); 49 | return; 50 | } 51 | const req = this.parseRequest(c); 52 | if (req) this.requests.push(req); 53 | }); 54 | } 55 | 56 | isConfigChunk(chunk) { 57 | return chunk.includes('@config'); 58 | } 59 | 60 | getChunks() { 61 | return this.file.split('###'); 62 | } 63 | 64 | parseConfig(chunk) { 65 | this.logger.info('Parsing @config snippet...'); 66 | const config = parseDecorator('config', chunk); 67 | this.config = config; 68 | this.evalConfig(config); 69 | return config; 70 | } 71 | 72 | evalConfig(configString) { 73 | try { 74 | const vars = eval(configString); 75 | this.variables = vars; 76 | return true; 77 | } catch (err) { 78 | throw new Error('Unable to evaluate config snippet.'); 79 | } 80 | } 81 | 82 | parseRequest(chunk) { 83 | try { 84 | chunk = this.injectVariables(chunk); 85 | const request = new Request(chunk, this.verbose); 86 | return request; 87 | } catch (err) { 88 | this.logger.error(`${err}`); 89 | return false; 90 | } 91 | } 92 | 93 | async executeRequests() { 94 | for (let req of this.requests) { 95 | await req.execute(); 96 | } 97 | } 98 | 99 | injectVariables(chunk) { 100 | const matches = extractVariables(chunk); 101 | if (!matches || matches.length < 1) { 102 | return chunk; 103 | } 104 | this.logger.log('\n Injecting Variables...'); 105 | for (let match of matches) { 106 | const key = match.substring(2, match.length - 2); 107 | let value = this.variables[key]; 108 | if (value instanceof Function) { 109 | value = value(); 110 | } 111 | this.logger.colored(`${key} = ${value}`, 'whiteBright'); 112 | chunk = chunk.replace(match, value); 113 | } 114 | return chunk; 115 | } 116 | 117 | writeOutput() { 118 | const requestsAsJson = []; 119 | for (let req of this.requests) { 120 | requestsAsJson.push(req.toJson()); 121 | } 122 | const output = { 123 | requests: requestsAsJson, 124 | }; 125 | 126 | writeFile(`${this.filePath}.json`, output); 127 | } 128 | } 129 | 130 | module.exports = Dostman; 131 | -------------------------------------------------------------------------------- /src/request/index.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const { parseDecorator, removeSpaces } = require('../lib/parsers'); 3 | const Logger = require('../lib/logger'); 4 | 5 | class Request { 6 | method; 7 | url; 8 | headers; 9 | body; 10 | desc; 11 | response; 12 | error; 13 | logger; 14 | 15 | constructor(chunk, verbose = true) { 16 | this.logger = new Logger(verbose); 17 | const { method, url, headers, body, desc } = this.parseChunk(chunk); 18 | this.method = method; 19 | this.url = url; 20 | this.headers = headers; 21 | this.body = body; 22 | this.desc = desc; 23 | } 24 | 25 | async execute() { 26 | try { 27 | const { status, data } = await axios({ 28 | method: this.method, 29 | url: this.url, 30 | data: this.body, 31 | headers: this.headers, 32 | }); 33 | this.response = { 34 | status, 35 | data, 36 | }; 37 | this.logger.suc(`Executed ${this.method} ${this.url}`); 38 | return this.response; 39 | } catch (err) { 40 | // const { status, message } = err?.response; 41 | this.logger.error(`Error with ${this.method} ${this.url}`); 42 | this.error = true; 43 | return false; 44 | } 45 | } 46 | 47 | parseChunk(chunk) { 48 | this.logger.info('Parsing Request:'); 49 | chunk = removeSpaces(chunk); 50 | return { 51 | desc: this.parseDesc(chunk), 52 | method: this.parseMethod(chunk), 53 | url: this.parseUrl(chunk), 54 | headers: this.parseHeaders(chunk), 55 | body: this.parseBody(chunk), 56 | }; 57 | } 58 | 59 | parseMethod(chunk) { 60 | this.logger.log(`[2/5] Parsing method...`); 61 | let method = parseDecorator('method', chunk); 62 | this.logger.value(`${method}`); 63 | method = this.trimString(method); 64 | this.method = method; 65 | return method; 66 | } 67 | 68 | parseUrl(chunk) { 69 | this.logger.log(`[3/5] Parsing URL...`); 70 | let url = parseDecorator('url', chunk); 71 | url = this.trimString(url); 72 | this.logger.value(`${url}`); 73 | return url; 74 | } 75 | 76 | parseHeaders(chunk) { 77 | this.logger.log(`[4/5] Parsing Headers...`); 78 | let headers = parseDecorator('headers', chunk); 79 | if (!headers) return {}; 80 | headers = headers.split(','); // Seperate into array with "," 81 | const headersObject = {}; 82 | headers.forEach((h, ind) => { 83 | const item = headers[ind].split(':'); 84 | const key = item[0].trim(); 85 | const value = item[1].trim(); 86 | headersObject[key] = value; 87 | }); 88 | this.logger.json(headersObject, true); 89 | return headersObject; 90 | } 91 | 92 | parseBody(chunk) { 93 | this.logger.log(`[5/5] Parsing Body...`); 94 | if (this.method === 'GET') { 95 | this.logger.value('No body for GET requests.'); 96 | return null; 97 | } 98 | this.logger.log(`[5/5] Parsing Body...`); 99 | let body = parseDecorator('body', chunk); 100 | if (!body) { 101 | this.logger.colored('No body found.'); 102 | return null; 103 | } 104 | body = JSON.parse(body); 105 | this.logger.json(body, true); 106 | return body; 107 | } 108 | 109 | parseDesc(chunk) { 110 | this.logger.log(`[1/5] Parsing description...`); 111 | let desc = parseDecorator('desc', chunk); 112 | this.logger.value(`${desc}`); 113 | return desc; 114 | } 115 | 116 | trimString(str) { 117 | return str.replace(/\s+/g, ''); 118 | } 119 | 120 | toJson() { 121 | return { 122 | description: this.desc, 123 | method: this.method, 124 | url: this.url, 125 | headers: this.headers, 126 | body: this.body, 127 | response: this.response, 128 | error: this.error, 129 | }; 130 | } 131 | 132 | toString() { 133 | return JSON.stringify(this.toJson()); 134 | } 135 | } 136 | 137 | module.exports = Request; 138 | -------------------------------------------------------------------------------- /sample-requests/posts_error.dostman.json: -------------------------------------------------------------------------------- 1 | { 2 | "requests": [ 3 | { 4 | "description": "This will get user's info", 5 | "method": "GET", 6 | "url": "https://jsonplaceholder.typicode.com/posts", 7 | "headers": { "content-type": "application/json" }, 8 | "body": null, 9 | "response": { 10 | "status": 200, 11 | "data": [ 12 | { 13 | "userId": 1, 14 | "id": 1, 15 | "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", 16 | "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" 17 | }, 18 | { 19 | "userId": 1, 20 | "id": 2, 21 | "title": "qui est esse", 22 | "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla" 23 | }, 24 | { 25 | "userId": 1, 26 | "id": 3, 27 | "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut", 28 | "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut" 29 | }, 30 | { 31 | "userId": 1, 32 | "id": 4, 33 | "title": "eum et est occaecati", 34 | "body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit" 35 | }, 36 | { 37 | "userId": 1, 38 | "id": 5, 39 | "title": "nesciunt quas odio", 40 | "body": "repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque" 41 | }, 42 | { 43 | "userId": 1, 44 | "id": 6, 45 | "title": "dolorem eum magni eos aperiam quia", 46 | "body": "ut aspernatur corporis harum nihil quis provident sequi\nmollitia nobis aliquid molestiae\nperspiciatis et ea nemo ab reprehenderit accusantium quas\nvoluptate dolores velit et doloremque molestiae" 47 | }, 48 | { 49 | "userId": 1, 50 | "id": 7, 51 | "title": "magnam facilis autem", 52 | "body": "dolore placeat quibusdam ea quo vitae\nmagni quis enim qui quis quo nemo aut saepe\nquidem repellat excepturi ut quia\nsunt ut sequi eos ea sed quas" 53 | }, 54 | { 55 | "userId": 1, 56 | "id": 8, 57 | "title": "dolorem dolore est ipsam", 58 | "body": "dignissimos aperiam dolorem qui eum\nfacilis quibusdam animi sint suscipit qui sint possimus cum\nquaerat magni maiores excepturi\nipsam ut commodi dolor voluptatum modi aut vitae" 59 | }, 60 | { 61 | "userId": 1, 62 | "id": 9, 63 | "title": "nesciunt iure omnis dolorem tempora et accusantium", 64 | "body": "consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas" 65 | }, 66 | { 67 | "userId": 1, 68 | "id": 10, 69 | "title": "optio molestias id quia eum", 70 | "body": "quo et expedita modi cum officia vel magni\ndoloribus qui repudiandae\nvero nisi sit\nquos veniam quod sed accusamus veritatis error" 71 | }, 72 | { 73 | "userId": 2, 74 | "id": 11, 75 | "title": "et ea vero quia laudantium autem", 76 | "body": "delectus reiciendis molestiae occaecati non minima eveniet qui voluptatibus\naccusamus in eum beatae sit\nvel qui neque voluptates ut commodi qui incidunt\nut animi commodi" 77 | }, 78 | { 79 | "userId": 2, 80 | "id": 12, 81 | "title": "in quibusdam tempore odit est dolorem", 82 | "body": "itaque id aut magnam\npraesentium quia et ea odit et ea voluptas et\nsapiente quia nihil amet occaecati quia id voluptatem\nincidunt ea est distinctio odio" 83 | }, 84 | { 85 | "userId": 2, 86 | "id": 13, 87 | "title": "dolorum ut in voluptas mollitia et saepe quo animi", 88 | "body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque\niste corrupti reiciendis voluptatem eius rerum\nsit cumque quod eligendi laborum minima\nperferendis recusandae assumenda consectetur porro architecto ipsum ipsam" 89 | }, 90 | { 91 | "userId": 2, 92 | "id": 14, 93 | "title": "voluptatem eligendi optio", 94 | "body": "fuga et accusamus dolorum perferendis illo voluptas\nnon doloremque neque facere\nad qui dolorum molestiae beatae\nsed aut voluptas totam sit illum" 95 | }, 96 | { 97 | "userId": 2, 98 | "id": 15, 99 | "title": "eveniet quod temporibus", 100 | "body": "reprehenderit quos placeat\nvelit minima officia dolores impedit repudiandae molestiae nam\nvoluptas recusandae quis delectus\nofficiis harum fugiat vitae" 101 | }, 102 | { 103 | "userId": 2, 104 | "id": 16, 105 | "title": "sint suscipit perspiciatis velit dolorum rerum ipsa laboriosam odio", 106 | "body": "suscipit nam nisi quo aperiam aut\nasperiores eos fugit maiores voluptatibus quia\nvoluptatem quis ullam qui in alias quia est\nconsequatur magni mollitia accusamus ea nisi voluptate dicta" 107 | }, 108 | { 109 | "userId": 2, 110 | "id": 17, 111 | "title": "fugit voluptas sed molestias voluptatem provident", 112 | "body": "eos voluptas et aut odit natus earum\naspernatur fuga molestiae ullam\ndeserunt ratione qui eos\nqui nihil ratione nemo velit ut aut id quo" 113 | }, 114 | { 115 | "userId": 2, 116 | "id": 18, 117 | "title": "voluptate et itaque vero tempora molestiae", 118 | "body": "eveniet quo quis\nlaborum totam consequatur non dolor\nut et est repudiandae\nest voluptatem vel debitis et magnam" 119 | }, 120 | { 121 | "userId": 2, 122 | "id": 19, 123 | "title": "adipisci placeat illum aut reiciendis qui", 124 | "body": "illum quis cupiditate provident sit magnam\nea sed aut omnis\nveniam maiores ullam consequatur atque\nadipisci quo iste expedita sit quos voluptas" 125 | }, 126 | { 127 | "userId": 2, 128 | "id": 20, 129 | "title": "doloribus ad provident suscipit at", 130 | "body": "qui consequuntur ducimus possimus quisquam amet similique\nsuscipit porro ipsam amet\neos veritatis officiis exercitationem vel fugit aut necessitatibus totam\nomnis rerum consequatur expedita quidem cumque explicabo" 131 | }, 132 | { 133 | "userId": 3, 134 | "id": 21, 135 | "title": "asperiores ea ipsam voluptatibus modi minima quia sint", 136 | "body": "repellat aliquid praesentium dolorem quo\nsed totam minus non itaque\nnihil labore molestiae sunt dolor eveniet hic recusandae veniam\ntempora et tenetur expedita sunt" 137 | }, 138 | { 139 | "userId": 3, 140 | "id": 22, 141 | "title": "dolor sint quo a velit explicabo quia nam", 142 | "body": "eos qui et ipsum ipsam suscipit aut\nsed omnis non odio\nexpedita earum mollitia molestiae aut atque rem suscipit\nnam impedit esse" 143 | }, 144 | { 145 | "userId": 3, 146 | "id": 23, 147 | "title": "maxime id vitae nihil numquam", 148 | "body": "veritatis unde neque eligendi\nquae quod architecto quo neque vitae\nest illo sit tempora doloremque fugit quod\net et vel beatae sequi ullam sed tenetur perspiciatis" 149 | }, 150 | { 151 | "userId": 3, 152 | "id": 24, 153 | "title": "autem hic labore sunt dolores incidunt", 154 | "body": "enim et ex nulla\nomnis voluptas quia qui\nvoluptatem consequatur numquam aliquam sunt\ntotam recusandae id dignissimos aut sed asperiores deserunt" 155 | }, 156 | { 157 | "userId": 3, 158 | "id": 25, 159 | "title": "rem alias distinctio quo quis", 160 | "body": "ullam consequatur ut\nomnis quis sit vel consequuntur\nipsa eligendi ipsum molestiae et omnis error nostrum\nmolestiae illo tempore quia et distinctio" 161 | }, 162 | { 163 | "userId": 3, 164 | "id": 26, 165 | "title": "est et quae odit qui non", 166 | "body": "similique esse doloribus nihil accusamus\nomnis dolorem fuga consequuntur reprehenderit fugit recusandae temporibus\nperspiciatis cum ut laudantium\nomnis aut molestiae vel vero" 167 | }, 168 | { 169 | "userId": 3, 170 | "id": 27, 171 | "title": "quasi id et eos tenetur aut quo autem", 172 | "body": "eum sed dolores ipsam sint possimus debitis occaecati\ndebitis qui qui et\nut placeat enim earum aut odit facilis\nconsequatur suscipit necessitatibus rerum sed inventore temporibus consequatur" 173 | }, 174 | { 175 | "userId": 3, 176 | "id": 28, 177 | "title": "delectus ullam et corporis nulla voluptas sequi", 178 | "body": "non et quaerat ex quae ad maiores\nmaiores recusandae totam aut blanditiis mollitia quas illo\nut voluptatibus voluptatem\nsimilique nostrum eum" 179 | }, 180 | { 181 | "userId": 3, 182 | "id": 29, 183 | "title": "iusto eius quod necessitatibus culpa ea", 184 | "body": "odit magnam ut saepe sed non qui\ntempora atque nihil\naccusamus illum doloribus illo dolor\neligendi repudiandae odit magni similique sed cum maiores" 185 | }, 186 | { 187 | "userId": 3, 188 | "id": 30, 189 | "title": "a quo magni similique perferendis", 190 | "body": "alias dolor cumque\nimpedit blanditiis non eveniet odio maxime\nblanditiis amet eius quis tempora quia autem rem\na provident perspiciatis quia" 191 | }, 192 | { 193 | "userId": 4, 194 | "id": 31, 195 | "title": "ullam ut quidem id aut vel consequuntur", 196 | "body": "debitis eius sed quibusdam non quis consectetur vitae\nimpedit ut qui consequatur sed aut in\nquidem sit nostrum et maiores adipisci atque\nquaerat voluptatem adipisci repudiandae" 197 | }, 198 | { 199 | "userId": 4, 200 | "id": 32, 201 | "title": "doloremque illum aliquid sunt", 202 | "body": "deserunt eos nobis asperiores et hic\nest debitis repellat molestiae optio\nnihil ratione ut eos beatae quibusdam distinctio maiores\nearum voluptates et aut adipisci ea maiores voluptas maxime" 203 | }, 204 | { 205 | "userId": 4, 206 | "id": 33, 207 | "title": "qui explicabo molestiae dolorem", 208 | "body": "rerum ut et numquam laborum odit est sit\nid qui sint in\nquasi tenetur tempore aperiam et quaerat qui in\nrerum officiis sequi cumque quod" 209 | }, 210 | { 211 | "userId": 4, 212 | "id": 34, 213 | "title": "magnam ut rerum iure", 214 | "body": "ea velit perferendis earum ut voluptatem voluptate itaque iusto\ntotam pariatur in\nnemo voluptatem voluptatem autem magni tempora minima in\nest distinctio qui assumenda accusamus dignissimos officia nesciunt nobis" 215 | }, 216 | { 217 | "userId": 4, 218 | "id": 35, 219 | "title": "id nihil consequatur molestias animi provident", 220 | "body": "nisi error delectus possimus ut eligendi vitae\nplaceat eos harum cupiditate facilis reprehenderit voluptatem beatae\nmodi ducimus quo illum voluptas eligendi\net nobis quia fugit" 221 | }, 222 | { 223 | "userId": 4, 224 | "id": 36, 225 | "title": "fuga nam accusamus voluptas reiciendis itaque", 226 | "body": "ad mollitia et omnis minus architecto odit\nvoluptas doloremque maxime aut non ipsa qui alias veniam\nblanditiis culpa aut quia nihil cumque facere et occaecati\nqui aspernatur quia eaque ut aperiam inventore" 227 | }, 228 | { 229 | "userId": 4, 230 | "id": 37, 231 | "title": "provident vel ut sit ratione est", 232 | "body": "debitis et eaque non officia sed nesciunt pariatur vel\nvoluptatem iste vero et ea\nnumquam aut expedita ipsum nulla in\nvoluptates omnis consequatur aut enim officiis in quam qui" 233 | }, 234 | { 235 | "userId": 4, 236 | "id": 38, 237 | "title": "explicabo et eos deleniti nostrum ab id repellendus", 238 | "body": "animi esse sit aut sit nesciunt assumenda eum voluptas\nquia voluptatibus provident quia necessitatibus ea\nrerum repudiandae quia voluptatem delectus fugit aut id quia\nratione optio eos iusto veniam iure" 239 | }, 240 | { 241 | "userId": 4, 242 | "id": 39, 243 | "title": "eos dolorem iste accusantium est eaque quam", 244 | "body": "corporis rerum ducimus vel eum accusantium\nmaxime aspernatur a porro possimus iste omnis\nest in deleniti asperiores fuga aut\nvoluptas sapiente vel dolore minus voluptatem incidunt ex" 245 | }, 246 | { 247 | "userId": 4, 248 | "id": 40, 249 | "title": "enim quo cumque", 250 | "body": "ut voluptatum aliquid illo tenetur nemo sequi quo facilis\nipsum rem optio mollitia quas\nvoluptatem eum voluptas qui\nunde omnis voluptatem iure quasi maxime voluptas nam" 251 | }, 252 | { 253 | "userId": 5, 254 | "id": 41, 255 | "title": "non est facere", 256 | "body": "molestias id nostrum\nexcepturi molestiae dolore omnis repellendus quaerat saepe\nconsectetur iste quaerat tenetur asperiores accusamus ex ut\nnam quidem est ducimus sunt debitis saepe" 257 | }, 258 | { 259 | "userId": 5, 260 | "id": 42, 261 | "title": "commodi ullam sint et excepturi error explicabo praesentium voluptas", 262 | "body": "odio fugit voluptatum ducimus earum autem est incidunt voluptatem\nodit reiciendis aliquam sunt sequi nulla dolorem\nnon facere repellendus voluptates quia\nratione harum vitae ut" 263 | }, 264 | { 265 | "userId": 5, 266 | "id": 43, 267 | "title": "eligendi iste nostrum consequuntur adipisci praesentium sit beatae perferendis", 268 | "body": "similique fugit est\nillum et dolorum harum et voluptate eaque quidem\nexercitationem quos nam commodi possimus cum odio nihil nulla\ndolorum exercitationem magnam ex et a et distinctio debitis" 269 | }, 270 | { 271 | "userId": 5, 272 | "id": 44, 273 | "title": "optio dolor molestias sit", 274 | "body": "temporibus est consectetur dolore\net libero debitis vel velit laboriosam quia\nipsum quibusdam qui itaque fuga rem aut\nea et iure quam sed maxime ut distinctio quae" 275 | }, 276 | { 277 | "userId": 5, 278 | "id": 45, 279 | "title": "ut numquam possimus omnis eius suscipit laudantium iure", 280 | "body": "est natus reiciendis nihil possimus aut provident\nex et dolor\nrepellat pariatur est\nnobis rerum repellendus dolorem autem" 281 | }, 282 | { 283 | "userId": 5, 284 | "id": 46, 285 | "title": "aut quo modi neque nostrum ducimus", 286 | "body": "voluptatem quisquam iste\nvoluptatibus natus officiis facilis dolorem\nquis quas ipsam\nvel et voluptatum in aliquid" 287 | }, 288 | { 289 | "userId": 5, 290 | "id": 47, 291 | "title": "quibusdam cumque rem aut deserunt", 292 | "body": "voluptatem assumenda ut qui ut cupiditate aut impedit veniam\noccaecati nemo illum voluptatem laudantium\nmolestiae beatae rerum ea iure soluta nostrum\neligendi et voluptate" 293 | }, 294 | { 295 | "userId": 5, 296 | "id": 48, 297 | "title": "ut voluptatem illum ea doloribus itaque eos", 298 | "body": "voluptates quo voluptatem facilis iure occaecati\nvel assumenda rerum officia et\nillum perspiciatis ab deleniti\nlaudantium repellat ad ut et autem reprehenderit" 299 | }, 300 | { 301 | "userId": 5, 302 | "id": 49, 303 | "title": "laborum non sunt aut ut assumenda perspiciatis voluptas", 304 | "body": "inventore ab sint\nnatus fugit id nulla sequi architecto nihil quaerat\neos tenetur in in eum veritatis non\nquibusdam officiis aspernatur cumque aut commodi aut" 305 | }, 306 | { 307 | "userId": 5, 308 | "id": 50, 309 | "title": "repellendus qui recusandae incidunt voluptates tenetur qui omnis exercitationem", 310 | "body": "error suscipit maxime adipisci consequuntur recusandae\nvoluptas eligendi et est et voluptates\nquia distinctio ab amet quaerat molestiae et vitae\nadipisci impedit sequi nesciunt quis consectetur" 311 | }, 312 | { 313 | "userId": 6, 314 | "id": 51, 315 | "title": "soluta aliquam aperiam consequatur illo quis voluptas", 316 | "body": "sunt dolores aut doloribus\ndolore doloribus voluptates tempora et\ndoloremque et quo\ncum asperiores sit consectetur dolorem" 317 | }, 318 | { 319 | "userId": 6, 320 | "id": 52, 321 | "title": "qui enim et consequuntur quia animi quis voluptate quibusdam", 322 | "body": "iusto est quibusdam fuga quas quaerat molestias\na enim ut sit accusamus enim\ntemporibus iusto accusantium provident architecto\nsoluta esse reprehenderit qui laborum" 323 | }, 324 | { 325 | "userId": 6, 326 | "id": 53, 327 | "title": "ut quo aut ducimus alias", 328 | "body": "minima harum praesentium eum rerum illo dolore\nquasi exercitationem rerum nam\nporro quis neque quo\nconsequatur minus dolor quidem veritatis sunt non explicabo similique" 329 | }, 330 | { 331 | "userId": 6, 332 | "id": 54, 333 | "title": "sit asperiores ipsam eveniet odio non quia", 334 | "body": "totam corporis dignissimos\nvitae dolorem ut occaecati accusamus\nex velit deserunt\net exercitationem vero incidunt corrupti mollitia" 335 | }, 336 | { 337 | "userId": 6, 338 | "id": 55, 339 | "title": "sit vel voluptatem et non libero", 340 | "body": "debitis excepturi ea perferendis harum libero optio\neos accusamus cum fuga ut sapiente repudiandae\net ut incidunt omnis molestiae\nnihil ut eum odit" 341 | }, 342 | { 343 | "userId": 6, 344 | "id": 56, 345 | "title": "qui et at rerum necessitatibus", 346 | "body": "aut est omnis dolores\nneque rerum quod ea rerum velit pariatur beatae excepturi\net provident voluptas corrupti\ncorporis harum reprehenderit dolores eligendi" 347 | }, 348 | { 349 | "userId": 6, 350 | "id": 57, 351 | "title": "sed ab est est", 352 | "body": "at pariatur consequuntur earum quidem\nquo est laudantium soluta voluptatem\nqui ullam et est\net cum voluptas voluptatum repellat est" 353 | }, 354 | { 355 | "userId": 6, 356 | "id": 58, 357 | "title": "voluptatum itaque dolores nisi et quasi", 358 | "body": "veniam voluptatum quae adipisci id\net id quia eos ad et dolorem\naliquam quo nisi sunt eos impedit error\nad similique veniam" 359 | }, 360 | { 361 | "userId": 6, 362 | "id": 59, 363 | "title": "qui commodi dolor at maiores et quis id accusantium", 364 | "body": "perspiciatis et quam ea autem temporibus non voluptatibus qui\nbeatae a earum officia nesciunt dolores suscipit voluptas et\nanimi doloribus cum rerum quas et magni\net hic ut ut commodi expedita sunt" 365 | }, 366 | { 367 | "userId": 6, 368 | "id": 60, 369 | "title": "consequatur placeat omnis quisquam quia reprehenderit fugit veritatis facere", 370 | "body": "asperiores sunt ab assumenda cumque modi velit\nqui esse omnis\nvoluptate et fuga perferendis voluptas\nillo ratione amet aut et omnis" 371 | }, 372 | { 373 | "userId": 7, 374 | "id": 61, 375 | "title": "voluptatem doloribus consectetur est ut ducimus", 376 | "body": "ab nemo optio odio\ndelectus tenetur corporis similique nobis repellendus rerum omnis facilis\nvero blanditiis debitis in nesciunt doloribus dicta dolores\nmagnam minus velit" 377 | }, 378 | { 379 | "userId": 7, 380 | "id": 62, 381 | "title": "beatae enim quia vel", 382 | "body": "enim aspernatur illo distinctio quae praesentium\nbeatae alias amet delectus qui voluptate distinctio\nodit sint accusantium autem omnis\nquo molestiae omnis ea eveniet optio" 383 | }, 384 | { 385 | "userId": 7, 386 | "id": 63, 387 | "title": "voluptas blanditiis repellendus animi ducimus error sapiente et suscipit", 388 | "body": "enim adipisci aspernatur nemo\nnumquam omnis facere dolorem dolor ex quis temporibus incidunt\nab delectus culpa quo reprehenderit blanditiis asperiores\naccusantium ut quam in voluptatibus voluptas ipsam dicta" 389 | }, 390 | { 391 | "userId": 7, 392 | "id": 64, 393 | "title": "et fugit quas eum in in aperiam quod", 394 | "body": "id velit blanditiis\neum ea voluptatem\nmolestiae sint occaecati est eos perspiciatis\nincidunt a error provident eaque aut aut qui" 395 | }, 396 | { 397 | "userId": 7, 398 | "id": 65, 399 | "title": "consequatur id enim sunt et et", 400 | "body": "voluptatibus ex esse\nsint explicabo est aliquid cumque adipisci fuga repellat labore\nmolestiae corrupti ex saepe at asperiores et perferendis\nnatus id esse incidunt pariatur" 401 | }, 402 | { 403 | "userId": 7, 404 | "id": 66, 405 | "title": "repudiandae ea animi iusto", 406 | "body": "officia veritatis tenetur vero qui itaque\nsint non ratione\nsed et ut asperiores iusto eos molestiae nostrum\nveritatis quibusdam et nemo iusto saepe" 407 | }, 408 | { 409 | "userId": 7, 410 | "id": 67, 411 | "title": "aliquid eos sed fuga est maxime repellendus", 412 | "body": "reprehenderit id nostrum\nvoluptas doloremque pariatur sint et accusantium quia quod aspernatur\net fugiat amet\nnon sapiente et consequatur necessitatibus molestiae" 413 | }, 414 | { 415 | "userId": 7, 416 | "id": 68, 417 | "title": "odio quis facere architecto reiciendis optio", 418 | "body": "magnam molestiae perferendis quisquam\nqui cum reiciendis\nquaerat animi amet hic inventore\nea quia deleniti quidem saepe porro velit" 419 | }, 420 | { 421 | "userId": 7, 422 | "id": 69, 423 | "title": "fugiat quod pariatur odit minima", 424 | "body": "officiis error culpa consequatur modi asperiores et\ndolorum assumenda voluptas et vel qui aut vel rerum\nvoluptatum quisquam perspiciatis quia rerum consequatur totam quas\nsequi commodi repudiandae asperiores et saepe a" 425 | }, 426 | { 427 | "userId": 7, 428 | "id": 70, 429 | "title": "voluptatem laborum magni", 430 | "body": "sunt repellendus quae\nest asperiores aut deleniti esse accusamus repellendus quia aut\nquia dolorem unde\neum tempora esse dolore" 431 | }, 432 | { 433 | "userId": 8, 434 | "id": 71, 435 | "title": "et iusto veniam et illum aut fuga", 436 | "body": "occaecati a doloribus\niste saepe consectetur placeat eum voluptate dolorem et\nqui quo quia voluptas\nrerum ut id enim velit est perferendis" 437 | }, 438 | { 439 | "userId": 8, 440 | "id": 72, 441 | "title": "sint hic doloribus consequatur eos non id", 442 | "body": "quam occaecati qui deleniti consectetur\nconsequatur aut facere quas exercitationem aliquam hic voluptas\nneque id sunt ut aut accusamus\nsunt consectetur expedita inventore velit" 443 | }, 444 | { 445 | "userId": 8, 446 | "id": 73, 447 | "title": "consequuntur deleniti eos quia temporibus ab aliquid at", 448 | "body": "voluptatem cumque tenetur consequatur expedita ipsum nemo quia explicabo\naut eum minima consequatur\ntempore cumque quae est et\net in consequuntur voluptatem voluptates aut" 449 | }, 450 | { 451 | "userId": 8, 452 | "id": 74, 453 | "title": "enim unde ratione doloribus quas enim ut sit sapiente", 454 | "body": "odit qui et et necessitatibus sint veniam\nmollitia amet doloremque molestiae commodi similique magnam et quam\nblanditiis est itaque\nquo et tenetur ratione occaecati molestiae tempora" 455 | }, 456 | { 457 | "userId": 8, 458 | "id": 75, 459 | "title": "dignissimos eum dolor ut enim et delectus in", 460 | "body": "commodi non non omnis et voluptas sit\nautem aut nobis magnam et sapiente voluptatem\net laborum repellat qui delectus facilis temporibus\nrerum amet et nemo voluptate expedita adipisci error dolorem" 461 | }, 462 | { 463 | "userId": 8, 464 | "id": 76, 465 | "title": "doloremque officiis ad et non perferendis", 466 | "body": "ut animi facere\ntotam iusto tempore\nmolestiae eum aut et dolorem aperiam\nquaerat recusandae totam odio" 467 | }, 468 | { 469 | "userId": 8, 470 | "id": 77, 471 | "title": "necessitatibus quasi exercitationem odio", 472 | "body": "modi ut in nulla repudiandae dolorum nostrum eos\naut consequatur omnis\nut incidunt est omnis iste et quam\nvoluptates sapiente aliquam asperiores nobis amet corrupti repudiandae provident" 473 | }, 474 | { 475 | "userId": 8, 476 | "id": 78, 477 | "title": "quam voluptatibus rerum veritatis", 478 | "body": "nobis facilis odit tempore cupiditate quia\nassumenda doloribus rerum qui ea\nillum et qui totam\naut veniam repellendus" 479 | }, 480 | { 481 | "userId": 8, 482 | "id": 79, 483 | "title": "pariatur consequatur quia magnam autem omnis non amet", 484 | "body": "libero accusantium et et facere incidunt sit dolorem\nnon excepturi qui quia sed laudantium\nquisquam molestiae ducimus est\nofficiis esse molestiae iste et quos" 485 | }, 486 | { 487 | "userId": 8, 488 | "id": 80, 489 | "title": "labore in ex et explicabo corporis aut quas", 490 | "body": "ex quod dolorem ea eum iure qui provident amet\nquia qui facere excepturi et repudiandae\nasperiores molestias provident\nminus incidunt vero fugit rerum sint sunt excepturi provident" 491 | }, 492 | { 493 | "userId": 9, 494 | "id": 81, 495 | "title": "tempora rem veritatis voluptas quo dolores vero", 496 | "body": "facere qui nesciunt est voluptatum voluptatem nisi\nsequi eligendi necessitatibus ea at rerum itaque\nharum non ratione velit laboriosam quis consequuntur\nex officiis minima doloremque voluptas ut aut" 497 | }, 498 | { 499 | "userId": 9, 500 | "id": 82, 501 | "title": "laudantium voluptate suscipit sunt enim enim", 502 | "body": "ut libero sit aut totam inventore sunt\nporro sint qui sunt molestiae\nconsequatur cupiditate qui iste ducimus adipisci\ndolor enim assumenda soluta laboriosam amet iste delectus hic" 503 | }, 504 | { 505 | "userId": 9, 506 | "id": 83, 507 | "title": "odit et voluptates doloribus alias odio et", 508 | "body": "est molestiae facilis quis tempora numquam nihil qui\nvoluptate sapiente consequatur est qui\nnecessitatibus autem aut ipsa aperiam modi dolore numquam\nreprehenderit eius rem quibusdam" 509 | }, 510 | { 511 | "userId": 9, 512 | "id": 84, 513 | "title": "optio ipsam molestias necessitatibus occaecati facilis veritatis dolores aut", 514 | "body": "sint molestiae magni a et quos\neaque et quasi\nut rerum debitis similique veniam\nrecusandae dignissimos dolor incidunt consequatur odio" 515 | }, 516 | { 517 | "userId": 9, 518 | "id": 85, 519 | "title": "dolore veritatis porro provident adipisci blanditiis et sunt", 520 | "body": "similique sed nisi voluptas iusto omnis\nmollitia et quo\nassumenda suscipit officia magnam sint sed tempora\nenim provident pariatur praesentium atque animi amet ratione" 521 | }, 522 | { 523 | "userId": 9, 524 | "id": 86, 525 | "title": "placeat quia et porro iste", 526 | "body": "quasi excepturi consequatur iste autem temporibus sed molestiae beatae\net quaerat et esse ut\nvoluptatem occaecati et vel explicabo autem\nasperiores pariatur deserunt optio" 527 | }, 528 | { 529 | "userId": 9, 530 | "id": 87, 531 | "title": "nostrum quis quasi placeat", 532 | "body": "eos et molestiae\nnesciunt ut a\ndolores perspiciatis repellendus repellat aliquid\nmagnam sint rem ipsum est" 533 | }, 534 | { 535 | "userId": 9, 536 | "id": 88, 537 | "title": "sapiente omnis fugit eos", 538 | "body": "consequatur omnis est praesentium\nducimus non iste\nneque hic deserunt\nvoluptatibus veniam cum et rerum sed" 539 | }, 540 | { 541 | "userId": 9, 542 | "id": 89, 543 | "title": "sint soluta et vel magnam aut ut sed qui", 544 | "body": "repellat aut aperiam totam temporibus autem et\narchitecto magnam ut\nconsequatur qui cupiditate rerum quia soluta dignissimos nihil iure\ntempore quas est" 545 | }, 546 | { 547 | "userId": 9, 548 | "id": 90, 549 | "title": "ad iusto omnis odit dolor voluptatibus", 550 | "body": "minus omnis soluta quia\nqui sed adipisci voluptates illum ipsam voluptatem\neligendi officia ut in\neos soluta similique molestias praesentium blanditiis" 551 | }, 552 | { 553 | "userId": 10, 554 | "id": 91, 555 | "title": "aut amet sed", 556 | "body": "libero voluptate eveniet aperiam sed\nsunt placeat suscipit molestias\nsimilique fugit nam natus\nexpedita consequatur consequatur dolores quia eos et placeat" 557 | }, 558 | { 559 | "userId": 10, 560 | "id": 92, 561 | "title": "ratione ex tenetur perferendis", 562 | "body": "aut et excepturi dicta laudantium sint rerum nihil\nlaudantium et at\na neque minima officia et similique libero et\ncommodi voluptate qui" 563 | }, 564 | { 565 | "userId": 10, 566 | "id": 93, 567 | "title": "beatae soluta recusandae", 568 | "body": "dolorem quibusdam ducimus consequuntur dicta aut quo laboriosam\nvoluptatem quis enim recusandae ut sed sunt\nnostrum est odit totam\nsit error sed sunt eveniet provident qui nulla" 569 | }, 570 | { 571 | "userId": 10, 572 | "id": 94, 573 | "title": "qui qui voluptates illo iste minima", 574 | "body": "aspernatur expedita soluta quo ab ut similique\nexpedita dolores amet\nsed temporibus distinctio magnam saepe deleniti\nomnis facilis nam ipsum natus sint similique omnis" 575 | }, 576 | { 577 | "userId": 10, 578 | "id": 95, 579 | "title": "id minus libero illum nam ad officiis", 580 | "body": "earum voluptatem facere provident blanditiis velit laboriosam\npariatur accusamus odio saepe\ncumque dolor qui a dicta ab doloribus consequatur omnis\ncorporis cupiditate eaque assumenda ad nesciunt" 581 | }, 582 | { 583 | "userId": 10, 584 | "id": 96, 585 | "title": "quaerat velit veniam amet cupiditate aut numquam ut sequi", 586 | "body": "in non odio excepturi sint eum\nlabore voluptates vitae quia qui et\ninventore itaque rerum\nveniam non exercitationem delectus aut" 587 | }, 588 | { 589 | "userId": 10, 590 | "id": 97, 591 | "title": "quas fugiat ut perspiciatis vero provident", 592 | "body": "eum non blanditiis soluta porro quibusdam voluptas\nvel voluptatem qui placeat dolores qui velit aut\nvel inventore aut cumque culpa explicabo aliquid at\nperspiciatis est et voluptatem dignissimos dolor itaque sit nam" 593 | }, 594 | { 595 | "userId": 10, 596 | "id": 98, 597 | "title": "laboriosam dolor voluptates", 598 | "body": "doloremque ex facilis sit sint culpa\nsoluta assumenda eligendi non ut eius\nsequi ducimus vel quasi\nveritatis est dolores" 599 | }, 600 | { 601 | "userId": 10, 602 | "id": 99, 603 | "title": "temporibus sit alias delectus eligendi possimus magni", 604 | "body": "quo deleniti praesentium dicta non quod\naut est molestias\nmolestias et officia quis nihil\nitaque dolorem quia" 605 | }, 606 | { 607 | "userId": 10, 608 | "id": 100, 609 | "title": "at nam consequatur ea labore ea harum", 610 | "body": "cupiditate quo est a modi nesciunt soluta\nipsa voluptas error itaque dicta in\nautem qui minus magnam et distinctio eum\naccusamus ratione error aut" 611 | } 612 | ] 613 | } 614 | }, 615 | { 616 | "description": "Create a new post.", 617 | "method": "POST", 618 | "url": "https://jsonplaceholder.typicode.com/posts", 619 | "headers": { "content-type": "application/json" }, 620 | "body": { "title": "foo", "body": "bar", "userId": 1 }, 621 | "response": { 622 | "status": 201, 623 | "data": { 624 | "title": "foo", 625 | "body": "bar", 626 | "userId": 1, 627 | "id": 101 628 | } 629 | } 630 | } 631 | ] 632 | } 633 | -------------------------------------------------------------------------------- /sample-requests/posts.dostman.json: -------------------------------------------------------------------------------- 1 | { 2 | "requests": [ 3 | { 4 | "description": "This will get user's info", 5 | "method": "GET", 6 | "url": "https://jsonplaceholder.typicode.com/posts", 7 | "headers": { "content-type": "application/json" }, 8 | "body": null, 9 | "response": { 10 | "status": 200, 11 | "data": [ 12 | { 13 | "userId": 1, 14 | "id": 1, 15 | "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", 16 | "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" 17 | }, 18 | { 19 | "userId": 1, 20 | "id": 2, 21 | "title": "qui est esse", 22 | "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla" 23 | }, 24 | { 25 | "userId": 1, 26 | "id": 3, 27 | "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut", 28 | "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut" 29 | }, 30 | { 31 | "userId": 1, 32 | "id": 4, 33 | "title": "eum et est occaecati", 34 | "body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit" 35 | }, 36 | { 37 | "userId": 1, 38 | "id": 5, 39 | "title": "nesciunt quas odio", 40 | "body": "repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque" 41 | }, 42 | { 43 | "userId": 1, 44 | "id": 6, 45 | "title": "dolorem eum magni eos aperiam quia", 46 | "body": "ut aspernatur corporis harum nihil quis provident sequi\nmollitia nobis aliquid molestiae\nperspiciatis et ea nemo ab reprehenderit accusantium quas\nvoluptate dolores velit et doloremque molestiae" 47 | }, 48 | { 49 | "userId": 1, 50 | "id": 7, 51 | "title": "magnam facilis autem", 52 | "body": "dolore placeat quibusdam ea quo vitae\nmagni quis enim qui quis quo nemo aut saepe\nquidem repellat excepturi ut quia\nsunt ut sequi eos ea sed quas" 53 | }, 54 | { 55 | "userId": 1, 56 | "id": 8, 57 | "title": "dolorem dolore est ipsam", 58 | "body": "dignissimos aperiam dolorem qui eum\nfacilis quibusdam animi sint suscipit qui sint possimus cum\nquaerat magni maiores excepturi\nipsam ut commodi dolor voluptatum modi aut vitae" 59 | }, 60 | { 61 | "userId": 1, 62 | "id": 9, 63 | "title": "nesciunt iure omnis dolorem tempora et accusantium", 64 | "body": "consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas" 65 | }, 66 | { 67 | "userId": 1, 68 | "id": 10, 69 | "title": "optio molestias id quia eum", 70 | "body": "quo et expedita modi cum officia vel magni\ndoloribus qui repudiandae\nvero nisi sit\nquos veniam quod sed accusamus veritatis error" 71 | }, 72 | { 73 | "userId": 2, 74 | "id": 11, 75 | "title": "et ea vero quia laudantium autem", 76 | "body": "delectus reiciendis molestiae occaecati non minima eveniet qui voluptatibus\naccusamus in eum beatae sit\nvel qui neque voluptates ut commodi qui incidunt\nut animi commodi" 77 | }, 78 | { 79 | "userId": 2, 80 | "id": 12, 81 | "title": "in quibusdam tempore odit est dolorem", 82 | "body": "itaque id aut magnam\npraesentium quia et ea odit et ea voluptas et\nsapiente quia nihil amet occaecati quia id voluptatem\nincidunt ea est distinctio odio" 83 | }, 84 | { 85 | "userId": 2, 86 | "id": 13, 87 | "title": "dolorum ut in voluptas mollitia et saepe quo animi", 88 | "body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque\niste corrupti reiciendis voluptatem eius rerum\nsit cumque quod eligendi laborum minima\nperferendis recusandae assumenda consectetur porro architecto ipsum ipsam" 89 | }, 90 | { 91 | "userId": 2, 92 | "id": 14, 93 | "title": "voluptatem eligendi optio", 94 | "body": "fuga et accusamus dolorum perferendis illo voluptas\nnon doloremque neque facere\nad qui dolorum molestiae beatae\nsed aut voluptas totam sit illum" 95 | }, 96 | { 97 | "userId": 2, 98 | "id": 15, 99 | "title": "eveniet quod temporibus", 100 | "body": "reprehenderit quos placeat\nvelit minima officia dolores impedit repudiandae molestiae nam\nvoluptas recusandae quis delectus\nofficiis harum fugiat vitae" 101 | }, 102 | { 103 | "userId": 2, 104 | "id": 16, 105 | "title": "sint suscipit perspiciatis velit dolorum rerum ipsa laboriosam odio", 106 | "body": "suscipit nam nisi quo aperiam aut\nasperiores eos fugit maiores voluptatibus quia\nvoluptatem quis ullam qui in alias quia est\nconsequatur magni mollitia accusamus ea nisi voluptate dicta" 107 | }, 108 | { 109 | "userId": 2, 110 | "id": 17, 111 | "title": "fugit voluptas sed molestias voluptatem provident", 112 | "body": "eos voluptas et aut odit natus earum\naspernatur fuga molestiae ullam\ndeserunt ratione qui eos\nqui nihil ratione nemo velit ut aut id quo" 113 | }, 114 | { 115 | "userId": 2, 116 | "id": 18, 117 | "title": "voluptate et itaque vero tempora molestiae", 118 | "body": "eveniet quo quis\nlaborum totam consequatur non dolor\nut et est repudiandae\nest voluptatem vel debitis et magnam" 119 | }, 120 | { 121 | "userId": 2, 122 | "id": 19, 123 | "title": "adipisci placeat illum aut reiciendis qui", 124 | "body": "illum quis cupiditate provident sit magnam\nea sed aut omnis\nveniam maiores ullam consequatur atque\nadipisci quo iste expedita sit quos voluptas" 125 | }, 126 | { 127 | "userId": 2, 128 | "id": 20, 129 | "title": "doloribus ad provident suscipit at", 130 | "body": "qui consequuntur ducimus possimus quisquam amet similique\nsuscipit porro ipsam amet\neos veritatis officiis exercitationem vel fugit aut necessitatibus totam\nomnis rerum consequatur expedita quidem cumque explicabo" 131 | }, 132 | { 133 | "userId": 3, 134 | "id": 21, 135 | "title": "asperiores ea ipsam voluptatibus modi minima quia sint", 136 | "body": "repellat aliquid praesentium dolorem quo\nsed totam minus non itaque\nnihil labore molestiae sunt dolor eveniet hic recusandae veniam\ntempora et tenetur expedita sunt" 137 | }, 138 | { 139 | "userId": 3, 140 | "id": 22, 141 | "title": "dolor sint quo a velit explicabo quia nam", 142 | "body": "eos qui et ipsum ipsam suscipit aut\nsed omnis non odio\nexpedita earum mollitia molestiae aut atque rem suscipit\nnam impedit esse" 143 | }, 144 | { 145 | "userId": 3, 146 | "id": 23, 147 | "title": "maxime id vitae nihil numquam", 148 | "body": "veritatis unde neque eligendi\nquae quod architecto quo neque vitae\nest illo sit tempora doloremque fugit quod\net et vel beatae sequi ullam sed tenetur perspiciatis" 149 | }, 150 | { 151 | "userId": 3, 152 | "id": 24, 153 | "title": "autem hic labore sunt dolores incidunt", 154 | "body": "enim et ex nulla\nomnis voluptas quia qui\nvoluptatem consequatur numquam aliquam sunt\ntotam recusandae id dignissimos aut sed asperiores deserunt" 155 | }, 156 | { 157 | "userId": 3, 158 | "id": 25, 159 | "title": "rem alias distinctio quo quis", 160 | "body": "ullam consequatur ut\nomnis quis sit vel consequuntur\nipsa eligendi ipsum molestiae et omnis error nostrum\nmolestiae illo tempore quia et distinctio" 161 | }, 162 | { 163 | "userId": 3, 164 | "id": 26, 165 | "title": "est et quae odit qui non", 166 | "body": "similique esse doloribus nihil accusamus\nomnis dolorem fuga consequuntur reprehenderit fugit recusandae temporibus\nperspiciatis cum ut laudantium\nomnis aut molestiae vel vero" 167 | }, 168 | { 169 | "userId": 3, 170 | "id": 27, 171 | "title": "quasi id et eos tenetur aut quo autem", 172 | "body": "eum sed dolores ipsam sint possimus debitis occaecati\ndebitis qui qui et\nut placeat enim earum aut odit facilis\nconsequatur suscipit necessitatibus rerum sed inventore temporibus consequatur" 173 | }, 174 | { 175 | "userId": 3, 176 | "id": 28, 177 | "title": "delectus ullam et corporis nulla voluptas sequi", 178 | "body": "non et quaerat ex quae ad maiores\nmaiores recusandae totam aut blanditiis mollitia quas illo\nut voluptatibus voluptatem\nsimilique nostrum eum" 179 | }, 180 | { 181 | "userId": 3, 182 | "id": 29, 183 | "title": "iusto eius quod necessitatibus culpa ea", 184 | "body": "odit magnam ut saepe sed non qui\ntempora atque nihil\naccusamus illum doloribus illo dolor\neligendi repudiandae odit magni similique sed cum maiores" 185 | }, 186 | { 187 | "userId": 3, 188 | "id": 30, 189 | "title": "a quo magni similique perferendis", 190 | "body": "alias dolor cumque\nimpedit blanditiis non eveniet odio maxime\nblanditiis amet eius quis tempora quia autem rem\na provident perspiciatis quia" 191 | }, 192 | { 193 | "userId": 4, 194 | "id": 31, 195 | "title": "ullam ut quidem id aut vel consequuntur", 196 | "body": "debitis eius sed quibusdam non quis consectetur vitae\nimpedit ut qui consequatur sed aut in\nquidem sit nostrum et maiores adipisci atque\nquaerat voluptatem adipisci repudiandae" 197 | }, 198 | { 199 | "userId": 4, 200 | "id": 32, 201 | "title": "doloremque illum aliquid sunt", 202 | "body": "deserunt eos nobis asperiores et hic\nest debitis repellat molestiae optio\nnihil ratione ut eos beatae quibusdam distinctio maiores\nearum voluptates et aut adipisci ea maiores voluptas maxime" 203 | }, 204 | { 205 | "userId": 4, 206 | "id": 33, 207 | "title": "qui explicabo molestiae dolorem", 208 | "body": "rerum ut et numquam laborum odit est sit\nid qui sint in\nquasi tenetur tempore aperiam et quaerat qui in\nrerum officiis sequi cumque quod" 209 | }, 210 | { 211 | "userId": 4, 212 | "id": 34, 213 | "title": "magnam ut rerum iure", 214 | "body": "ea velit perferendis earum ut voluptatem voluptate itaque iusto\ntotam pariatur in\nnemo voluptatem voluptatem autem magni tempora minima in\nest distinctio qui assumenda accusamus dignissimos officia nesciunt nobis" 215 | }, 216 | { 217 | "userId": 4, 218 | "id": 35, 219 | "title": "id nihil consequatur molestias animi provident", 220 | "body": "nisi error delectus possimus ut eligendi vitae\nplaceat eos harum cupiditate facilis reprehenderit voluptatem beatae\nmodi ducimus quo illum voluptas eligendi\net nobis quia fugit" 221 | }, 222 | { 223 | "userId": 4, 224 | "id": 36, 225 | "title": "fuga nam accusamus voluptas reiciendis itaque", 226 | "body": "ad mollitia et omnis minus architecto odit\nvoluptas doloremque maxime aut non ipsa qui alias veniam\nblanditiis culpa aut quia nihil cumque facere et occaecati\nqui aspernatur quia eaque ut aperiam inventore" 227 | }, 228 | { 229 | "userId": 4, 230 | "id": 37, 231 | "title": "provident vel ut sit ratione est", 232 | "body": "debitis et eaque non officia sed nesciunt pariatur vel\nvoluptatem iste vero et ea\nnumquam aut expedita ipsum nulla in\nvoluptates omnis consequatur aut enim officiis in quam qui" 233 | }, 234 | { 235 | "userId": 4, 236 | "id": 38, 237 | "title": "explicabo et eos deleniti nostrum ab id repellendus", 238 | "body": "animi esse sit aut sit nesciunt assumenda eum voluptas\nquia voluptatibus provident quia necessitatibus ea\nrerum repudiandae quia voluptatem delectus fugit aut id quia\nratione optio eos iusto veniam iure" 239 | }, 240 | { 241 | "userId": 4, 242 | "id": 39, 243 | "title": "eos dolorem iste accusantium est eaque quam", 244 | "body": "corporis rerum ducimus vel eum accusantium\nmaxime aspernatur a porro possimus iste omnis\nest in deleniti asperiores fuga aut\nvoluptas sapiente vel dolore minus voluptatem incidunt ex" 245 | }, 246 | { 247 | "userId": 4, 248 | "id": 40, 249 | "title": "enim quo cumque", 250 | "body": "ut voluptatum aliquid illo tenetur nemo sequi quo facilis\nipsum rem optio mollitia quas\nvoluptatem eum voluptas qui\nunde omnis voluptatem iure quasi maxime voluptas nam" 251 | }, 252 | { 253 | "userId": 5, 254 | "id": 41, 255 | "title": "non est facere", 256 | "body": "molestias id nostrum\nexcepturi molestiae dolore omnis repellendus quaerat saepe\nconsectetur iste quaerat tenetur asperiores accusamus ex ut\nnam quidem est ducimus sunt debitis saepe" 257 | }, 258 | { 259 | "userId": 5, 260 | "id": 42, 261 | "title": "commodi ullam sint et excepturi error explicabo praesentium voluptas", 262 | "body": "odio fugit voluptatum ducimus earum autem est incidunt voluptatem\nodit reiciendis aliquam sunt sequi nulla dolorem\nnon facere repellendus voluptates quia\nratione harum vitae ut" 263 | }, 264 | { 265 | "userId": 5, 266 | "id": 43, 267 | "title": "eligendi iste nostrum consequuntur adipisci praesentium sit beatae perferendis", 268 | "body": "similique fugit est\nillum et dolorum harum et voluptate eaque quidem\nexercitationem quos nam commodi possimus cum odio nihil nulla\ndolorum exercitationem magnam ex et a et distinctio debitis" 269 | }, 270 | { 271 | "userId": 5, 272 | "id": 44, 273 | "title": "optio dolor molestias sit", 274 | "body": "temporibus est consectetur dolore\net libero debitis vel velit laboriosam quia\nipsum quibusdam qui itaque fuga rem aut\nea et iure quam sed maxime ut distinctio quae" 275 | }, 276 | { 277 | "userId": 5, 278 | "id": 45, 279 | "title": "ut numquam possimus omnis eius suscipit laudantium iure", 280 | "body": "est natus reiciendis nihil possimus aut provident\nex et dolor\nrepellat pariatur est\nnobis rerum repellendus dolorem autem" 281 | }, 282 | { 283 | "userId": 5, 284 | "id": 46, 285 | "title": "aut quo modi neque nostrum ducimus", 286 | "body": "voluptatem quisquam iste\nvoluptatibus natus officiis facilis dolorem\nquis quas ipsam\nvel et voluptatum in aliquid" 287 | }, 288 | { 289 | "userId": 5, 290 | "id": 47, 291 | "title": "quibusdam cumque rem aut deserunt", 292 | "body": "voluptatem assumenda ut qui ut cupiditate aut impedit veniam\noccaecati nemo illum voluptatem laudantium\nmolestiae beatae rerum ea iure soluta nostrum\neligendi et voluptate" 293 | }, 294 | { 295 | "userId": 5, 296 | "id": 48, 297 | "title": "ut voluptatem illum ea doloribus itaque eos", 298 | "body": "voluptates quo voluptatem facilis iure occaecati\nvel assumenda rerum officia et\nillum perspiciatis ab deleniti\nlaudantium repellat ad ut et autem reprehenderit" 299 | }, 300 | { 301 | "userId": 5, 302 | "id": 49, 303 | "title": "laborum non sunt aut ut assumenda perspiciatis voluptas", 304 | "body": "inventore ab sint\nnatus fugit id nulla sequi architecto nihil quaerat\neos tenetur in in eum veritatis non\nquibusdam officiis aspernatur cumque aut commodi aut" 305 | }, 306 | { 307 | "userId": 5, 308 | "id": 50, 309 | "title": "repellendus qui recusandae incidunt voluptates tenetur qui omnis exercitationem", 310 | "body": "error suscipit maxime adipisci consequuntur recusandae\nvoluptas eligendi et est et voluptates\nquia distinctio ab amet quaerat molestiae et vitae\nadipisci impedit sequi nesciunt quis consectetur" 311 | }, 312 | { 313 | "userId": 6, 314 | "id": 51, 315 | "title": "soluta aliquam aperiam consequatur illo quis voluptas", 316 | "body": "sunt dolores aut doloribus\ndolore doloribus voluptates tempora et\ndoloremque et quo\ncum asperiores sit consectetur dolorem" 317 | }, 318 | { 319 | "userId": 6, 320 | "id": 52, 321 | "title": "qui enim et consequuntur quia animi quis voluptate quibusdam", 322 | "body": "iusto est quibusdam fuga quas quaerat molestias\na enim ut sit accusamus enim\ntemporibus iusto accusantium provident architecto\nsoluta esse reprehenderit qui laborum" 323 | }, 324 | { 325 | "userId": 6, 326 | "id": 53, 327 | "title": "ut quo aut ducimus alias", 328 | "body": "minima harum praesentium eum rerum illo dolore\nquasi exercitationem rerum nam\nporro quis neque quo\nconsequatur minus dolor quidem veritatis sunt non explicabo similique" 329 | }, 330 | { 331 | "userId": 6, 332 | "id": 54, 333 | "title": "sit asperiores ipsam eveniet odio non quia", 334 | "body": "totam corporis dignissimos\nvitae dolorem ut occaecati accusamus\nex velit deserunt\net exercitationem vero incidunt corrupti mollitia" 335 | }, 336 | { 337 | "userId": 6, 338 | "id": 55, 339 | "title": "sit vel voluptatem et non libero", 340 | "body": "debitis excepturi ea perferendis harum libero optio\neos accusamus cum fuga ut sapiente repudiandae\net ut incidunt omnis molestiae\nnihil ut eum odit" 341 | }, 342 | { 343 | "userId": 6, 344 | "id": 56, 345 | "title": "qui et at rerum necessitatibus", 346 | "body": "aut est omnis dolores\nneque rerum quod ea rerum velit pariatur beatae excepturi\net provident voluptas corrupti\ncorporis harum reprehenderit dolores eligendi" 347 | }, 348 | { 349 | "userId": 6, 350 | "id": 57, 351 | "title": "sed ab est est", 352 | "body": "at pariatur consequuntur earum quidem\nquo est laudantium soluta voluptatem\nqui ullam et est\net cum voluptas voluptatum repellat est" 353 | }, 354 | { 355 | "userId": 6, 356 | "id": 58, 357 | "title": "voluptatum itaque dolores nisi et quasi", 358 | "body": "veniam voluptatum quae adipisci id\net id quia eos ad et dolorem\naliquam quo nisi sunt eos impedit error\nad similique veniam" 359 | }, 360 | { 361 | "userId": 6, 362 | "id": 59, 363 | "title": "qui commodi dolor at maiores et quis id accusantium", 364 | "body": "perspiciatis et quam ea autem temporibus non voluptatibus qui\nbeatae a earum officia nesciunt dolores suscipit voluptas et\nanimi doloribus cum rerum quas et magni\net hic ut ut commodi expedita sunt" 365 | }, 366 | { 367 | "userId": 6, 368 | "id": 60, 369 | "title": "consequatur placeat omnis quisquam quia reprehenderit fugit veritatis facere", 370 | "body": "asperiores sunt ab assumenda cumque modi velit\nqui esse omnis\nvoluptate et fuga perferendis voluptas\nillo ratione amet aut et omnis" 371 | }, 372 | { 373 | "userId": 7, 374 | "id": 61, 375 | "title": "voluptatem doloribus consectetur est ut ducimus", 376 | "body": "ab nemo optio odio\ndelectus tenetur corporis similique nobis repellendus rerum omnis facilis\nvero blanditiis debitis in nesciunt doloribus dicta dolores\nmagnam minus velit" 377 | }, 378 | { 379 | "userId": 7, 380 | "id": 62, 381 | "title": "beatae enim quia vel", 382 | "body": "enim aspernatur illo distinctio quae praesentium\nbeatae alias amet delectus qui voluptate distinctio\nodit sint accusantium autem omnis\nquo molestiae omnis ea eveniet optio" 383 | }, 384 | { 385 | "userId": 7, 386 | "id": 63, 387 | "title": "voluptas blanditiis repellendus animi ducimus error sapiente et suscipit", 388 | "body": "enim adipisci aspernatur nemo\nnumquam omnis facere dolorem dolor ex quis temporibus incidunt\nab delectus culpa quo reprehenderit blanditiis asperiores\naccusantium ut quam in voluptatibus voluptas ipsam dicta" 389 | }, 390 | { 391 | "userId": 7, 392 | "id": 64, 393 | "title": "et fugit quas eum in in aperiam quod", 394 | "body": "id velit blanditiis\neum ea voluptatem\nmolestiae sint occaecati est eos perspiciatis\nincidunt a error provident eaque aut aut qui" 395 | }, 396 | { 397 | "userId": 7, 398 | "id": 65, 399 | "title": "consequatur id enim sunt et et", 400 | "body": "voluptatibus ex esse\nsint explicabo est aliquid cumque adipisci fuga repellat labore\nmolestiae corrupti ex saepe at asperiores et perferendis\nnatus id esse incidunt pariatur" 401 | }, 402 | { 403 | "userId": 7, 404 | "id": 66, 405 | "title": "repudiandae ea animi iusto", 406 | "body": "officia veritatis tenetur vero qui itaque\nsint non ratione\nsed et ut asperiores iusto eos molestiae nostrum\nveritatis quibusdam et nemo iusto saepe" 407 | }, 408 | { 409 | "userId": 7, 410 | "id": 67, 411 | "title": "aliquid eos sed fuga est maxime repellendus", 412 | "body": "reprehenderit id nostrum\nvoluptas doloremque pariatur sint et accusantium quia quod aspernatur\net fugiat amet\nnon sapiente et consequatur necessitatibus molestiae" 413 | }, 414 | { 415 | "userId": 7, 416 | "id": 68, 417 | "title": "odio quis facere architecto reiciendis optio", 418 | "body": "magnam molestiae perferendis quisquam\nqui cum reiciendis\nquaerat animi amet hic inventore\nea quia deleniti quidem saepe porro velit" 419 | }, 420 | { 421 | "userId": 7, 422 | "id": 69, 423 | "title": "fugiat quod pariatur odit minima", 424 | "body": "officiis error culpa consequatur modi asperiores et\ndolorum assumenda voluptas et vel qui aut vel rerum\nvoluptatum quisquam perspiciatis quia rerum consequatur totam quas\nsequi commodi repudiandae asperiores et saepe a" 425 | }, 426 | { 427 | "userId": 7, 428 | "id": 70, 429 | "title": "voluptatem laborum magni", 430 | "body": "sunt repellendus quae\nest asperiores aut deleniti esse accusamus repellendus quia aut\nquia dolorem unde\neum tempora esse dolore" 431 | }, 432 | { 433 | "userId": 8, 434 | "id": 71, 435 | "title": "et iusto veniam et illum aut fuga", 436 | "body": "occaecati a doloribus\niste saepe consectetur placeat eum voluptate dolorem et\nqui quo quia voluptas\nrerum ut id enim velit est perferendis" 437 | }, 438 | { 439 | "userId": 8, 440 | "id": 72, 441 | "title": "sint hic doloribus consequatur eos non id", 442 | "body": "quam occaecati qui deleniti consectetur\nconsequatur aut facere quas exercitationem aliquam hic voluptas\nneque id sunt ut aut accusamus\nsunt consectetur expedita inventore velit" 443 | }, 444 | { 445 | "userId": 8, 446 | "id": 73, 447 | "title": "consequuntur deleniti eos quia temporibus ab aliquid at", 448 | "body": "voluptatem cumque tenetur consequatur expedita ipsum nemo quia explicabo\naut eum minima consequatur\ntempore cumque quae est et\net in consequuntur voluptatem voluptates aut" 449 | }, 450 | { 451 | "userId": 8, 452 | "id": 74, 453 | "title": "enim unde ratione doloribus quas enim ut sit sapiente", 454 | "body": "odit qui et et necessitatibus sint veniam\nmollitia amet doloremque molestiae commodi similique magnam et quam\nblanditiis est itaque\nquo et tenetur ratione occaecati molestiae tempora" 455 | }, 456 | { 457 | "userId": 8, 458 | "id": 75, 459 | "title": "dignissimos eum dolor ut enim et delectus in", 460 | "body": "commodi non non omnis et voluptas sit\nautem aut nobis magnam et sapiente voluptatem\net laborum repellat qui delectus facilis temporibus\nrerum amet et nemo voluptate expedita adipisci error dolorem" 461 | }, 462 | { 463 | "userId": 8, 464 | "id": 76, 465 | "title": "doloremque officiis ad et non perferendis", 466 | "body": "ut animi facere\ntotam iusto tempore\nmolestiae eum aut et dolorem aperiam\nquaerat recusandae totam odio" 467 | }, 468 | { 469 | "userId": 8, 470 | "id": 77, 471 | "title": "necessitatibus quasi exercitationem odio", 472 | "body": "modi ut in nulla repudiandae dolorum nostrum eos\naut consequatur omnis\nut incidunt est omnis iste et quam\nvoluptates sapiente aliquam asperiores nobis amet corrupti repudiandae provident" 473 | }, 474 | { 475 | "userId": 8, 476 | "id": 78, 477 | "title": "quam voluptatibus rerum veritatis", 478 | "body": "nobis facilis odit tempore cupiditate quia\nassumenda doloribus rerum qui ea\nillum et qui totam\naut veniam repellendus" 479 | }, 480 | { 481 | "userId": 8, 482 | "id": 79, 483 | "title": "pariatur consequatur quia magnam autem omnis non amet", 484 | "body": "libero accusantium et et facere incidunt sit dolorem\nnon excepturi qui quia sed laudantium\nquisquam molestiae ducimus est\nofficiis esse molestiae iste et quos" 485 | }, 486 | { 487 | "userId": 8, 488 | "id": 80, 489 | "title": "labore in ex et explicabo corporis aut quas", 490 | "body": "ex quod dolorem ea eum iure qui provident amet\nquia qui facere excepturi et repudiandae\nasperiores molestias provident\nminus incidunt vero fugit rerum sint sunt excepturi provident" 491 | }, 492 | { 493 | "userId": 9, 494 | "id": 81, 495 | "title": "tempora rem veritatis voluptas quo dolores vero", 496 | "body": "facere qui nesciunt est voluptatum voluptatem nisi\nsequi eligendi necessitatibus ea at rerum itaque\nharum non ratione velit laboriosam quis consequuntur\nex officiis minima doloremque voluptas ut aut" 497 | }, 498 | { 499 | "userId": 9, 500 | "id": 82, 501 | "title": "laudantium voluptate suscipit sunt enim enim", 502 | "body": "ut libero sit aut totam inventore sunt\nporro sint qui sunt molestiae\nconsequatur cupiditate qui iste ducimus adipisci\ndolor enim assumenda soluta laboriosam amet iste delectus hic" 503 | }, 504 | { 505 | "userId": 9, 506 | "id": 83, 507 | "title": "odit et voluptates doloribus alias odio et", 508 | "body": "est molestiae facilis quis tempora numquam nihil qui\nvoluptate sapiente consequatur est qui\nnecessitatibus autem aut ipsa aperiam modi dolore numquam\nreprehenderit eius rem quibusdam" 509 | }, 510 | { 511 | "userId": 9, 512 | "id": 84, 513 | "title": "optio ipsam molestias necessitatibus occaecati facilis veritatis dolores aut", 514 | "body": "sint molestiae magni a et quos\neaque et quasi\nut rerum debitis similique veniam\nrecusandae dignissimos dolor incidunt consequatur odio" 515 | }, 516 | { 517 | "userId": 9, 518 | "id": 85, 519 | "title": "dolore veritatis porro provident adipisci blanditiis et sunt", 520 | "body": "similique sed nisi voluptas iusto omnis\nmollitia et quo\nassumenda suscipit officia magnam sint sed tempora\nenim provident pariatur praesentium atque animi amet ratione" 521 | }, 522 | { 523 | "userId": 9, 524 | "id": 86, 525 | "title": "placeat quia et porro iste", 526 | "body": "quasi excepturi consequatur iste autem temporibus sed molestiae beatae\net quaerat et esse ut\nvoluptatem occaecati et vel explicabo autem\nasperiores pariatur deserunt optio" 527 | }, 528 | { 529 | "userId": 9, 530 | "id": 87, 531 | "title": "nostrum quis quasi placeat", 532 | "body": "eos et molestiae\nnesciunt ut a\ndolores perspiciatis repellendus repellat aliquid\nmagnam sint rem ipsum est" 533 | }, 534 | { 535 | "userId": 9, 536 | "id": 88, 537 | "title": "sapiente omnis fugit eos", 538 | "body": "consequatur omnis est praesentium\nducimus non iste\nneque hic deserunt\nvoluptatibus veniam cum et rerum sed" 539 | }, 540 | { 541 | "userId": 9, 542 | "id": 89, 543 | "title": "sint soluta et vel magnam aut ut sed qui", 544 | "body": "repellat aut aperiam totam temporibus autem et\narchitecto magnam ut\nconsequatur qui cupiditate rerum quia soluta dignissimos nihil iure\ntempore quas est" 545 | }, 546 | { 547 | "userId": 9, 548 | "id": 90, 549 | "title": "ad iusto omnis odit dolor voluptatibus", 550 | "body": "minus omnis soluta quia\nqui sed adipisci voluptates illum ipsam voluptatem\neligendi officia ut in\neos soluta similique molestias praesentium blanditiis" 551 | }, 552 | { 553 | "userId": 10, 554 | "id": 91, 555 | "title": "aut amet sed", 556 | "body": "libero voluptate eveniet aperiam sed\nsunt placeat suscipit molestias\nsimilique fugit nam natus\nexpedita consequatur consequatur dolores quia eos et placeat" 557 | }, 558 | { 559 | "userId": 10, 560 | "id": 92, 561 | "title": "ratione ex tenetur perferendis", 562 | "body": "aut et excepturi dicta laudantium sint rerum nihil\nlaudantium et at\na neque minima officia et similique libero et\ncommodi voluptate qui" 563 | }, 564 | { 565 | "userId": 10, 566 | "id": 93, 567 | "title": "beatae soluta recusandae", 568 | "body": "dolorem quibusdam ducimus consequuntur dicta aut quo laboriosam\nvoluptatem quis enim recusandae ut sed sunt\nnostrum est odit totam\nsit error sed sunt eveniet provident qui nulla" 569 | }, 570 | { 571 | "userId": 10, 572 | "id": 94, 573 | "title": "qui qui voluptates illo iste minima", 574 | "body": "aspernatur expedita soluta quo ab ut similique\nexpedita dolores amet\nsed temporibus distinctio magnam saepe deleniti\nomnis facilis nam ipsum natus sint similique omnis" 575 | }, 576 | { 577 | "userId": 10, 578 | "id": 95, 579 | "title": "id minus libero illum nam ad officiis", 580 | "body": "earum voluptatem facere provident blanditiis velit laboriosam\npariatur accusamus odio saepe\ncumque dolor qui a dicta ab doloribus consequatur omnis\ncorporis cupiditate eaque assumenda ad nesciunt" 581 | }, 582 | { 583 | "userId": 10, 584 | "id": 96, 585 | "title": "quaerat velit veniam amet cupiditate aut numquam ut sequi", 586 | "body": "in non odio excepturi sint eum\nlabore voluptates vitae quia qui et\ninventore itaque rerum\nveniam non exercitationem delectus aut" 587 | }, 588 | { 589 | "userId": 10, 590 | "id": 97, 591 | "title": "quas fugiat ut perspiciatis vero provident", 592 | "body": "eum non blanditiis soluta porro quibusdam voluptas\nvel voluptatem qui placeat dolores qui velit aut\nvel inventore aut cumque culpa explicabo aliquid at\nperspiciatis est et voluptatem dignissimos dolor itaque sit nam" 593 | }, 594 | { 595 | "userId": 10, 596 | "id": 98, 597 | "title": "laboriosam dolor voluptates", 598 | "body": "doloremque ex facilis sit sint culpa\nsoluta assumenda eligendi non ut eius\nsequi ducimus vel quasi\nveritatis est dolores" 599 | }, 600 | { 601 | "userId": 10, 602 | "id": 99, 603 | "title": "temporibus sit alias delectus eligendi possimus magni", 604 | "body": "quo deleniti praesentium dicta non quod\naut est molestias\nmolestias et officia quis nihil\nitaque dolorem quia" 605 | }, 606 | { 607 | "userId": 10, 608 | "id": 100, 609 | "title": "at nam consequatur ea labore ea harum", 610 | "body": "cupiditate quo est a modi nesciunt soluta\nipsa voluptas error itaque dicta in\nautem qui minus magnam et distinctio eum\naccusamus ratione error aut" 611 | } 612 | ] 613 | } 614 | }, 615 | { 616 | "description": "Get posts by id.", 617 | "method": "GET", 618 | "url": "https://jsonplaceholder.typicode.com/posts/1", 619 | "headers": { "content-type": "application/json" }, 620 | "body": null, 621 | "response": { 622 | "status": 200, 623 | "data": { 624 | "userId": 1, 625 | "id": 1, 626 | "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", 627 | "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" 628 | } 629 | } 630 | }, 631 | { 632 | "description": "Create a new post.", 633 | "method": "POST", 634 | "url": "https://jsonplaceholder.typicode.com/posts", 635 | "headers": { "content-type": "application/json" }, 636 | "body": { "title": "foo", "body": "bar", "userId": 1 }, 637 | "response": { 638 | "status": 201, 639 | "data": { 640 | "title": "foo", 641 | "body": "bar", 642 | "userId": 1, 643 | "id": 101 644 | } 645 | } 646 | } 647 | ] 648 | } 649 | --------------------------------------------------------------------------------