React Post не показывает заголовок - PullRequest
1 голос
/ 22 февраля 2020

Исправлено: я изменил несколько вещей в go, поэтому я не могу точно сказать, что решило мою проблему, но в основном: - API нужен int или long, и я отправлял String .. parseInt решен Это. Первоначально я объявил объект данных:

const [data, setData] = useState({

})

Со всеми значениями, которые я собирался отправить позже (и с правильными типами данных! Если я не уверен, кажется, что null довольно хорошо работает для инициализации) , -Другая проблема заключалась в том, что я слил все свои данные в ловушку непосредственно перед моим POST-запросом, поскольку он асинхронный ... это плохая идея. -Наконец, но самое главное, и это, вероятно, было проблемой (благодаря EntiendoNull и JMadelaine), я инициализировал свои данные как [], а не как {}, поэтому я отправлял объект внутри массива .. отсюда JSON parse error: Cannot deserialize instance of сообщение в API, когда я POST. .---------------------------------------------- -------------------------------------------------- ----------------------------------.

У меня проблема с сообщением запрос не работает должным образом.

По сути, заголовок неверен, он должен быть {"content-type": "application/json"} Но вместо этого это пустой объект. Вот где я делаю POST:

const [data, setData] = useState([]);
    const createMission = async (e) => {
        setData({
            ...data,
            nom:state.missionName,
            id_client:state.currentClientKey,
            id_consultant:state.currentConsultantId,
            id_manager:1,
            id_ro:state.currentROKey,
            id_rc:state.currentRCKey,
            detail:state.missionDescription,
            adresse:state.adresse,
            frequence_eval:6,
            date_debut:state.startDate,
            date_fin:state.endDate,
            metier:state.metier
        });
        let headers = {
          headers: {'Content-Type': 'application/json'}
        };
        axios.post('http://localhost:8080/mission',data,{"headers" : headers})
        .then(res => {
            console.log(res);
        });

Вот содержимое res на консоли моего навигатора:

   {…}
    ​
    config: Object { url: "http://localhost:8080/mission", method: "post", data: "{\"nom\":\"\",\"id_consultant\":null,\"id_manager\":1,\"detail\":\"\",\"adresse\":\"\",\"frequence_eval\":6,\"date_debut\":null,\"date_fin\":null,\"metier\":null}", … }
    ​
    data: ""
    ​
    headers: Object {  }
    ​
    request: XMLHttpRequest { readyState: 4, timeout: 0, withCredentials: false, … }
    ​
    status: 200
    ​
    statusText: ""
    ​
    <prototype>: Object { … }

Данные отправляются нормально, я получаю 200 статус назад, но, как вы можете видеть, заголовки содержат пустой объект, а данные представляют собой пустую строку "".

Забавно, я делаю почти то же самое с другим компонентом, и он работает просто отлично: в этом случае я даже не указываю заголовки.

const createClient = async (e) => {
        axios.post('http://localhost:8080/client', {nom:state.nomClient})
        .then(res => {
            console.log(res);
        });
    };

А вот журнал:

 {…}
    ​
    config: Object { url: "http://localhost:8080/client", method: "post", data: "{\"nom\":\"aze\"}", … }
    ​
    data: Object { id: 372, nom: "aze" }
    ​
    headers: Object { "content-type": "application/json" }
    ​
    request: XMLHttpRequest { readyState: 4, timeout: 0, withCredentials: false, … }
    ​
    status: 200
    ​
    statusText: ""
    ​
    <prototype>: Object { … }

API такой же, он @RequestBody. Вот для миссии:

@PostMapping
    public Mission addMission (@RequestBody MissionBean missionBean){
        Optional<Client> optionalClient = clientRepository.findById(missionBean.id_client);
        Optional<Consultant> optionalConsultant = consultantRepository.findById(missionBean.id_consultant);
        Optional<Utilisateur> optionalManager = utilisateurRepository.findById(missionBean.id_manager);
        Optional<Utilisateur> optionalRo = utilisateurRepository.findById(missionBean.id_ro);
        Optional<Utilisateur> optionalRc = utilisateurRepository.findById(missionBean.id_rc);
        if (optionalClient.isPresent() && optionalManager.isPresent() && optionalConsultant.isPresent() && optionalRo.isPresent() && optionalRc.isPresent()){
            Mission newMission = new Mission(
                    missionBean.nom,
                    optionalClient.get(),
                    optionalConsultant.get(),
                    optionalManager.get(),
                    optionalRo.get(),
                    optionalRc.get(),
                    missionBean.detail,
                    missionBean.adresse,
                    missionBean.frequence_eval,
                    missionBean.date_debut,
                    missionBean.date_fin,
                    missionBean.metier
            );
            missionRepository.save(newMission);
            return newMission;
        }
        return null;
    }

и здесь для клиента (2-й пример, который отлично работает):

@PostMapping
    public Client addClient (@RequestBody Client client){
        clientRepository.save(client);
        Critere critere = new Critere(client,"Ponctualité",true);
        Critere critere2 = new Critere(client,"Assiduité",true);
        Critere critere3 = new Critere(client,"Intégration",true);
        critereRepository.save(critere);
        critereRepository.save(critere2);
        critereRepository.save(critere3);
        return client;
    }

Я пробовал много разных способов указать заголовки, но это все еще не работает. Запрос работает хорошо (200), но данные не понимаются на стороне API, заголовок отсутствует, поэтому пустая строка в качестве данных, я вроде как новичок в этом, поэтому я застрял здесь. Когда я проверяю свою базу данных, ничего нового не добавляется.

Редактировать: я получаю сообщение от API каждый раз, когда делаю запрос:

2020-02-22 22:19:39.737  WARN 4205 --- [nio-8080-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `com.evalside.project.beans.MissionBean` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.evalside.project.beans.MissionBean` out of START_ARRAY token
 at [Source: (PushbackInputStream); line: 1, column: 1]]

Может быть, это может помочь решить проблему

Edit2: некоторые из моих значений должны быть int, но приходят как String (только что заметил) Я собираюсь исправить это и попробуйте снова

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Вы, вероятно, не хотите использовать свое состояние таким образом.

Сначала , начальное значение вашего состояния данных должно быть объектом (в зависимости от типа и значения, которое вы указать это будет позже). Лучше быть ясным с вашими намерениями с самого начала:)

const [data, setData] = useState({});

Секунда , при обновлении состояния, как вы делаете, могут возникнуть проблемы. Попробуйте вместо этого использовать setDate(prevState => { // your logic }).

Третий , исходя из кода, который вы показываете, не имеет особого смысла устанавливать ваше состояние так, как вы делаете, и затем передавать его на ваш axios.post запрос. Или есть какая-то другая причина, почему эти значения хранятся в состоянии перед использованием в вашем запросе? Кажется, что большинство из них уже хранятся в каком-то другом state, верно?

Вместо этого вы могли бы объявить const, содержащий эти значения:

const myData = {
    nom:state.missionName,
    id_client:state.currentClientKey,
    id_consultant:state.currentConsultantId,
    id_manager:1,
    id_ro:state.currentROKey,
    id_rc:state.currentRCKey,
    detail:state.missionDescription,
    adresse:state.adresse,
    frequence_eval:6,
    date_debut:state.startDate,
    date_fin:state.endDate,
    metier:state.metier
}

Обычно один раз побочный эффект завершен, и вы получили ответ, когда вы можете захотеть обновить подобное состояние.

Четвертый , вы объявили headers -объект;

let headers = {
    headers: {'Content-Type': 'application/json'}
};

Итак, в вашем топоре ios -запрос сделайте это:

axios.post('http://localhost:8080/mission', data, headers);

вместо этого:

axios.post('http://localhost:8080/mission',data,{"headers" : headers})
0 голосов
/ 23 февраля 2020

спасибо за вашу помощь

First, the initial value of your data state should be an object (according do what kind of type and value you point it to be later). Better be clear with your intentions from start :)

const [data, setData] = useState({});

На самом деле это так, я написал это так: const [data, setData] = useState([]); не с {}.

Я начинаю зацикливаться, так что да У меня пока нет правильных привычек, я попытаюсь использовать setDate(prevState => { // your logic }) чаще.

У меня есть несколько компонентов, все поднимающие некоторые значения в этот, который в конечном итоге сделает запрос post, то есть почему это немного запутанно со всеми состояниями и проходящими мимо данными, но я пробовал много способов, и я уже пробовал просто делать:

const data = {name:myName, date:myDate etc..}
(...)
axios.post('url', data, headers)

У меня происходят другие вещи, которые я пропустил в API, собираюсь добавить его в пост, возможно, это поможет;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...