J'essaie d'appeler un service, ça marche dans DHC, mais quand j'essaie d'appeler mon projet angular 2, ça plante, la demande de méthode est POST, reçoit un objet de body qui a un email et un mot de passe, et la réponse est un jeton, que je vais utiliser dans tout le projet pour autorisation.
Voici mon code.
import { Injectable } from '@angular/core';
import { Http, Response, Headers, Request ,RequestOptions ,RequestMethod } from '@angular/http';
import {Observable} from 'rxjs/Rx';
import 'rxjs/add/operator/map';
@Injectable()
export class LoginService {
constructor(private http:Http) {
}
getToken(){
var baseUrl = "xxx.xxx.x.xxx:xxxx/project/v1/admin/login";
var headers = new Headers();
headers.append("Content-Type", 'application/json');
var options = new RequestOptions({ headers: headers });
var objeto = {'email': 'xxxxxx', 'pass':'xxxx' }
var body2 = JSON.stringify(objeto);
var xhr = new XMLHttpRequest();
return this.http
.post(baseUrl, body2, options)
.map((response: Response) => response.json())
.subscribe(
data => console.log('Success uploading the opinion '+ data, data),
error => console.error(`Error: ${error}`)
);
}
}
J'essaie d'implémenter XMLHttp Request call from angular 2, mais l'erreur est la même, je ne sais pas si je peux l'utiliser en angular 2, voici la méthode
return Observable.fromPromise(new Promise((resolve, reject) => {
// let formData: any = new FormData();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
resolve(JSON.parse(xhr.response));
} else {
reject(xhr.response);
}
}
}
xhr.open("POST", baseUrl, true);
xhr.send(body2);
}));
Si c'est un 192.168..
type d'URL, vous devez ajouter un http://
ou https://
devant lui. Et vous devrez peut-être activer les options CORS côté serveur.
Dans mon cas, j'ai pu résoudre le problème en corrigeant l'URL de ma requête http du côté client au lieu de côté serveur, comme indiqué par echonax comme manquant http://
Dans localhost
.
Mon problème était, dans ma demande this.http.get(this.domain + '/api/prod/' + id).map(res => res.json())
Il me manquait un /
À l'avant de api
. Ce devrait être /api
si vous utilisez localhost, utilisez uniquement http: // avant votre localhost
Un autre contexte dans lequel cette erreur peut survenir est lié à l'utilisation d'intercepteurs pour définir un chemin de base. Quelque chose comme ce qui suit:
@Injectable()
export class WithCredentialsInterceptor implements HttpInterceptor {
constructor(private logger: LoggingService) {
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// one way is to except / include only some urls by checking request.url
const clonedRequest = request.clone({
withCredentials: true
});
// this.logger.logTrace("Sending with credentials request: ", request.urlWithParams);
return next.handle(clonedRequest);
}
}
Si cet intercepteur se déclenche lorsqu'une demande adressant une URL http/https complète est fournie au client http, il créera une URL non valide.
Scénarios possibles:
Votre format d'api est incorrect, il devrait être par exemple: http: localhost: 8080/
Dans votre API, vous n'avez pas activé CORS , de sorte qu'il n'accepte pas vos demandes.
Il vous manque le caractère / à la fin, dans mon cas, j'avais http: localhost: 808 et ne fonctionnait pas à cause du caractère manquant / = à la fin
Vous utilisez http au lieu de https ou l'inverse
Vous créez de manière incorrecte la demande de vos informations d'identification dans l'API. Cela peut être causé par des erreurs dans le code de la demande provenant de la partie frontale (angulaire, réactif, ...).