Search code examples
react-nativedata-retrieval

React Native filtering API to retrieve specific data


I'm using Zomato API (https://developers.zomato.com/documentation) and am fairly new to getting data from an API, so far I am able to retrieve categories from the API. However what I want to do is pull category data from a specific city. Here is my code:

APIcall.js

import axios from 'axios';

 export  const apiCall = async(url)=>{
   return await  axios.request({
    baseURL:"https://developers.zomato.com/api/v2.1/categories",
    headers: {
        'user-key': "a31bd76da32396a27b6906bf0ca707a2",
    },
    url : url,
    method : 'get' 
     }).then(async(response) => {
       return response.data.categories
     }).catch(err => console.log(err))
 }

Home.js

export default class HomeScreen extends React.Component {

  constructor(props){
    super(props);
    this.state={
      data : []
    }
  }

async  componentDidMount(){

  this.setState({
    data : await apiCall('')
 })

 console.log(await apiCall('?cities'))//I tried console logging to see what data I can get all I get is [Error: Request failed with status code 404] undefined
  }

  render() {
    return (
      <View>

         <FlatList 
         keyExtractor={item => item.id}
         data={this.state.data}
         renderItem={({ item }) => 
         <Card style={styles.container}>
           <Text style={{color:'#000',fontWeight:'bold'}}>{item.categories.name} </Text>
         </Card>} 
      />

      </View>
    );
  }
}

Solution

  • According to Zomato API documentation, in order to pull category data from a specific city you need to pass city_id as Parameter.

    import React, { Component } from 'react';
    import { FlatList, ActivityIndicator, Text, View } from 'react-native';
    import axios from 'axios';
    
    export default class HomeScreen extends Component {
    
      constructor(props) {
        super(props);
        this.state = {
          isLoading: true,
          data: []
        }
      }
    
      async componentDidMount() {
        let result;
        try {
          result = await axios.request({
            method: 'GET',
            url: "https://developers.zomato.com/api/v2.1/categories?city_id=280",
            headers: {
              'Content-Type': 'application/json',
              'user-key': "a31bd76da32396a27b6906bf0ca707a2",
            },
          })
        } catch (err) {
          err => console.log(err)
        }
        this.setState({
          isLoading: false,
          data: result.data.categories
        })
      }
    
      render() {
        return (
          <View>
            {
              this.state.isLoading ?
                <View style={{ flex: 1, padding: 20 }}>
                  <ActivityIndicator />
                </View> :
                <FlatList
                  keyExtractor={item => item.id}
                  data={this.state.data}
                  renderItem={({ item }) =>
                    <Text>{item.categories.name} </Text>
                  }
                />
            }
          </View>
        );
      }
    }
    

    Hope it helps you.