-2
votes

comment convertir api post-appel ajax en angular8

Client donné ci-dessous l'appel Ajax Post, lorsque j'ouvrirai le fichier api PHP dans le navigateur, les données statiques s'insèrent correctement, maintenant j'essaye d'utiliser Angular, mais je ne suis pas en mesure de comprendre comment convertir cet appel ci-dessous en component.ts et un service

  fetchData(url: string, data: any): Observable<any> {
    const headers = {
    
    Authorization: "Bearer "+"1234",
     "My-Custom-Header": "foobar",
    contentType: "application/json"
    };

   return this.http.post(url, data, {
    headers
    });
   }

J'ai mis à jour la question et ajouté après deux réponses

Ci-dessous ma classe de modèle

import { Schedule1 } from '../Models/Schedule1.model'


   Schedule1: Schedule1 = new Schedule1();

    addSchedule(scheduleForm: NgForm): void {

    //static data parameter passing
    this.Schedule1.classTitle='hi Class on 3rd April, 2020';
    this.Schedule1.classInfo= 'This is a demo class scheduled to understand API';
    this.Schedule1.classDateTime= '2020-11-12 11:30 AM';
    this.Schedule1.timezone= 'Asia/Kolkata';
    this.Schedule1.classDuration= 15;
    this.Schedule1.classRecording= 'yes';
    this.Schedule1.classAutoStart= false;
    this.Schedule1.recordingAutoStart= false;
    this.Schedule1.classVideoRes= 720;


    //const data = JSON.stringify(this.Schedule1);
    const data = { 
    apiKey: "dcbf187d-bdfe-431b-8f60-fa19bf51cd85", 
    data:  JSON.stringify(this.Schedule1)
    } 

    this.subscription = this.userSvc
    .fetchData("https: //xyz.com/client/schedule", data)
    .subscribe(
    data => {
    // Data on Success
    console.log("data", data);
    },
    error => {
    console.log("error", error);
    }
    );

    }

Ci-dessous se trouve component.ts sur le clic du bouton passant des valeurs statiques

export class Schedule1 {

classTitle: string;
classInfo: string;
classDateTime: string;
timezone: string;
classDuration: number;
classRecording:string;
classAutoStart: boolean;
recordingAutoStart: boolean;
classVideoRes: number;
    
   constructor() {
    
      
   }

  }

Ci-dessous, service.ts

        <?php
    //creating payload parameters:
    $classTitle = 'Demo Class on 3rd April, 2020';
    $classInfo = 'This is a demo class scheduled to understand API';
    $classDateTime = '2020-11-12 11:30 AM';
    $timezone = 'Asia/Kolkata';
    $classDuration = 15;
    $classRecording = 'yes';
    $classAutoStart = false;
    $recordingAutoStart = false;
    $classVideoRes = 720;


    /*xyz.com*/
    $apiKey = '12345';
    $secretKey = '12345';

    // Create token header as a JSON string
    $header = json_encode(['alg' => 'HS256','typ' => 'JWT']); // ensure to place first alg part and next typ part

    // Create token payload as a JSON string
    $payload = json_encode(['classTitle' => $classTitle ,'classInfo' => $classInfo ,'classDateTime' => $classDateTime ,'timezone' => $timezone ,'classDuration' => $classDuration ,'classRecording' => $classRecording ,'classAutoStart' => $classAutoStart ,'recordingAutoStart' => $recordingAutoStart ,'classVideoRes' => $classVideoRes ,'apiKey' => $apiKey]);

    // Encode Header to Base64Url String
    $base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));

    // Encode Payload to Base64Url String
    $base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));

    // Create Signature Hash
    $signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, $secretKey , true);

    // Encode Signature to Base64Url String
    $base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));

    // creating JWT token variable
    $jwt_token = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;

    // creating authorization varibale
    $authorization = 'Bearer '.$jwt_token;

    ?>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script type="text/javascript">
        $.ajax
        ({
        type: "POST",
         url: 'https://xyz/client/schedule',
        contentType: 'application/json',
        data: JSON.stringify({
            "apiKey": "12345"
        }),
        dataType : 'json',
        headers: {
        'authorization': '<?php echo $authorization; ?>'
        },
        success: function(retval)
        {
        // alert(retval);
        console.log(retval);
        // var success = retval.success;
        }
        });
    </script>

dans la console obtenant cette erreur.

entrez la description de l'image ici


10 commentaires

Vous ne pouvez pas utiliser côté serveur avec un SPA angulaire comme <?php echo $authorization; ?>' cependant, le reste ne devrait pas être un problème. Utilisez server-side vues server-side ?


J'ai mis à jour la question complète. @Basheer Kharoti


@mohdmazharkhan votre API en php?


