# Matching on Body

Use the `:body_as_json` request matcher to match requests on the request body where the body is JSON.

## Background ()

*Given* a previously recorded cassette file "cassettes/example.yml" with:

```
---
http_interactions:
- request:
    method: post
    uri: http://example.net/some/long/path
    body:
      encoding: UTF-8
      string: '{ "a" : "1" }'
    headers: {}
  response:
    status:
      code: 200
      message: OK
    headers:
      Content-Length:
      - "14"
    body:
      encoding: UTF-8
      string: body1 response
    http_version: "1.1"
  recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
- request:
    method: post
    uri: http://example.net/some/long/path
    body:
      encoding: UTF-8
      string: '{ "a" : "1", "b" : "2" }'
    headers: {}
  response:
    status:
      code: 200
      message: OK
    headers:
      Content-Length:
      - "14"
    body:
      encoding: UTF-8
      string: body2 response
    http_version: "1.1"
  recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
recorded_with: VCR 2.0.0
```

## Replay interaction that matches the body as JSON

*And* a file named "body\_as\_json\_matching.rb" with:

```
include_http_adapter_for("<http_lib>")

require 'vcr'

VCR.configure do |c|
  <configuration>
  c.cassette_library_dir = 'cassettes'
end

VCR.use_cassette('example', :match_requests_on => [:body_as_json]) do
  puts "Response for body as json 2: " + response_body_for(:put, "http://example.com/", '{ "a" : "1", "b" : "2" }')
end

VCR.use_cassette('example', :match_requests_on => [:body_as_json]) do
  puts "Response for body as json 1: " + response_body_for(:put, "http://example.com/", '{ "a" : "1" }')
end
```

*When* I run `ruby body_as_json_matching.rb`

*Then* it should pass with:

```
Response for body as json 2: body2 response
Response for body as json 1: body1 response
```

### Examples

| configuration          | http\_lib              |
| ---------------------- | ---------------------- |
| c.hook\_into :webmock  | net/http               |
| c.hook\_into :webmock  | httpclient             |
| c.hook\_into :webmock  | curb                   |
| c.hook\_into :webmock  | patron                 |
| c.hook\_into :webmock  | em-http-request        |
| c.hook\_into :webmock  | typhoeus               |
| c.hook\_into :typhoeus | typhoeus               |
| c.hook\_into :excon    | excon                  |
| c.hook\_into :faraday  | faraday (w/ net\_http) |
| c.hook\_into :faraday  | faraday (w/ typhoeus)  |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://andrewmcodes.gitbook.io/vcr/request_matching/body_as_json.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
