ANONYMOUS
ANONYMOUS

Reputation: 63

Getting different JSON response when using fetch react native

I have a react app which calls an API when the user clicks login. However, the response that react native receives is different than the intended response.

React Native code:

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})
    })
}

Console response:

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"}}}

Expected API response:

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

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

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

Upvotes: 0

Views: 1062

Answers (3)

Thahzan
Thahzan

Reputation: 1005

As the previous answers have noted, the response object has a .json() function which returns a promise (which resolves to the actual data).

Also you can structure the code much better with 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`));
  }
}

Upvotes: 0

Terrence
Terrence

Reputation: 1

You need to have another .then that will resolve the response and converts it into JSON:

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

Upvotes: 0

Berkay Kaan
Berkay Kaan

Reputation: 305

In document basic structure of fetch request defined here. from the document, you can try this one

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

Upvotes: 0

Related Questions