Client donné api en php, maintenant je convertis en passant angulaire à travers angulaire. @Kantivekariya


si j'appelle directement l'api php en angulaire, alors cela ne fonctionne pas, c'est pourquoi je convertis en api angulaire pour appeler api. @Kantivekariya


@mohdmazharkhan, vous devez transmettre le jeton valide dans l'api.


d'où j'obtiens un jeton valide?. client php api s'exécute dans le navigateur puis son fonctionnement et son insertion sur le serveur mais mon code angulaire ne fonctionne pas et 2 jours en arrière, j'ai appelé le fichier php direct en angular mais cela ne fonctionne pas c'est pourquoi je convertis @Kantivekariya


Il est utile d'essayer celui-ci stackoverflow.com/questions/26917889/...


Je sais comment passer un paramètre au script php qui ne fonctionne pas. @Kantivekariya


Comme il appelle le fichier php depuis angular, il ne s'insère pas non plus dans le serveur. @Kantivekariya


3 Réponses :


0
votes

Vous pouvez créer un service Like et appeler un composant.

services.ts

import { Component, OnInit } from '@angular/core';
import { UserService } from './services.ts';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})

export class Components implements OnInit {

 constructor(public userService: UserService){}

 public ngOnInit(): void {
    const data = { apiKey: "myapikey" }
    this.userService.getData(url, data).subscribe((res)=>{
     code...
    })
    
  }
}

components.ts

import { HttpClient, HttpHeaders } from '@angular/common/http';

@Injectable({
    providedIn: "root"
})

export class UserService{

  constructor(public http: HttpClient){}

 let headers = new HttpHeaders({
    'Content-Type': 'application/json',
    'Authorization': ''
 });

  public getData(url: string, data: any): Observable<any> {
        return this.http.post(url, data, { headers: headers});
  }
}


9 commentaires

Pouvez-vous appeler cette méthode dans component.ts?. @ Kanti vekariya


comment passer la clé API. @anti vekariya


La clé API que vous pouvez transmettre des données telles que { apiKey: "myapikey" }


où je dois passer la clé api, pouvez-vous ajouter ce code également. @Kanti vekariya


À l'intérieur de component.ts, vous ajoutez simplement const data = {apiKey: "myapikey"} je mets à jour le code que vous vérifiez.


est-ce utile? @mohdmazharkhan


je vérifie vous mettra à jour, mais comment passer l'objet sur le bouton cliquez sur passer l'objet de paramètres lorsque je dois passer, j'ai un calendrier d'appel d'objet où je dois ajouter cet objet. @Kanti vekariya


Continuons cette discussion en chat .


@Kantivekariya Forbidden error signifie que vous n'êtes pas autorisé à accéder à cette URL. Passez plutôt l'en-tête d' Authorization valide



0
votes

créez un service comme ci-dessous.

import { Component, OnDestroy, OnInit, VERSION } from "@angular/core";
import { ScheduleDataService } from "./schedule-data.service.ts";

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent implements OnInit, OnDestroy {
  name = "Angular " + VERSION.major;

  private subscription;
  constructor(private _scheduleDataService: ScheduleDataService) {}

  ngOnInit() {
    this.subscription = this._scheduleDataService
      .fetchData("https://xyz/client/schedule", {
        apiKey: "myapikey"
      })
      .subscribe(
        data => {
          // Data on Success
          console.log("data", data);
        },
        error => {
          console.log("error", error);
        }
      );
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}

alors vous pouvez appeler ce service dans votre composant comme ci-dessous.

import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Observable } from "rxjs";

@Injectable({
  providedIn: "root"
})
export class ScheduleDataService {
  constructor(private _http: HttpClient) {}

  fetchData(url: string, data: any): Observable<any> {
    const headers = {
      Authorization: "Bearer my-token",
      "My-Custom-Header": "foobar",
      contentType: "application/json"
    };

    return this._http.post(url, data, {
      headers
    });
  }
}

Faites-moi savoir si vous avez le moindre doute.


6 commentaires

comment passer un objet de paramètres pour publier des données dans le composant ci-dessus. @Piyush Jain


2ème argument de la méthode d'extraction de données


