Как сохранить данные из моего запроса POST в качестве переменной для использования в моем запросе GET? - PullRequest
0 голосов
/ 03 февраля 2020

Я получаю свои данные из моего POST-запроса. Я хочу использовать эти данные в качестве переменной в запросе GET. Данные из запроса POST вводятся пользователем для выполнения различных запросов в стороннем API> Как я могу сохранить мои данные в качестве переменной для этого? Вы можете видеть, что мой request.body сохраняется в виде постоянных данных. И мне нужно использовать его как $ {data} в моем запросе get. Я довольно новичок в этом, поэтому любые предложения по наилучшей практике будут оценены. Спасибо за помощь.

Server.js


app.get(`/getmovies`, (req, res) => {

    request(`http://www.omdbapi.com/?t=${data}&apikey=${API_KEY}`,
        function (error, response, body) {
            if (!error && response.statusCode == 200) {
                var parsedBody = JSON.parse(body);
                res.send(parsedBody)

            } else {
                console.log("error in the server")
            }
        }
    )
})


app.post('/postmovie', (request, response) => {
    console.log("I got a request!")
    console.log(request.body);
    const data = request.body;
    response.json({
        status: 'success',
        name: data
    })
})


///Client 

  postMovie = async (e) => {
    e.preventDefault();

    const data = this.state.movie;
    const options = {
      method: 'Post',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(data)
    };

    const response = await fetch('/postmovie', options);
    const json = await response.json();
    console.log(json);


  };



  getMovies = (e) => {
    e.preventDefault();
    const { movie } = this.state;
    axios.get(`/getmovies`)
      .then(response => this.setState({ movies: response.data }))
      // .then(response => this.setState({ movies: response.data }))
      .catch(err => console.error(err))
  }

  render() {
    const { movie } = this.state;
    return (
      <div>
        <section className="form-container">
          <div className="movie-form-div">


            < form>
              <input className="form-input" type="text" name="name"
                value={movie.name}
                onChange={e => this.setState({ movie: { ...movie, name: e.target.value } })} />
              <button onClick={this.getMovies}>Search</button>
              <button onClick={this.postMovie}>Post</button>

            </form >
          </div>
        </section>



1 Ответ

0 голосов
/ 03 февраля 2020

Как я уже упоминал в комментариях, ваш вопрос сформулирован так, что вы звучите так, будто вам абсолютно необходимы два запроса.

В комментариях OP пояснил, что им не обязательно нужны два запроса, поэтому в этой заметке есть несколько вещей, которые вы можете попробовать.

1) Настроить application.conf

Файлы конфигурации позволяют нам параметризировать и настраивать переменные, необходимые для работы наших приложений. Вы можете варьировать конфигурационные файлы между средами (dev / stage / prod et c.) И развертываниями.

Предполагается, что ваш API_KEY меняется не часто. Подумайте об этом, как о жестком кодировании вашего API-ключа, например

var apiKey = "...."

, но это лучший и более безопасный способ сделать это.

В вашем случае это не сработает, но хорошо быть осознавать это. Вы можете использовать этот пакет в будущем

2) Получить параметры запроса запроса.

Это ваша лучшая ставка

Параметры запроса, как следует из названия, позволяют нам передавать переменные с запросами get для фильтрации результатов на стороне сервера. Это может быть что-то вроде идентификатора пользователя, номера страницы и т. Д. c.

Ваш URL-адрес для получения со стороны клиента будет выглядеть примерно так

mydomain.com/getmovies?apikey={YourKeyGoesHere}

Я уверен, что вы видели, что ? во многих из URL, которые вы посещаете.

Если вы используете express, ваша конечная точка будет выглядеть примерно так:

app.get(`/getmovies`, (req, res) => {
   var apiKey = req.query.apikey
   request(`http://www.omdbapi.com/?t=${data}&apikey=${apikey}`,
      function (error, response, body) {
        if (!error && response.statusCode == 200) {
            var parsedBody = JSON.parse(body);
            res.send(parsedBody)

        } else {
            console.log("error in the server")
        }
    }
)
})

См. Как получить GET (строка запроса) переменных в Express. js on Node.js?

Это позволит вам передать его со стороны клиента.

Если вы не используете express, см. https://nodejs.org/api/querystring.html

3) Если вам абсолютно необходимы две конечные точки ...

Используйте готовить ie. Как только повар ie установлен, он транспортируется туда-сюда с каждым запросом, пока не истечет срок его действия.

См. Это Как настроить повар ie в node js, используя express framework? или this

После получения сообщения запрос вы бы установили повара ie

app.post('/postmovie', (request, response) => {
    response.cookie("apikey", data, maxAge: 900000, httpOnly: true });
    response.json({
      status: 'success'
    })
})

Как только этот повар ie будет установлен, он будет доставлен клиенту и обратно со всеми запросами, включая получение.

Итак, в вашем запросе на получение вы можете сделать:

app.get(`/getmovies`, (req, res) => {
   var apikey = req.cookies.apikey;
   request(`http://www.omdbapi.com/?t=${data}&apikey=${apikey}`,
      function (error, response, body) {
        if (!error && response.statusCode == 200) {
            var parsedBody = JSON.parse(body);
            res.send(parsedBody)

        } else {
            console.log("error in the server")
        }
    }
)
})

Так в чем же разница между # 2 и # 3?

Параметры запроса те, которые закодированы в URL, являются publi c и могут быть перехвачены. Это хорошо для таких вещей, как номера страниц, но если ключ API является платным, это не очень безопасно. Кроме того, как только вы отправляете запрос, он пропадает (если вы не сохраните ключ API на стороне клиента в памяти или локальном хранилище), поэтому пользователю придется вводить ключ API все заново.

Cookies с другой стороны, являются частными. Флаг http-only , который мы установили в коде, не позволяет даже браузеру читать его. Только выдающий сервер может видеть содержимое. Кроме того, файлы cookie сохраняются в браузере до истечения срока годности, поэтому их можно повторно использовать с несколькими запросами.

Выберите тот, который работает для вас.

PS Я не проверял код выше, Возможно, вам придется немного подправить его. Ответ заключается в том, чтобы дать вам общее представление о том, как эти вещи обычно обрабатываются

...