feat(fetch): add helper methods for put, patch, head, delete (#9374)

This commit is contained in:
Yury Semikhatsky 2021-10-07 12:42:26 -07:00 committed by GitHub
parent 8bfd63e4ba
commit 51490a82e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 371 additions and 107 deletions

View File

@ -6,6 +6,20 @@ environment or the service to your e2e test. When used on [Page] or a [BrowserCo
the cookies from the corresponding [BrowserContext]. This means that if you log in using this API, your e2e test
will be logged in and vice versa.
## async method: ApiRequestContext.delete
- returns: <[ApiResponse]>
Sends HTTP(S) [DELETE](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/DELETE) request and returns its response.
The method will populate request cookies from the context and update
context cookies from the response. The method will automatically follow redirects.
### param: ApiRequestContext.delete.url = %%-fetch-param-url-%%
### option: ApiRequestContext.delete.params = %%-fetch-option-params-%%
### option: ApiRequestContext.delete.headers = %%-fetch-option-headers-%%
### option: ApiRequestContext.delete.timeout = %%-fetch-option-timeout-%%
### option: ApiRequestContext.delete.failOnStatusCode = %%-fetch-option-failonstatuscode-%%
### option: ApiRequestContext.delete.ignoreHTTPSErrors = %%-context-option-ignorehttpserrors-%%
## async method: ApiRequestContext.dispose
All responses received through [`method: ApiRequestContext.fetch`], [`method: ApiRequestContext.get`], [`method: ApiRequestContext.post`]
@ -15,121 +29,109 @@ discards all stored responses, and makes [`method: ApiResponse.body`] throw "Res
## async method: ApiRequestContext.fetch
- returns: <[ApiResponse]>
Sends HTTP(S) fetch and returns its response. The method will populate fetch cookies from the context and update
Sends HTTP(S) request and returns its response. The method will populate request cookies from the context and update
context cookies from the response. The method will automatically follow redirects.
### param: ApiRequestContext.fetch.urlOrRequest
- `urlOrRequest` <[string]|[Request]>
Target URL or Request to get all fetch parameters from.
Target URL or Request to get all parameters from.
### option: ApiRequestContext.fetch.params
- `params` <[Object]<[string], [string]>>
Query parameters to be send with the URL.
### option: ApiRequestContext.fetch.params = %%-fetch-option-params-%%
### option: ApiRequestContext.fetch.method
- `method` <[string]>
If set changes the fetch method (e.g. PUT or POST). If not specified, GET method is used.
### option: ApiRequestContext.fetch.headers
- `headers` <[Object]<[string], [string]>>
Allows to set HTTP headers.
If set changes the fetch method (e.g. [PUT](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) or
[POST](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)). If not specified, GET method is used.
### option: ApiRequestContext.fetch.headers = %%-fetch-option-headers-%%
### option: ApiRequestContext.fetch.data = %%-fetch-option-data-%%
### option: ApiRequestContext.fetch.form = %%-fetch-option-form-%%
### option: ApiRequestContext.fetch.multipart = %%-fetch-option-multipart-%%
### option: ApiRequestContext.fetch.timeout
- `timeout` <[float]>
Request timeout in milliseconds.
### option: ApiRequestContext.fetch.failOnStatusCode
- `failOnStatusCode` <[boolean]>
Whether to throw on response codes other than 2xx and 3xx. By default response object is returned
for all status codes.
### option: ApiRequestContext.fetch.timeout = %%-fetch-option-timeout-%%
### option: ApiRequestContext.fetch.failOnStatusCode = %%-fetch-option-failonstatuscode-%%
### option: ApiRequestContext.fetch.ignoreHTTPSErrors = %%-context-option-ignorehttpserrors-%%
## async method: ApiRequestContext.get
- returns: <[ApiResponse]>
Sends HTTP(S) GET request and returns its response. The method will populate fetch cookies from the context and update
Sends HTTP(S) [GET](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET) request and returns its response.
The method will populate request cookies from the context and update
context cookies from the response. The method will automatically follow redirects.
### param: ApiRequestContext.get.url
- `url` <[string]>
Target URL.
### option: ApiRequestContext.get.params
- `params` <[Object]<[string], [string]>>
Query parameters to be send with the URL.
### option: ApiRequestContext.get.headers
- `headers` <[Object]<[string], [string]>>
Allows to set HTTP headers.
### option: ApiRequestContext.get.timeout
- `timeout` <[float]>
Request timeout in milliseconds.
### option: ApiRequestContext.get.failOnStatusCode
- `failOnStatusCode` <[boolean]>
Whether to throw on response codes other than 2xx and 3xx. By default response object is returned
for all status codes.
### param: ApiRequestContext.get.url = %%-fetch-param-url-%%
### option: ApiRequestContext.get.params = %%-fetch-option-params-%%
### option: ApiRequestContext.get.headers = %%-fetch-option-headers-%%
### option: ApiRequestContext.get.timeout = %%-fetch-option-timeout-%%
### option: ApiRequestContext.get.failOnStatusCode = %%-fetch-option-failonstatuscode-%%
### option: ApiRequestContext.get.ignoreHTTPSErrors = %%-context-option-ignorehttpserrors-%%
## async method: ApiRequestContext.head
- returns: <[ApiResponse]>
Sends HTTP(S) [HEAD](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD) request and returns its response.
The method will populate request cookies from the context and update
context cookies from the response. The method will automatically follow redirects.
### param: ApiRequestContext.head.url = %%-fetch-param-url-%%
### option: ApiRequestContext.head.params = %%-fetch-option-params-%%
### option: ApiRequestContext.head.headers = %%-fetch-option-headers-%%
### option: ApiRequestContext.head.timeout = %%-fetch-option-timeout-%%
### option: ApiRequestContext.head.failOnStatusCode = %%-fetch-option-failonstatuscode-%%
### option: ApiRequestContext.head.ignoreHTTPSErrors = %%-context-option-ignorehttpserrors-%%
## async method: ApiRequestContext.patch
- returns: <[ApiResponse]>
Sends HTTP(S) [PATCH](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) request and returns its response.
The method will populate request cookies from the context and update
context cookies from the response. The method will automatically follow redirects.
### param: ApiRequestContext.patch.url = %%-fetch-param-url-%%
### option: ApiRequestContext.patch.params = %%-fetch-option-params-%%
### option: ApiRequestContext.patch.headers = %%-fetch-option-headers-%%
### option: ApiRequestContext.patch.data = %%-fetch-option-data-%%
### option: ApiRequestContext.patch.form = %%-fetch-option-form-%%
### option: ApiRequestContext.patch.multipart = %%-fetch-option-multipart-%%
### option: ApiRequestContext.patch.timeout = %%-fetch-option-timeout-%%
### option: ApiRequestContext.patch.failOnStatusCode = %%-fetch-option-failonstatuscode-%%
### option: ApiRequestContext.patch.ignoreHTTPSErrors = %%-context-option-ignorehttpserrors-%%
## async method: ApiRequestContext.post
- returns: <[ApiResponse]>
Sends HTTP(S) fetch and returns its response. The method will populate fetch cookies from the context and update
Sends HTTP(S) [POST](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) request and returns its response.
The method will populate request cookies from the context and update
context cookies from the response. The method will automatically follow redirects.
### param: ApiRequestContext.post.url
- `url` <[string]>
Target URL.
### option: ApiRequestContext.post.params
- `params` <[Object]<[string], [string]>>
Query parameters to be send with the URL.
### option: ApiRequestContext.post.headers
- `headers` <[Object]<[string], [string]>>
Allows to set HTTP headers.
### param: ApiRequestContext.post.url = %%-fetch-param-url-%%
### option: ApiRequestContext.post.params = %%-fetch-option-params-%%
### option: ApiRequestContext.post.headers = %%-fetch-option-headers-%%
### option: ApiRequestContext.post.data = %%-fetch-option-data-%%
### option: ApiRequestContext.post.form = %%-fetch-option-form-%%
### option: ApiRequestContext.post.multipart = %%-fetch-option-multipart-%%
### option: ApiRequestContext.post.timeout
- `timeout` <[float]>
Request timeout in milliseconds.
### option: ApiRequestContext.post.failOnStatusCode
- `failOnStatusCode` <[boolean]>
Whether to throw on response codes other than 2xx and 3xx. By default response object is returned
for all status codes.
### option: ApiRequestContext.post.timeout = %%-fetch-option-timeout-%%
### option: ApiRequestContext.post.failOnStatusCode = %%-fetch-option-failonstatuscode-%%
### option: ApiRequestContext.post.ignoreHTTPSErrors = %%-context-option-ignorehttpserrors-%%
## async method: ApiRequestContext.put
- returns: <[ApiResponse]>
Sends HTTP(S) [PUT](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) request and returns its response.
The method will populate request cookies from the context and update
context cookies from the response. The method will automatically follow redirects.
### param: ApiRequestContext.put.url = %%-fetch-param-url-%%
### option: ApiRequestContext.put.params = %%-fetch-option-params-%%
### option: ApiRequestContext.put.headers = %%-fetch-option-headers-%%
### option: ApiRequestContext.put.data = %%-fetch-option-data-%%
### option: ApiRequestContext.put.form = %%-fetch-option-form-%%
### option: ApiRequestContext.put.multipart = %%-fetch-option-multipart-%%
### option: ApiRequestContext.put.timeout = %%-fetch-option-timeout-%%
### option: ApiRequestContext.put.failOnStatusCode = %%-fetch-option-failonstatuscode-%%
### option: ApiRequestContext.put.ignoreHTTPSErrors = %%-context-option-ignorehttpserrors-%%
## async method: ApiRequestContext.storageState
- returns: <[Object]>
- `cookies` <[Array]<[Object]>>

View File

@ -297,6 +297,32 @@ Emulates consistent viewport for each page. Defaults to an 1280x720 viewport. Us
Emulates consistent window screen size available inside web page via `window.screen`. Is only used when the
[`option: viewport`] is set.
## fetch-param-url
- `url` <[string]>
Target URL.
## fetch-option-params
- `params` <[Object]<[string], [string]>>
Query parameters to be send with the URL.
## fetch-option-headers
- `headers` <[Object]<[string], [string]>>
Allows to set HTTP headers.
## fetch-option-timeout
- `timeout` <[float]>
Request timeout in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
## fetch-option-failonstatuscode
- `failOnStatusCode` <[boolean]>
Whether to throw on response codes other than 2xx and 3xx. By default response object is returned
for all status codes.
## fetch-option-form
- `form` <[Object]<[string], [string]|[float]|[boolean]>>

View File

@ -46,6 +46,9 @@ type NewContextOptions = Omit<channels.PlaywrightNewRequestOptions, 'extraHTTPHe
storageState?: string | StorageState,
};
type RequestWithBodyOptions = Omit<FetchOptions, 'method'>;
type RequestWithoutBodyOptions = Omit<RequestWithBodyOptions, 'data'|'form'|'multipart'>;
export class Fetch implements api.ApiRequest {
private _playwright: Playwright;
constructor(playwright: Playwright) {
@ -81,28 +84,48 @@ export class FetchRequest extends ChannelOwner<channels.FetchRequestChannel, cha
});
}
async get(
url: string,
options?: {
params?: { [key: string]: string; };
headers?: { [key: string]: string; };
timeout?: number;
failOnStatusCode?: boolean;
ignoreHTTPSErrors?: boolean,
}): Promise<FetchResponse> {
async delete(url: string, options?: RequestWithoutBodyOptions): Promise<FetchResponse> {
return this.fetch(url, {
...options,
method: 'DELETE',
});
}
async head(url: string, options?: RequestWithoutBodyOptions): Promise<FetchResponse> {
return this.fetch(url, {
...options,
method: 'HEAD',
});
}
async get(url: string, options?: RequestWithoutBodyOptions): Promise<FetchResponse> {
return this.fetch(url, {
...options,
method: 'GET',
});
}
async post(url: string, options?: Omit<FetchOptions, 'method'>): Promise<FetchResponse> {
async patch(url: string, options?: RequestWithBodyOptions): Promise<FetchResponse> {
return this.fetch(url, {
...options,
method: 'PATCH',
});
}
async post(url: string, options?: RequestWithBodyOptions): Promise<FetchResponse> {
return this.fetch(url, {
...options,
method: 'POST',
});
}
async put(url: string, options?: RequestWithBodyOptions): Promise<FetchResponse> {
return this.fetch(url, {
...options,
method: 'PUT',
});
}
async fetch(urlOrRequest: string | api.Request, options: FetchOptions = {}): Promise<FetchResponse> {
return this._wrapApiCall(async (channel: channels.FetchRequestChannel) => {
const request: network.Request | undefined = (urlOrRequest instanceof network.Request) ? urlOrRequest as network.Request : undefined;

View File

@ -134,7 +134,7 @@ export abstract class FetchRequest extends SdkObject {
}
let postData;
if (['POST', 'PUSH', 'PATCH'].includes(method))
if (['POST', 'PUT', 'PATCH'].includes(method))
postData = serializePostData(params, headers);
else if (params.postData || params.jsonData || params.formData || params.multipartData)
throw new Error(`Method ${method} does not accept post data`);

View File

@ -130,7 +130,7 @@ it('should add session cookies to request', async ({ context, server }) => {
expect(req.headers.cookie).toEqual('username=John Doe');
});
for (const method of ['get', 'post', 'fetch']) {
for (const method of ['fetch', 'delete', 'get', 'head', 'patch', 'post', 'put']) {
it(`${method} should support queryParams`, async ({ context, server }) => {
let request;
const url = new URL(server.EMPTY_PAGE);

View File

@ -38,7 +38,7 @@ it.afterAll(() => {
http.globalAgent = prevAgent;
});
for (const method of ['get', 'post', 'fetch']) {
for (const method of ['fetch', 'delete', 'get', 'head', 'patch', 'post', 'put']) {
it(`${method} should work`, async ({ playwright, server }) => {
const request = await playwright.request.newContext();
const response = await request[method](server.PREFIX + '/simple.json');
@ -49,7 +49,7 @@ for (const method of ['get', 'post', 'fetch']) {
expect(response.url()).toBe(server.PREFIX + '/simple.json');
expect(response.headers()['content-type']).toBe('application/json; charset=utf-8');
expect(response.headersArray()).toContainEqual({ name: 'Content-Type', value: 'application/json; charset=utf-8' });
expect(await response.text()).toBe('{"foo": "bar"}\n');
expect(await response.text()).toBe(method === 'head' ? '' : '{"foo": "bar"}\n');
});
it(`should dispose global ${method} request`, async function({ playwright, context, server }) {

235
types/types.d.ts vendored
View File

@ -11721,6 +11721,40 @@ export interface ApiRequest {
* logged in and vice versa.
*/
export interface ApiRequestContext {
/**
* Sends HTTP(S) [DELETE](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/DELETE) request and returns its
* response. The method will populate request cookies from the context and update context cookies from the response. The
* method will automatically follow redirects.
* @param url Target URL.
* @param options
*/
delete(url: string, options?: {
/**
* Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes.
*/
failOnStatusCode?: boolean;
/**
* Allows to set HTTP headers.
*/
headers?: { [key: string]: string; };
/**
* Whether to ignore HTTPS errors when sending network requests. Defaults to `false`.
*/
ignoreHTTPSErrors?: boolean;
/**
* Query parameters to be send with the URL.
*/
params?: { [key: string]: string; };
/**
* Request timeout in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
*/
timeout?: number;
}): Promise<ApiResponse>;
/**
* All responses received through
* [apiRequestContext.fetch(urlOrRequest[, options])](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-fetch),
@ -11734,9 +11768,9 @@ export interface ApiRequestContext {
dispose(): Promise<void>;
/**
* Sends HTTP(S) fetch and returns its response. The method will populate fetch cookies from the context and update context
* cookies from the response. The method will automatically follow redirects.
* @param urlOrRequest Target URL or Request to get all fetch parameters from.
* Sends HTTP(S) request and returns its response. The method will populate request cookies from the context and update
* context cookies from the response. The method will automatically follow redirects.
* @param urlOrRequest Target URL or Request to get all parameters from.
* @param options
*/
fetch(urlOrRequest: string|Request, options?: {
@ -11770,7 +11804,8 @@ export interface ApiRequestContext {
ignoreHTTPSErrors?: boolean;
/**
* If set changes the fetch method (e.g. PUT or POST). If not specified, GET method is used.
* If set changes the fetch method (e.g. [PUT](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) or
* [POST](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)). If not specified, GET method is used.
*/
method?: string;
@ -11803,14 +11838,15 @@ export interface ApiRequestContext {
params?: { [key: string]: string; };
/**
* Request timeout in milliseconds.
* Request timeout in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
*/
timeout?: number;
}): Promise<ApiResponse>;
/**
* Sends HTTP(S) GET request and returns its response. The method will populate fetch cookies from the context and update
* context cookies from the response. The method will automatically follow redirects.
* Sends HTTP(S) [GET](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET) request and returns its response. The
* method will populate request cookies from the context and update context cookies from the response. The method will
* automatically follow redirects.
* @param url Target URL.
* @param options
*/
@ -11836,14 +11872,120 @@ export interface ApiRequestContext {
params?: { [key: string]: string; };
/**
* Request timeout in milliseconds.
* Request timeout in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
*/
timeout?: number;
}): Promise<ApiResponse>;
/**
* Sends HTTP(S) fetch and returns its response. The method will populate fetch cookies from the context and update context
* cookies from the response. The method will automatically follow redirects.
* Sends HTTP(S) [HEAD](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD) request and returns its response.
* The method will populate request cookies from the context and update context cookies from the response. The method will
* automatically follow redirects.
* @param url Target URL.
* @param options
*/
head(url: string, options?: {
/**
* Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes.
*/
failOnStatusCode?: boolean;
/**
* Allows to set HTTP headers.
*/
headers?: { [key: string]: string; };
/**
* Whether to ignore HTTPS errors when sending network requests. Defaults to `false`.
*/
ignoreHTTPSErrors?: boolean;
/**
* Query parameters to be send with the URL.
*/
params?: { [key: string]: string; };
/**
* Request timeout in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
*/
timeout?: number;
}): Promise<ApiResponse>;
/**
* Sends HTTP(S) [PATCH](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) request and returns its response.
* The method will populate request cookies from the context and update context cookies from the response. The method will
* automatically follow redirects.
* @param url Target URL.
* @param options
*/
patch(url: string, options?: {
/**
* Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and
* `content-type` header will be set to `application/json` if not explicitly set. Otherwise the `content-type` header will
* be set to `application/octet-stream` if not explicitly set.
*/
data?: string|Buffer|Serializable;
/**
* Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes.
*/
failOnStatusCode?: boolean;
/**
* Provides an object that will be serialized as html form using `application/x-www-form-urlencoded` encoding and sent as
* this request body. If this parameter is specified `content-type` header will be set to
* `application/x-www-form-urlencoded` unless explicitly provided.
*/
form?: { [key: string]: string|number|boolean; };
/**
* Allows to set HTTP headers.
*/
headers?: { [key: string]: string; };
/**
* Whether to ignore HTTPS errors when sending network requests. Defaults to `false`.
*/
ignoreHTTPSErrors?: boolean;
/**
* Provides an object that will be serialized as html form using `multipart/form-data` encoding and sent as this request
* body. If this parameter is specified `content-type` header will be set to `multipart/form-data` unless explicitly
* provided. File values can be passed either as [`fs.ReadStream`](https://nodejs.org/api/fs.html#fs_class_fs_readstream)
* or as file-like object containing file name, mime-type and its content.
*/
multipart?: { [key: string]: string|number|boolean|ReadStream|{
/**
* File name
*/
name: string;
/**
* File type
*/
mimeType: string;
/**
* File content
*/
buffer: Buffer;
}; };
/**
* Query parameters to be send with the URL.
*/
params?: { [key: string]: string; };
/**
* Request timeout in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
*/
timeout?: number;
}): Promise<ApiResponse>;
/**
* Sends HTTP(S) [POST](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) request and returns its response.
* The method will populate request cookies from the context and update context cookies from the response. The method will
* automatically follow redirects.
* @param url Target URL.
* @param options
*/
@ -11906,7 +12048,78 @@ export interface ApiRequestContext {
params?: { [key: string]: string; };
/**
* Request timeout in milliseconds.
* Request timeout in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
*/
timeout?: number;
}): Promise<ApiResponse>;
/**
* Sends HTTP(S) [PUT](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) request and returns its response. The
* method will populate request cookies from the context and update context cookies from the response. The method will
* automatically follow redirects.
* @param url Target URL.
* @param options
*/
put(url: string, options?: {
/**
* Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and
* `content-type` header will be set to `application/json` if not explicitly set. Otherwise the `content-type` header will
* be set to `application/octet-stream` if not explicitly set.
*/
data?: string|Buffer|Serializable;
/**
* Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes.
*/
failOnStatusCode?: boolean;
/**
* Provides an object that will be serialized as html form using `application/x-www-form-urlencoded` encoding and sent as
* this request body. If this parameter is specified `content-type` header will be set to
* `application/x-www-form-urlencoded` unless explicitly provided.
*/
form?: { [key: string]: string|number|boolean; };
/**
* Allows to set HTTP headers.
*/
headers?: { [key: string]: string; };
/**
* Whether to ignore HTTPS errors when sending network requests. Defaults to `false`.
*/
ignoreHTTPSErrors?: boolean;
/**
* Provides an object that will be serialized as html form using `multipart/form-data` encoding and sent as this request
* body. If this parameter is specified `content-type` header will be set to `multipart/form-data` unless explicitly
* provided. File values can be passed either as [`fs.ReadStream`](https://nodejs.org/api/fs.html#fs_class_fs_readstream)
* or as file-like object containing file name, mime-type and its content.
*/
multipart?: { [key: string]: string|number|boolean|ReadStream|{
/**
* File name
*/
name: string;
/**
* File type
*/
mimeType: string;
/**
* File content
*/
buffer: Buffer;
}; };
/**
* Query parameters to be send with the URL.
*/
params?: { [key: string]: string; };
/**
* Request timeout in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
*/
timeout?: number;
}): Promise<ApiResponse>;