使用Fetch React Native时获得不同的JSON响应

时间:2018-09-27 18:21:30

标签: javascript json api react-native fetch

我有一个react应用,当用户单击登录时,该应用会调用API。但是,对本机响应的响应与预期响应不同。

反应本机代码:

login() {
    this.setState({isLoading: true})
    return fetch(process.env.API_USER + "/signin", {
        method: "POST", 
        headers: {
            Accept: "application/json", 
            "Content-Type": "application/json"
        },
        body: JSON.stringify({
            username: this.state.username, 
            password: this.state.password
        })
    }).then((response) => {
        console.log(`\n\n\n\nRESPONSE---->${JSON.stringify(response)}\n\n\n\n`)
        this.setState({isLoading: false})
    })
    .catch((error) => {
        console.log((`\n\n\n\nERROR---->${error}\n\n\n\n`))
        this.setState({isLoading: false})
    })
}

控制台响应:

RESPONSE---->{"type":"default","status":401,"ok":false,"headers":{"map":{"via":"1.1 vegur","date":"Thu, 27 Sep 2018 18:10:42 GMT","server":"Cowboy","etag":"W/\"17-wIxJlIRlPQbTEtBjbmLpTqPMWNo\"","connection":"keep-alive","cache-control":"public, max-age=0","x-powered-by":"Express","content-length":"23","access-control-allow-credentials":"true","access-control-allow-origin":"*","access-control-allow-methods":"*","access-control-allow-headers":"Origin, Accept,Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers","content-type":"application/json; charset=utf-8"}},"url":"abc.com","_bodyInit":{"_data":{"size":23,"offset":0,"blobId":"f4012672-62b8-4b52-be6f-06446874981c"}},"_bodyBlob":{"_data":{"size":23,"offset":0,"blobId":"f4012672-62b8-4b52-be6f-06446874981c"}}}

预期的API响应:

RESPONSE---->{"message": "Auth Fail"}

// ----------OR---------- //

RESPONSE---->{"message": "Auth Successfull"}

3 个答案:

答案 0 :(得分:0)

在获取请求定义为here的文档基本结构中。从文档中,您可以尝试这个

  .then((response) => response.json())
        .then((resJSON) => {
           console(resJSON);
           this.setState({isLoading: false})
        })
        .catch((error) => {
           console.log(error)
           this.setState({isLoading: false})
        })

答案 1 :(得分:0)

您需要另一个.then来解析响应并将其转换为JSON:

.then(response => response.json())
.then(data => {
    // now you can get your server response
    console.log(data)
 })    

答案 2 :(得分:0)

如先前的回答所述,响应对象具有一个.json()函数,该函数返回一个promise(解析为实际数据)。

您还可以使用async / await

更好地构建代码
login = async () => {
  const options = {
    method: "POST",
    headers: {
      Accept: "application/json", 
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      username: this.state.username, 
      password: this.state.password
    }),
  };
  this.setState({isLoading: true});

  try {
    const response = await fetch(`${process.env.API_USER}/signin`, options);
    const responseData = await response.json(); // This is what you're missing

    this.setState({isLoading: false});
  } catch (error) {
    // Do something about the error
    console.log((`\n\n\n\nERROR---->${error}\n\n\n\n`));
  }
}