Учебник Spring - команда CURL для отправки JSON данных не работает - PullRequest
1 голос
/ 20 марта 2020

В настоящее время я работаю над учебником Spring по REST (весь учебник находится по адресу spring.io/guides/tutorials/rest/). Я уверен, что точно следовал руководству. У меня есть следующий код для EmployeeController:

package com.example.buildingrest;

import java.util.List;

import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
class EmployeeController {

    private final EmployeeRepository repository;

    EmployeeController(EmployeeRepository repository) {
        this.repository = repository;
    }

    // Aggregate root

    @GetMapping("/employees")
    List<Employee> all() {
        return repository.findAll();
    }

    @PostMapping("/employees")
    Employee newEmployee(@RequestBody Employee newEmployee) {
        return repository.save(newEmployee);
    }

    // Single item

    @GetMapping("/employees/{id}")
    Employee one(@PathVariable Long id) {

        return repository.findById(id)
            .orElseThrow(() -> new EmployeeNotFoundException(id));
    }

    @PutMapping("/employees/{id}")
    Employee replaceEmployee(@RequestBody Employee newEmployee, @PathVariable Long id) {

        return repository.findById(id)
                .map(employee -> {
                    employee.setName(newEmployee.getName());
                    employee.setRole(newEmployee.getRole());
                    return repository.save(employee);
                })
                .orElseGet(() -> {
                    newEmployee.setId(id);
                    return repository.save(newEmployee);
                });
    }

    @DeleteMapping("/employees/{id}")
    void deleteEmployee(@PathVariable Long id) {
        repository.deleteById(id);
    }
}

Когда я делаю команду CURL, чтобы получить всех сотрудников, я успешен, и когда я делаю команду CURL, чтобы получить одного сотрудника по идентификатору, я успешен. Проблема в том, когда я пытаюсь отправить нового сотрудника. Я использую следующую команду из учебника:

curl -X POST localhost:8080/employees -H 'Content-type:application/json' -d '{"name": "Samwise Gamgee", "role": "gardener"}'

Я получаю следующую ошибку:

{"timestamp":"2020-03-20T13:28:56.244+0000","status":415,"error":"Unsupported Media Type","message":"Content type 'application/x-www-form-urlencoded;charset=UTF-8' not
 supported","path":"/employees"}curl: (6) Could not resolve host: Samwise Gamgee,
curl: (6) Could not resolve host: role
curl: (3) [globbing] unmatched close brace/bracket in column 9

Что касается непревзойденной закрывающей скобки / скобки, я посмотрел на код и команду CURL вверх и вниз и не может найти его. Что касается Unsupported Media Type, я не понимаю, почему он указывает x- www-form-urlencoded, когда я использовал JSON для всего приложения. И я скопировал команду curl прямо из учебника.

Есть идеи, что не так?

1 Ответ

1 голос
/ 20 марта 2020

Таким образом, очевидно, что в учебнике Spring неправильно введена команда cURL. В нем говорится, что команда cURL должна быть:

curl -X POST localhost:8080/employees -H 'Content-type:application/json' -d '{"name": "Samwise Gamgee", "role": "gardener"}'

Когда на самом деле она должна быть:

curl -i -H "Content-Type: application/json" -X POST -d "{\"name\": \"Samwise Gamgee\", \"role\": \"gardener\"}" http://localhost:8080/employees
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...