node.js - TypeScript'te HTTP İsteği
Aşağıdaki kod parçasını Nodejs'ten Typescript'e çevirmeye çalışıyordum: Nodejs'te Http İsteği Nasıl Yapılır
İşte benim TypeScript kodum:
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()}`);
}
}
İşte benim test kodum:
// 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);
});
Eğer bu doğru çalışıyorsa (linki Firefox'ta kontrol ettim ve düz metin rastgele sayı döndürüyor) düz metin olarak bir sayı almalıyım. Ancak, console.log() ile yanıtı yazdırdığımda hiçbir şey göremiyorum. Burada neyi yanlış yapıyorum?
Cevap #1
https://github.com/node-fetch/node-fetch kullanmanızı öneririm
import fetch from 'node-fetch';
const response = await fetch('https://api.github.com/users/github');
const data = await response.json();
console.log(data);
POST isteği için:
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);
Cevap #2
Her ne kadar request-promise-native muhtemelen gayet iyi çalışsa da, Axios TypeScript'te kullanmak için çok daha iyi bir alternatiftir. Kendi tip tanımlarıyla birlikte gelir ve genel olarak diğer paketlere daha az bağımlıdır. API'sini kullanmak, Adrian tarafından verilen cevaba oldukça benzer, ancak birkaç ince fark vardır.
const url: string = 'your-url.example';
try {
const response = await axios.get(url);
} catch (exception) {
process.stderr.write(`ERROR received from ${url}: ${exception}\n`);
}
Açıkça, istisnanın istemci tarafından ele alınmasını istiyorsanız try/catch ifadesini çıkartabilirsiniz.
