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 请求头中的Content-Type类型

Http请求中Accept、Content-Type讲解以及在Spring MVC中的应用

http请求头中的content-type属性

Http请求中Content-Type讲解以及在Spring MVC中的应用

http请求中的content-type