├── .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 |
6 | [](https://github.com/egecavusoglu/dostman/actions/workflows/main.yml)
7 |
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 |
--------------------------------------------------------------------------------