TypeScript 中的 Http 请求 [英] Http Request in TypeScript

查看:39
本文介绍了TypeScript 中的 Http 请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将 nodejs 中的以下代码段转换为打字稿:如何在 Nodejs 中发起 Http 请求

I was trying to convert the following snippet in nodejs to typescript: How do I make Http Request in Nodejs

这是我的 TypeScript 代码:

Here is my TypeScript code:

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() 响应时,我什么也没得到.我在这里做错了什么?

If this works correctly (I checked the link on Firefox and, it returns a plain text random number) I should get a number as a plain text. However, when I console.log() response, I get nothing. What am I doing wrong here?

推荐答案

即使 request-promise-native 可能工作得很好,Axios 是在 TypeScript 中使用的更好选择.它带有自己的类型定义,并且总体上较少依赖其他包.使用它的 API 与 Adrian 提供的答案非常相似,但存在一些细微差别.

Even though request-promise-native probably works just fine, Axios is a way better alternative for use in TypeScript. It comes with its own type definitions and is overall less dependent on other packages. Using it's API is quite like the answer provided by Adrian, however there are a few subtle differences.

const url: string = 'your-url.example';

try {
    const response = await axios.get(yourUrl);
} catch (exception) {
    process.stderr.write(`ERROR received from ${url}: ${exception}\n`);
}

显然,如果您希望客户端处理异常,您可以省略 try/catch 语句.

Obviously you can leave out the try/catch statement if you want the exception to be handled by the client.

这篇关于TypeScript 中的 Http 请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