const data = {apiKey: "myip", data: this.Schedule} this.subscription = this.userSvc.fetchData (" xyz / client / schedule ", data) .subscribe (data => {// Data on Success console. log ("données", données);}, erreur => {console.log ("erreur", erreur);}); } est-ce correct. @Piyush Jain


Quelle est la valeur de this.schedule?


Peut-on discuter maintenant. @Piyush Jain


J'ai mis à jour la question, veuillez vérifier et confirmer pour le chat en direct. @Piyush Jain



3
votes

L'analyse des requêtes HTTP est assez simple dans Angular. Voici les étapes à suivre:

Étape 1:

importez le HttpClientModule dans votre module d'application comme ceci:

providers: [
  { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }
]

Étape 2:

Créez un service pour votre application dans lequel vous stockerez tous les appels de requête HTTP.

REMARQUE: Cette partie n'est pas nécessaire car vous pouvez effectuer des appels HTTP directement dans votre composant, mais pour les meilleures pratiques et une bonne structure, cela doit être suivi

Donc pour cette étape, importez HttpClient soit dans votre service (si vous l'avez créé), soit dans votre composant, puis procédez comme suit:

import { HttpInterceptor, HttpErrorResponse, HttpEvent, HttpRequest, HttpHandler } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { catchError } from 'rxjs/operators';
import { Observable, of } from 'rxjs';
import { Router } from '@angular/router';
import { Service } from 'service.service';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

    constructor(private router: Router, private service: Service) { }

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        if (sessionStorage.getItem('token')) {
            const cloned = req.clone({
                headers: req.headers.set('Authorization', 'Bearer ' + sessionStorage.getItem('token'))
            });
            return next.handle(cloned).pipe(
                catchError((err, caught: Observable<HttpEvent<any>>) => {
                    if (err instanceof HttpErrorResponse && (err.status == 401)) 
                    {
                        this.adminAuthService.clearAuthData();
                        this.router.navigate(['required route path']);
                        alert('Session Timeout !! Login Again');
                        return of(err as any);
                    }
                    throw err;
                })
            );
        }
        return next.handle(req);
    }
}

Laissez-moi vous expliquer la méthode createExamCategory() . Les data paramètre sont la valeur provenant de votre HTML ou de n'importe quelle source. Et ces data seront transmises dans la requête POST . La ligne suivante est comme je l'explique avec le service, je viens de retourner l'appel et je m'y subscribe dans le composant. Le <{ message: string }> est la réponse que j'obtiens de la demande d'API. Si vous n'êtes pas sûr de la réponse que vous obtenez, vous pouvez simplement la conserver comme <any> et Angular décidera du type de réponse. Ensuite, dans la méthode de post (cette méthode provient de HttpClient déclaré ci-dessus), nous avons 2 passes aux paramètres par défaut et le troisième paramètre qui est HttpHeader est facultatif. Les 2 paramètres sont:

  1. URL de l'API.
  2. Les données du corps de la requête pour la requête POST .

C'est donc tout du côté appelant maintenant à la partie abonnement:

Si vous écrivez directement la partie ci-dessus dans le composant, continuez avec .subscribe() . Maintenant pour la partie service:

Étape 1: Importez le service:

import { SampleService } from 'sample.service';

constructor(private service: SampleService) { }

// Do the call where it is required. I am doing in a normal method

httpMethod() {
  this.service.subscribe(response => {
    console.log(response); // This is the API response
  });
}

Intercepteur

import { HttpClient } from '@angular/common/http';

constructor(private http: HttpClient) { }

createExamCategory(data) {
  return this.http.post<{ message: string }>(this.url + '/category/create_exam', data);
}

Ici, ce que j'ai fait, c'est lors de la connexion / authentification, j'ai stocké le jeton JWT généré par le service backend en session et validé si l'URL de l'API est valide ou non.

Après avoir fait cela dans app.module.ts, spécifiez l'intercepteur dans les providers comme ceci:

import { HttpClientModule } from '@angular/common/http';
imports: [ HttpClientModule ]

En espérant que cela vous aidera 🠙 ‚


7 commentaires

le troisième paramètre seul le problème à passer pouvez-vous écrire avec la troisième option également comme question ci-dessus Jeton JWT passant avec apikey s'il vous plaît vérifier le code de la question ci-dessus dans le code php. @Avishek Datta Ray


@mohdmazharkhan la troisième option que je voulais dire à propos de la partie en-têtes. Je mets à jour la réponse, jetez-y un œil. Ce que je vais faire est plutôt que de passer JWT ici, utilisez un intercepteur qui vérifiera si l'URL de l'API est valide par rapport au jeton JWT


Je n'ai pas plus d'expérience en angular angular récemment démarré, veuillez mettre à jour complètement la réponse ou pouvons-nous discuter maintenant. @Avishek Datta Ray


J'ai frappé depuis 10 jours s'il vous plaît aidez-moi, j'ai besoin de soumettre des paramètres au serveur, lequel est facile à mettre à jour votre réponse. @Avishek Datta Ray


sûr que nous pouvons aller avec le chat


github.com/barefacedbear/mean-practice Voici un exemple de projet pour angular bien que le backend soit dans Node cela peut vous aider beaucoup


Continuons cette discussion en chat .