如何从fetch获取JSON数据(react-native)

时间:2015-05-05 19:28:56

标签: javascript ios json react-native fetch-api

我正在使用react native为iPhone编写小应用程序。我正在尝试使用fetch从网站获取JSON数据。就像在例子中一样:

   function status(response) {
  if (response.status >= 200 && response.status < 300) {
    return response
  }
  throw new Error(response.statusText)
}

function json(response) {
  return response.json()
}


fetch('/users', {
  method: 'post',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: 'Hubot',
    login: 'hubot',
  })
}).then(status)
  .then(json)
  .then(function(json) {
    console.log('request succeeded with json response', json)
  }).catch(function(error) {
    console.log('request failed', error)
  })

一切正常但我需要稍后使用这些数据。当我尝试将它分配给json函数中的某个变量时,我得到“请求错误”,然后获取数据(正确)。获取数据并将其放在某个变量中以便以后使用它的最佳做法是什么?

5 个答案:

答案 0 :(得分:6)

您可以在组件的构造函数中创建变量:

constructor(props) {
    super(props);
    this.state = {
       jsonData: ''
    }
}

然后在需要时更新此变量:

 .then((responseData) => {
    this.setState({
      jsonData: responseData
    });
  })

答案 1 :(得分:6)

我是这样做的。我在控制台上显示了响应。您可以根据需要将响应数据存储在状态变量或本地存储中。

  doSignUp() {

     console.log("inside post api");
     fetch('your API URL', {
     method: 'POST',
     headers: {
                  'Accept': 'application/json',
                  'Content-Type': 'application/json',

                },


      body: JSON.stringify({
      password: this.state.password,
      email:this.state.email,
      name: this.state.firstname,
      last_name :this.state.last_name,
      mobile:this.state.mobile,
      ssn:"2222222"

     })
      }).then((response) => response.json())
        .then((responseData) => {
                                 console.log("inside responsejson");
                                 console.log('response object:',responseData)

         }).done();
     }

答案 2 :(得分:1)

亲爱的朋友,这很简单

首先,如您所知,每个请求都会返回标题正文

当我们使用获取标题请求的默认响应。 如果我们需要正文请求,那就足够response.json()

return fetch(url,{
  method: 'POST',//GET and ...
  headers:{
      Accept: 'application/json',
      'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      elm: "elm" //is fake
  })
 })
 .then((response)=>response.json()) //   <------ this line 
 .then((response)=>{
   return response ;
 });

如果您的请求的正文 html dom ,请使用此response.text()

如果您想要返回标题,则无需执行任何操作,只需添加此行.then((response)=>response.json())

答案 3 :(得分:0)

在我的情况下,我使用了带本地护照的sails.js,但它与任何其他node.js框架非常相似,用于捕获我用于登录函数(req,res)的变量,其中变量存储在req中。身体。在你的情况下,req.body.name将包含'Hubot',req.body.login将包含'hubot'.Response将使用res.send发送。查看node.js文档以获取更多详细信息。

答案 4 :(得分:0)

我是这样的

这是按钮

<Button onPress={this._onPressButton} accessibilityLabel="tap!!!" />

这是动作

  _onPressButton() {

  return fetch('https://facebook.github.io/react-native/movies.json')
    .then((response) => response.json())
    .then((responseJson) => {
      console.log(responseJson.movies);
    })
    .catch((error) => {
      console.error(error);
    });

  }

结果

[14:30:19] Array [
[14:30:19]   Object {
[14:30:19]     "id": "1",
[14:30:19]     "releaseYear": "1977",
[14:30:19]     "title": "Star Wars",
[14:30:19]   },
[14:30:19]   Object {
[14:30:19]     "id": "2",
[14:30:19]     "releaseYear": "1985",
[14:30:19]     "title": "Back to the Future",
[14:30:19]   },
[14:30:19]   Object {
[14:30:19]     "id": "3",
[14:30:19]     "releaseYear": "1999",
[14:30:19]     "title": "The Matrix",
[14:30:19]   },
[14:30:19]   Object {
[14:30:19]     "id": "4",
[14:30:19]     "releaseYear": "2010",
[14:30:19]     "title": "Inception",
[14:30:19]   },
[14:30:19]   Object {
[14:30:19]     "id": "5",
[14:30:19]     "releaseYear": "2014",
[14:30:19]     "title": "Interstellar",
[14:30:19]   },
[14:30:19] ]
[14:30:19] Array [
[14:30:19]   Object {
[14:30:19]     "id": "1",
[14:30:19]     "releaseYear": "1977",
[14:30:19]     "title": "Star Wars",
[14:30:19]   },
[14:30:19]   Object {
[14:30:19]     "id": "2",
[14:30:19]     "releaseYear": "1985",
[14:30:19]     "title": "Back to the Future",
[14:30:19]   },
[14:30:19]   Object {
[14:30:19]     "id": "3",
[14:30:19]     "releaseYear": "1999",
[14:30:19]     "title": "The Matrix",
[14:30:19]   },
[14:30:19]   Object {
[14:30:19]     "id": "4",
[14:30:19]     "releaseYear": "2010",
[14:30:19]     "title": "Inception",
[14:30:19]   },
[14:30:19]   Object {
[14:30:19]     "id": "5",
[14:30:19]     "releaseYear": "2014",
[14:30:19]     "title": "Interstellar",
[14:30:19]   },
[14:30:19] ]