# Type of request: This is a ...

[X ] bug report
[ ] feature request

# Detailed description
Calling PutEvents operation returns 500 if no `Detail` is specified. This case is similar to #3043

## Expected behavior
According to the doc https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEventsRequestEntry.html `Details` is optional. 

```
 Detail
    A valid JSON string. There is no other schema imposed. The JSON string may contain fields and nested subobjects.
    Type: String
    Required: No
```

So this should works and set `Detail` as `{}`

```
eb_client = boto3.client('events', endpoint_url='http://localhost:4587')
eb_client.put_events(
    Entries=[
        {
            'DetailType': 'Test'
        }
    ]
)
```

## Actual behavior
500 is returned

# Steps to reproduce

1. Start LocalStack with SERVICES=events
2. Run the client code

## Command used to start LocalStack

```
docker run --rm --name localstack -p 4587:4587 -e SERVICES=events -e DEBUG=true localstack/localstack
```

## Client code (AWS SDK code snippet, or sequence of "awslocal" commands)

CLI:

```
aws events put-events --endpoint-url http://localhost:4587 --entries '[{"DetailType": "Test"}]'
```

Or via python:

```
eb_client = boto3.client('events', endpoint_url='http://localhost:4587')
eb_client.put_events(
    Entries=[
        {
            'DetailType': 'Test',
            'Detail': '{}'
        }
    ]
)
```

executions = self.sfn_client.list_executions(stateMachineArn=state_machine_arn)['executions']
            self.assertGreaterEqual(len(executions), 1)
            
            self.assertGreaterEqual(len(events), 2)
            notifications = [event['Message'] for event in events if event['Type'] == 'Notification']
            self.assertGreaterEqual(len(notifications), 1)
            
            execution_arn = executions[0]['executionArn']
            execution_input = self.sfn_client.describe_execution(executionArn=execution_arn)['input']
            all_msgs = []
            
            for url in q_urls:
                msgs = self.sqs_client.receive_message(QueueUrl=url).get('Messages', [])
                self.assertGreaterEqual(len(msgs), 1)
                all_msgs.append(msgs[0])
            return execution_input, notifications[0], all_msgs
        execution_input, notification, msgs_received = retry(
            received, retries=5, sleep=15, q_urls=[queue_url, fifo_queue_url]
        )
        self.assertEqual(json.loads(notification), event)
        self.assertEqual(json.loads(execution_input), event)
        for msg_received in msgs_received:
            self.assertEqual(json.loads(msg_received['Body']), event)
        
        proxy.stop()
        self.cleanup(None, rule_name, target_ids=[topic_target_id, sm_target_id], queue_url=queue_url)
        self.sns_client.delete_topic(TopicArn=topic_arn)
        self.sfn_client.delete_state_machine(stateMachineArn=state_machine_arn)
    def test_put_events_with_target_firehose(self):