Fernando Correia
Fernando Correia

Reputation: 151

Trying to make an API call to a remote endpoint with NestJS

var unirest = require("unirest");

var req = unirest("GET", "https://edamam-edamam-nutrition-analysis.p.rapidapi.com/api/nutrition-data");

req.query({
    "ingr": "1 large apple"
});

req.headers({
    "x-rapidapi-host": "HOST",
    "x-rapidapi-key": "KEY",
    "useQueryString": true
});


req.end(function (res) {
    if (res.error) throw new Error(res.error);

    console.log(res.body);
});

Im trying to make an API call with that doc and parameters in order to get a list of ingredients based on a search parameter.

This is my service:

 async getAllNutrients(ingr: string) {
    console.log(ingr);
    const headersRequest = {
      'x-rapidapi-host': 'edamam-edamam-nutrition-analysis.p.rapidapi.com',
      'x-rapidapi-key': '5664b75c9fmsh66ac8e054422eb9p1600b8jsn878d097e8d2a',
      useQueryString: true,
    };
    const result = await this.httpService.get(
      `https://edamam-edamam-nutrition-analysis.p.rapidapi.com/api/nutrition-data` +
        ingr,
      { headers: headersRequest },
    );
    console.log(result);

    return result;
  }

And this is my controller

@Get('/list?:ingr')
  getMacros(@Query('ingr') ingr) {
    return this.macroService.getAllNutrients(ingr);
  }

I tried to change QUery and Param but none are working. On postman i make an API call like this: "localhost:3000/macros/list?ingr="1 large apple" And my 2 console.log returns:

"1 large apple"
Observable { _isScalar: false, _subscribe: [Function] }
[Nest] 7460   - 2020-09-21 16:00:55   [ExceptionsHandler] Request failed with status code 404 +441782ms
Error: Request failed with status code 404

I tried to use pipe like this example:

getQuote(id){
        return this.http.get('http://quotesondesign.com/wp-json/posts/' + id)
            .pipe(
                map(response => response.data)
            ); 
    }

But the result was the same. Any help?

Upvotes: 1

Views: 2980

Answers (2)

hoangdv
hoangdv

Reputation: 16157

In your service function

const result = await this.httpService.get(
      `https://edamam-edamam-nutrition-analysis.p.rapidapi.com/api/nutrition-data` +
        ingr,
      { headers: headersRequest },
    );

with ingr is 1 large apple then the API URL will become "https://edamam-edamam-nutrition-analysis.p.rapidapi.com/api/nutrition-data1 large apple".

I think this is an incorrect API URL, and you don’t want to call the API like that.

Change it to

`https://edamam-edamam-nutrition-analysis.p.rapidapi.com/api/nutrition-data?ingr=${ingr}`,

Upvotes: 0

Anwar Jeffrey
Anwar Jeffrey

Reputation: 11

Looks like your issue is in your controllers route. Changing @Get('/list?:ingr') to @Get('/list') should resolve this. I believe passing ?:ingr in the path is setting a param with key ingr.

Queries do not need to be added to the route. They are accessed using the @Query decorator.

Look at this for more info.

Upvotes: 1

Related Questions