J'essaie de faire une demande de publication avec le corps et l'en-tête. Vous trouverez ci-dessous quelques-unes des variations que j'ai connues, mais pour la plupart, je reçois une erreur sur le serveur disant que le paramètre `` clé '' n'a pas été transmis.
J'ai essayé cette API dans le facteur et ça marche là-bas. Voici comment j'ai défini l'en-tête de la méthode dans Java/Spring Boot:
@RequestMapping(value = "/getIssue", method = RequestMethod.POST)
public IssuePojo getIssue(@RequestParam("key") String key, HttpServletRequest request) {
Voici les variations de mon angulaire:
public getJiraIssue(key: string): Observable<any> {
let headers = new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': this.idToken });
let options = { headers: headers };
const paramsA = new URLSearchParams();
paramsA.set('key', key);
let params = new HttpParams().append('key', key);
// return this.http.post(this.urlEnvironment.jiraGetIssue(), params, this.getHeaders());
console.log("headers: ", this.getHeaders());
// let obj = {
// key: key
// }
var headersA = new Headers();
headers.append('Authorization', this.idToken);
let body = new HttpParams()
.set('key', key);
return this.http.post(this.urlEnvironment.jiraGetIssue(), body, {headers: headers});
// return this.http.post(this.urlEnvironment.jiraGetIssue(), null, {headers: this.getHeaders(), params: params});
}
Il semble que le corps soit envoyé:
Mais c'est l'erreur que j'ai eue:
timestamp: "2019-01-30T04:30:40.721+0000", status: 400, error: "Bad Request",…}
error: "Bad Request"
message: "Required String parameter 'key' is not present"
path: "/jira/getIssue"
status: 400
timestamp: "2019-01-30T04:30:40.721+0000"
trace: "org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'key' is not present
La clé est donc 'Content-Type': 'application/json',
Puisque j'envoie json, du côté serveur, il s'attend à le mapper à un objet. J'ai également réussi à le faire fonctionner avec la chaîne, mais je dois ensuite analyser la chaîne moi-même sur le serveur, ce qui n'est pas ce que je cherche à faire.
Alors 'Content-Type': 'text/plain',
=> correspond à => @RequestBody String key
Et 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
=> correspond à => @RequestParam String key, @RequestParam String test,
Et donc l'appel de post de Angular ressemblera à ceci:
const httpBody = new HttpParams()
.set('key', 'key')
.set('test', 'test');
return this.http.post(endPoint, httpBody, this.getArgHeaders());
private getArgHeaders(): any {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
})
};
return httpOptions;
}
Utilisez cette classe de service HHTP pour envoyer des paramètres dans le corps et vous pouvez également envoyer des en-têtes
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { Observable, empty } from 'rxjs';
import { catchError, timeout } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class HttpService {
constructor(private http: HttpClient) {
}
private getHeaders(headersConfig?: object): HttpHeaders {
return new HttpHeaders({
'Content-Type': 'application/json',
...headersConfig,
});
}
get(url: string, params: HttpParams = new HttpParams(), headers: Object): Observable<any> {
let finalHeaders = this.getHeaders();
if (headers) {
for (let key in headers) {
finalHeaders = finalHeaders.append(key, headers[key]);
}
}
return this.http.get(
url,
{ headers: finalHeaders, params }
).pipe(timeout(10000)).pipe(catchError(this.handleError('Get request')));
}
put(url: string, body: Object = {}, headers: Object): Observable<any> {
let finalHeaders = this.getHeaders();
if (headers) {
for (let key in headers) {
finalHeaders = finalHeaders.append(key, headers[key]);
}
}
return this.http.put(
url,
body,
{ headers: finalHeaders }
).pipe(timeout(10000)).pipe(catchError(this.handleError<any>('put request')));
}
post(url: string, body: Object = {}, headers: Object): Observable<any> {
let finalHeaders = this.getHeaders();
if (headers) {
for (let key in headers) {
finalHeaders = finalHeaders.append(key, headers[key]);
}
}
return this.http.post(
url,
body,
{ headers: finalHeaders }
).pipe(timeout(10000)).pipe(catchError(this.handleError<any>('post request')));
}
/**
* Handle Http operation that failed.
* Let the app continue.
* @param operation - name of the operation that failed
* @param result - optional value to return as the observable result
*/
private handleError<T>(operation = 'operation', result?: T) {
return (error: any): Observable<T> => {
return empty();//of(result as T);
};
}
}