Ky是一个基于浏览器获取API的小巧优雅的HTTP客户端

2022-02-25 15:16:46

Ky的目标是现代浏览器和Deno。对于较旧的浏览器,您需要传输并使用fetch polyfill和globalThis polyfill。用于节点。js,看看我有什么。对于同构需求(如SSR),请查看ky universal。

从'进口ky;肯塔基州;const json=wait ky。帖子(';https://example.com' , {json:{foo:true}})。json();安慰日志(json)//=>`{数据:';🦄'}`

类HTTPError扩展了错误{}const response=wait fetch(';https://example.com' , {method:';POST';,body:JSON.stringify({foo:true}),headers:{';content type';:';application/JSON';});如果(!response.ok){throw new HTTPError(`Fetch error:${response.statusText}`);}const json=等待响应。json();安慰日志(json)//=>`{数据:';🦄'}`

如果您使用的是Deno,请从URL导入Ky。例如,使用CDN:

默认情况下,credentials选项是同源的,这也是规范中的默认选项,但并非所有浏览器都能跟上。

返回一个响应对象,为方便起见添加了Body方法。例如,您可以调用ky.get(输入)。直接使用json(),而不必先等待响应。当这样调用时,将根据所使用的body方法设置适当的Accept头。与窗口的主体方法不同。取来如果响应状态不在200。。。299.此外。如果响应状态为204,json()将返回一个空字符串,而不是由于正文为空而引发解析错误。

当使用请求实例作为输入时,任何URL更改选项(如prefixUrl)都将被忽略。

在内部,标准方法(GET、POST、PUT、PATCH、HEAD和DELETE)是大写的,以避免因区分大小写而导致服务器错误。

发送JSON的快捷方式。使用此选项而不是body选项。接受任何简单的对象或值,即JSON。stringify()';d,并以正确的标题集发送到正文中。

类型:字符串|对象<;字符串,字符串|数字|布尔值>;|阵列<;阵列<;字符串|数字|布尔值>>;|URLSearchParams默认值:''

搜索要包含在请求URL中的参数。设置此选项将覆盖输入URL中的所有现有搜索参数。

发出请求时在输入URL前加前缀。它可以是任何有效的URL,无论是相对的还是绝对的。尾随斜杠/是可选的,如果需要,将在与输入连接时自动添加。仅当输入为字符串时生效。使用此选项时,输入参数不能以斜杠/开头。

从'进口ky;肯塔基州';;//在…上https://example.comconst response=wait ky(';unicorn';,{prefixUrl:';/api';})//=>'https://example.com/api/unicorn' const response2=wait ky(';独角兽';,{prefixUrl:';https://cats.com' } ) ; //=>'https://cats.com/unicorn'

prefixUrl和input连接后,根据页面的基本URL(如果有)解析结果。

如果使用此选项来增强一致性并避免对输入URL的处理方式产生混淆,则不允许在输入中使用前导斜杠,因为在使用prefixUrl时,输入不会遵循正常的URL解析规则,这会更改前导斜杠的含义。

表示最大重试次数、允许的方法、允许的状态代码和最大重试时间的限制、方法、状态代码和maxRetryAfter字段的对象。

如果retry是一个数字,它将被用作限制,其他默认值将保持不变。

如果maxRetryAfter设置为undefined,它将使用选项。暂停。如果Retry After标头大于maxRetryAfter,它将取消请求。

使用函数0.3*(2**(retry-1))*1000计算重试之间的延迟,其中retry是尝试次数(从1开始)。

从'进口ky;肯塔基州;const json=wait ky(';https://example.com' , {重试:{limit:10,methods:[';get';],状态代码:[413]})。json();

获取响应(包括重试)的超时(毫秒)。不能大于2147483647。如果设置为false,则不会超时。

钩子允许在请求生命周期中进行修改。钩子函数可以是异步的,并且可以串行运行。

这个钩子使您能够在发送请求之前修改请求。在这之后,Ky不会对请求做进一步的更改。钩子函数接收请求和选项作为参数。例如,您可以修改请求。这里是标题。

钩子可以返回一个请求来替换传出的请求,或者返回一个响应来完全避免发出HTTP请求。这可以用来模拟请求、检查内部缓存等。从这个钩子返回请求或响应时,一个重要的考虑因素是,将跳过所有剩余的beforeRequest钩子,因此您可能只希望从最后一个钩子返回它们。

从'进口ky;肯塔基州;常数api=ky。扩展({hooks:{beforeRequest:[request=>;{request.headers.set(';X-request-With';,';ky';); } ] } } ) ; const response=等待api。获得(';https://example.com/api/users' ) ;

这个钩子允许您在重试之前修改请求。在这之后,Ky不会对请求做进一步的更改。钩子函数接收一个带有规范化请求和选项的对象、一个错误实例和重试计数。例如,您可以修改请求。这里是标题。

如果请求收到响应,则错误类型为HTTPError,并且响应对象在出现错误时可用。回答请注意,某些类型的错误(如网络错误)本质上意味着未收到响应。在这种情况下,错误将不是HTTPError的实例。

您可以通过抛出错误来防止Ky重试请求。Ky不会以任何方式处理它,错误将传播到请求发起方。在这种情况下,不会调用beforeRetry钩子的其余部分。或者,您可以返回ky.stop符号来执行相同的操作,但不会传播错误(这有一些限制,请参阅ky.stop docs了解详细信息)。

从'进口ky;肯塔基州;const response=wait ky(';https://example.com' , {hooks:{beforetry:[async({request,options,error,retryCount})=>;{const token=wait ky(';https://example.com/refresh-token' ) ;要求标题。set(';Authorization';,`token${token}`); } ] } } ) ;

这个钩子允许您在抛出HTTPError之前修改它。钩子函数接收HTTPError作为参数,并应返回HTTPError的实例。

从'进口ky;肯塔基州;等待ky(';https://example.com' , {hooks:{beforeError:[error=>;{const{response}=error;if(response&;response.body){error.name=';GitHubError';error.message=`response.body.message}(${response.statusCode})`return error;});

这个钩子使您能够读取并有选择地修改响应。钩子函数接收规范化的请求、选项和响应的克隆作为参数。Ky将使用钩子函数的返回值作为响应对象,如果它';这是一个回应的例子。

从'进口ky;肯塔基州;const response=wait ky(';https://example.com' , {hooks:{afterResponse:[(_-request,_-options,response)=>;{//您可以对响应执行一些操作,例如logging.log(response);//或者返回一个'response'实例来覆盖响应。返回新的响应(';另一个响应';,{status:200}) ;}、//或在403错误异步(请求、选项、响应)=>;{if(response.status==403){//Get a fresh token const token=wait ky(';https://example.com/token' ) . 文本();//使用令牌请求重试。标题。set(';Authorization';,`token${token}`);返回ky(请求); } } ] } } ) ;

在执行重定向后,如果响应具有非2xx状态代码,则抛出HTTPError。要同时抛出重定向而不是跟随重定向,请将重定向选项设置为';手册';。

如果您正在检查资源可用性,并且希望得到错误响应,那么将此设置为false可能会很有用。

注意:如果为false,则错误响应被视为成功,请求将不会重试。

progress对象包含以下元素:percent、transferredBytes和totalBytes。如果是';如果无法检索正文大小,则totalBytes将为0。

从'进口ky;肯塔基州;const response=wait ky(';https://example.com' , {onDownloadProgress:(progress,chunk)=>;{//示例输出://`0%-0/1271字节`/`100%-1271字节`控制台.log(${progress.percent*100}%-${progress.transferredBytes}的${progress.totalBytes}字节`); } } ) ;

从'进口ky;肯塔基州;从'进口伯恩@哈皮克斯/伯恩';const json=wait ky(';https://example.com' , {parseJson:text=>;伯恩(text)})。json();

可以使用删除标题。extend()通过传递带有未定义值的标头。仅当头来自Headers实例时,以字符串形式传递undefined会移除头。

从'进口ky;肯塔基州;const url=';https://sindresorhus.com' ; const original=ky。创建({headers:{rainbow:';rainbow';,unicorn:';unicorn';});常量扩展=原始。扩展({headers:{rainbow:undefined}});const response=await extended(url)。json();安慰日志(';彩虹';回应)//=>;假控制台。日志(';独角兽';回应)//=>;符合事实的

从'进口ky;肯塔基州';;//在…上https://my-site.com常数api=ky。创建({prefixUrl:';https://example.com/api' } ) ; const response=等待api。获取(';用户/123';)//=>'https://example.com/api/users/123' const response=等待api。get(';/status';,{prefixUrl:';';})//=>'https://my-site.com/status'

可由beforeRetry挂钩返回以停止重试的符号。这也会在重试前使剩余的挂钩短路。

注意:返回此符号将导致Ky中止,并返回未定义的响应。在访问响应上的任何属性或使用可选链接之前,请确保检查响应。它也与身体方法不兼容,例如。json()或。text(),因为没有解析响应。通常,我们建议抛出一个错误,而不是返回这个符号,因为这将导致Ky中止,然后抛出,从而避免这些限制。

ky.stop的一个有效用例是防止在请求副作用时重试,因为返回的数据并不重要。例如,将客户端活动记录到服务器。

从'进口ky;肯塔基州;const options={hooks:{beforeRetry:[async({request,options,error,retryCount})=>;{const shouldStopRetry=wait ky(';https://example.com/api' ) ;if(shouldStopRetry){return ky.stop;}}}]};//请注意,如果返回'ky.stop',响应将为'undefined'。const response=wait ky。帖子(';https://example.com' , 选项);//使用`。text()`或其他正文方法不受支持。const text=wait ky(';https://example.com' , 选项)。文本();

暴露在检查的瞬间。该错误具有响应对象的response属性、请求对象的request属性和规范化选项的options属性(在使用ky.create()创建实例时传递给ky,或者在执行请求时直接传递给ky)。

请求超时时引发的错误。它具有请求对象的请求属性。

以Ky格式发送表单数据与获取相同。只需将FormData实例传递给body选项。内容类型标题将自动设置为多部分/表单数据。

从'进口ky;肯塔基州';;//`多部分/表单数据`const formData=new formData();formData。附加(';食物';,';薯条';);formData。追加(';饮料';,';冰茶';);const response=wait ky。post(url,{body:formData});

如果要以application/x-www-form-urlencoded格式发送数据,则需要使用urlsearchparms对数据进行编码。

从'进口ky;肯塔基州';;//`application/x-www-form-urlencoded`const searchParams=new URLSearchParams();搜索参数。套餐(';食物';';薯条';);搜索参数。套餐(';饮料';';冰茶';);const response=wait ky。post(url,{body:searchParams});

Fetch(因此也是Ky)通过AbortController API内置了对请求取消的支持。阅读更多。

从'进口ky;肯塔基州;const controller=new AbortController();const{signal}=控制器;设置超时(()=>;{controller.abort();},5000 ) ; 尝试{console.log(等待ky(url,{signal})。text();}catch(error){if(error.name==';abortror';){console.log(';Fetch aborted';);}else{console.error(';Fetch error:';error);}

如何将其用于使用服务器端渲染(SSR)的web应用程序(React、Vue.js等)?

要么使用可以在浏览器中运行的测试运行程序,比如Mocha,要么使用AVA和ky universal。阅读更多。

确保代码作为JavaScript模块(ESM)运行,例如使用<;脚本类型=";模块34>;在HTML文档中添加标签。然后,该模块可以直接导入Ky,而无需绑定器或其他工具。

它';这只是我设法得到的一个随机简短的npm包名。然而,它在日语中有一个含义:

KY是一种可用于文本的俚语,是空気読めない (kuuki yomenai),字面意思是“看不见空气”它';这是一个短语,用来形容没有领会其中隐含的意思的人。