TypeScript 中的 Http 请求
Posted
技术标签:
【中文标题】TypeScript 中的 Http 请求【英文标题】:Http Request in TypeScript 【发布时间】:2018-01-26 15:47:15 【问题描述】:我试图将 nodejs 中的以下 sn-p 转换为 typescript:How do I make Http Request in Nodejs
这是我的 TypeScript 代码:
import * as http from 'http';
export class HttpRequest
url: string;
private path: string;
private host: string;
private args: Array<Array<string>>;
constructor(url: string, args?: string)
this.url = url;
this.processUrl(this.url);
if(!!args)
this.processArgs(args);
this.args = [];
private processUrl(url: string): void
let tld: number = url.lastIndexOf('.')
let sep: number = url.indexOf('/', tld);
this.host = url.slice(0, sep);
this.path = url.slice(sep+1);
private processArgs(args: string): void
let sep: number = args.indexOf('&');
if(sep < 0)
return ;
let argpair: string = args.slice(0, sep);
let apsep: number = argpair.indexOf('=');
let k: string = argpair.slice(0, apsep);
let v: string = argpair.slice(apsep+1);
this.args.push([k,v]);
this.processArgs(args.slice(sep+1));
private preparePath(): string
let path: string = `?`;
this.args.forEach((arg: Array<string>, i: number): void =>
let k: string = arg[0];
let v: string = arg[1];
path += k + '=' + v;
if(i == this.args.length-1)
return ;
path += '&';
);
return path;
public addArg(key: string, value: string): void
try
this.args.push([key,value]);
catch(err)
console.log(err);
public addArgs(args: Array<Array<string>>): void
args.forEach((arg: Array<string>): void =>
this.args.push(arg);
);
public get(cb: (res: any) => any): void
let opts =
'host': this.host,
'path': `/$this.path/$this.preparePath()`
;
http.request(opts, (r: http.IncomingMessage): void =>
let data = '';
r.on('data', (chunk: string): void =>
console.log('Got chunk: ' + chunk);
data += chunk;
);
r.on('end', (): void =>
console.log('Response has ended');
console.log(data);
cb(data);
);
r.on('error', (err): void =>
console.log('Following error occured during request:\n');
console.log(err);
)
).end();
public test(): void
console.log(this.preparePath());
console.log(`/$this.path/$this.preparePath()`);
这是我的测试代码:
// Test httpRequest
import HttpRequest from './httpRequest';
const request = new HttpRequest('www.random.org/integers');
request.addArg('num', '1');
request.addArg('min', '1');
request.addArg('max', '50');
request.addArg('col', '1');
request.addArg('base', '10');
request.addArg('format', 'plain');
request.addArg('rnd', 'new');
request.test();
request.get((res: string): void =>
console.log('Response received: ' + res);
);
如果这工作正常(我检查了 Firefox 上的链接,它返回一个纯文本随机数)我应该得到一个纯文本数字。但是,当我console.log()
回复时,我什么也得不到。我在这里做错了什么?
【问题讨论】:
您的网址前可能至少需要http://
【参考方案1】:
我建议使用https://github.com/node-fetch/node-fetch
import fetch from 'node-fetch';
const response = await fetch('https://api.github.com/users/github');
const data = await response.json();
console.log(data);
对于 POST 请求:
import fetch from 'node-fetch';
const response = await fetch('https://bin.org/post', method: 'POST', body: 'a=1');
const data = await response.json();
console.log(data);
【讨论】:
error TS1308: 'await' expression is only allowed within an async function.
@xged 没错,要使用异步/等待,您必须将代码包装在异步函数中。否则你必须写例如request.get(options).then((result: string) => console.log(result)); Adrian:当我在 uri 前面加上 https 时,它可以工作。没有可用的类型定义,是吗?
但是对于发送 HTTP 请求,我认为 axios 是一种更好的选择......
自 2020 年 2 月 11 日起,请求已完全弃用。
库已被创建者弃用:截至 2020 年 2 月 11 日,请求已完全弃用。预计不会出现新的变化。事实上,已经有一段时间没有人登陆了。这个包也被弃用了,因为它依赖于请求。【参考方案2】:
尽管request-promise-native
可能工作得很好,但Axios 是在 TypeScript 中使用的一种更好的替代方案。它有自己的类型定义,总体上不太依赖其他包。使用它的 API 很像 Adrian 提供的答案,但是有一些细微的差别。
const url: string = 'your-url.example';
try
const response = await axios.get(url);
catch (exception)
process.stderr.write(`ERROR received from $url: $exception\n`);
如果您希望客户端处理异常,显然可以省略 try/catch 语句。
【讨论】:
我同意你的看法。自从这个问题以来,我一直在使用 axios,并且我已经在许多项目中舒适地使用它。感谢您的建议。【参考方案3】:试试这个:
var request = require('request');
request('www.random.org/integers', function (error, response, body)
console.log(response.statusCode);
cb(response.statusCode);
);
谢谢!
【讨论】:
@Shubham 我正在尝试在 typescript 中获得解决方案,而不是 vanilla js 这个解决方案是打字稿,或者你可以访问:npmjs.com/package/request#forms @Shubham 我知道请求模块有一个类型文件。我不想使用请求。我正在尝试仅使用标准节点模块编写类似于 request 的内容。所以,这对我没有帮助。 不知道为什么只使用 request 的解决方案被埋没了,而使用 request 和 request-promise-native 的解决方案得到了赞扬......无论如何,现在不推荐使用 request以上是关于TypeScript 中的 Http 请求的主要内容,如果未能解决你的问题,请参考以下文章
TypeScript/angularJS HTTP GET 请求中的范围
Http请求中Accept、Content-Type讲解以及在Spring MVC中的应用