gaxios icon indicating copy to clipboard operation
gaxios copied to clipboard

Transitioning from request

Open drmrbrewer opened this issue 4 years ago • 13 comments

I'm coming to gaxios from request. In the latter I'm used to specifying gzip: true in my request options, to ensure compression is used in the response (if available). This does not appear to be available in gaxios so I'm wondering if it is effectively enabled by default? Not that I'd ever want to, but is it possible in gaxios to disable compression?

And it seems to me that the following drop-in replacements can also be made when transitioning from request to gaxios... please correct me if I'm wrong!

  • json: true becomes responseType: 'json' (though this is the default anyway so could be omitted)
  • body: { a: x, b: y } becomes data: { a: x, b: y }
  • qs: { a: x, b: y } becomes params: { a: x, b: y }

What about an equivalent for auth: { bearer: bearerToken }? See here.

And an equivalent to resolveWithFullResponse? See here.

drmrbrewer avatar Mar 04 '20 16:03 drmrbrewer

Greetings! We can take a look at this in a bit, but for now, have you considered using teeny-request? https://github.com/googleapis/teeny-request/

It was written to be mostly API compatible with request, but on top of node-fetch :)

JustinBeckwith avatar Mar 09 '20 18:03 JustinBeckwith

That looks interesting! However I'd prefer a library that does async/await out of the box (request doesn't, but I use a wrapper... bit clunky though).

Would also be useful to have your input on the following: https://stackoverflow.com/q/60532289/4070848

Perhaps I'm being too optimistic to hope for something that does everything that request does (only better)!

Thanks!

drmrbrewer avatar Mar 09 '20 19:03 drmrbrewer

@JustinBeckwith sure you're busy but would be great to have even some brief response on this one. Would be useful to all I'm sure. Thanks!

drmrbrewer avatar Sep 01 '20 18:09 drmrbrewer

👋 thanks for the bump

In the latter I'm used to specifying gzip: true in my request options, to ensure compression is used in the response (if available). This does not appear to be available in gaxios so I'm wondering if it is effectively enabled by default?

Yes! We're using node-fetch under the hood, so that option is enabled by default.

Not that I'd ever want to, but is it possible in gaxios to disable compression?

As of now I don't think you can 😆 We could certainly add this option if it was a big deal (easy enough). If we chose to support it, I would probably use the decompress flag documented in axios as the interface.

And it seems to me that the following drop-in replacements can also be made when transitioning from request to gaxios... please correct me if I'm wrong!

All of those were correct

What about an equivalent for auth: { bearer: bearerToken }? See here.

At the end of the day, that's just a header right? So you should be able to set:

gaxios.request({
  url: '...',
  headers: {
    auth: 'bearer xxxxx'
  },
});

And an equivalent to resolveWithFullResponse? See here.

It does this by default! The response you get back from the promise is the full response. The body is in response.data.

Hope this helps!

JustinBeckwith avatar Sep 01 '20 20:09 JustinBeckwith

Super helpful, thanks!

drmrbrewer avatar Sep 01 '20 22:09 drmrbrewer

@JustinBeckwith having been migrating the auth parameter of my previous options for the request module, I have discovered that there is slightly more to it than just turning it into a header.

Perhaps there is justification for an additional auth parameter for gaxios, as a helper?

I note that axios has an auth parameter (see here) similar to what is offered by request (see here).

It appears that both request's and axios's implementation deals with auth.user and auth.pass sub-parameters. These are seemingly converted internally into the following header:

'Authorization': 'Basic ' + base64encodedData

where:

var base64encodedData = Buffer.from(auth.user + ':' + auth.pass).toString('base64');

see e.g. here.

In addition, request's implementation (but not axios's) deals with the auth.bearer sub-parameter, and likely turns it into the following header:

'Authorization': 'Bearer ' + auth.bearer

So having the auth parameter in gaxios would make life a bit easier, but it's not essential because you can make up your own headers without it. It would be a "nice to have".

drmrbrewer avatar Sep 02 '20 15:09 drmrbrewer

Makes sense. Just to set expectations, we're not likely to add this any time soon - but thank you for digging!

JustinBeckwith avatar Sep 02 '20 15:09 JustinBeckwith

Yep, no worries... I've already done the manual conversion into appropriate Authorisation headers so likely I wouldn't use an auth parameter in gaxios anytime soon anyway!

drmrbrewer avatar Sep 02 '20 16:09 drmrbrewer

@JustinBeckwith on the same topic of transitioning from request... can gaxios do something equivalent to what is possible with request as described here and here?

drmrbrewer avatar Sep 02 '20 17:09 drmrbrewer

Yes! I don't know if we documented this but: https://github.com/googleapis/gaxios/blob/master/src/gaxios.ts#L52

JustinBeckwith avatar Sep 02 '20 17:09 JustinBeckwith

So what would the gaxios equivalent of request('http://google.com/').pipe(res) and req.pipe(request('http://google.com/')).pipe(res) be?

drmrbrewer avatar Sep 02 '20 17:09 drmrbrewer

@JustinBeckwith any hints on my question just above? I'll give the first one a go myself:

const { request } = require('gaxios');
(await request({ url: 'http://google.com/', responseType: 'stream' })).data.pipe(res);

What about the second one, i.e. the gaxios equivalent of:

req.pipe(request(url)).pipe(res);

This is used for example in this sort of context.

Or in the following context, to redirect a request (whether it be a POST or GET request) to a different domain and pipe the response back to the client that sent the request:

const url = 'https://my.new.url.com' + req.originalUrl;
req.pipe(request(url)).pipe(res);

drmrbrewer avatar Oct 22 '20 20:10 drmrbrewer

@JustinBeckwith sure you're busy, but would be great to know the answer to the above question on piping into and out of gaxios, as a replacement for the deprecated request module which does this really straightforwardly. Would be useful to all I'm sure. Thanks!

drmrbrewer avatar Oct 27 '20 20:10 drmrbrewer