node.js - طلب Http في TypeScript


كنت أحاول تحويل الجزء التالي في Node.js إلى TypeScript: كيف أقوم بعمل طلب Http في Node.js

إليك كود 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);
});

إذا كان هذا يعمل بشكل صحيح (لقد تحققت من الرابط على فايرفوكس، وأعاد رقمًا عشوائيًا بنص عادي) يجب أن أحصل على رقم كنص عادي. ومع ذلك، عندما أستخدم console.log() للرد، لا أحصل على أي شيء. ماذا أفعل بشكل خاطئ هنا؟

الإجابة رقم 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);

الإجابة رقم 2

على الرغم من أن request-promise-native ربما يعمل بشكل جيد، فإن Axios هو بديل أفضل بكثير للاستخدام في TypeScript. يأتي مع تعريفاته الخاصة للأنواع وبشكل عام أقل اعتمادًا على الحزم الأخرى. استخدام واجهته البرمجية مشابه جدًا للإجابة التي قدمها 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 إذا كنت تريد أن يتم التعامل مع الاستثناء بواسطة العميل.