web-dev-qa-db-fra.com

Comment publier une chaîne dans le corps d'une demande de publication avec Angular 4.3 HttpClient?

Nous avons une WebAPI .net qui recherche une chaîne de chemin de fichier dans le corps d'une demande de publication et renvoie l'image correspondante. J'ai du mal à passer avec succès une chaîne de Angular 4.3 à l'aide du nouveau httpClient. C'est possible? Le point de terminaison étant utilisé par d'autres éléments, je ne souhaite donc pas vraiment créer un "modèle" de ... chaîne pour pouvoir le dupliquer, mais le transmettre si possible.

Signature de la méthode WebAPI: 

public HttpResponseMessage ImagesFromPaths(HttpRequestMessage request, [FromBody] string path)

Méthode de service actuelle:

getImage(path: string): Observable<any> {

  return this.http.post(
    `${apiUrl}`,
    { path },
    { headers: new HttpHeaders({
      'Content-Type': 'application/json',
    }), responseType: 'blob',
  })
}

Vous devez être une chose facile à réaliser?

12
user3302396

Il y a presque tout bon avec votre code. Le problème principal est l'en-tête Content-Type. Si vous souhaitez envoyer une chaîne à l'API .NET REST avec l'annotation [FromBody] et utiliser la valeur d'en-tête application/json, vous devez ajouter "" à votre paramètre path, par exemple "test_value":

return this.http.post(
  `${apiUrl}`,
    `\"${path}\"` ,
  { headers: new HttpHeaders({
    'Content-Type': 'application/json',
  }), responseType: 'blob',
  })

Vous pouvez également utiliser la valeur d'en-tête x-www-form-urlencoded. Ensuite, vous devez passer votre param pour demander le corps de cette manière:

return this.http.post(
  `${apiUrl}`,
    `=${path}` ,
  { headers: new HttpHeaders({
    'Content-Type': 'application/x-www-form-urlencoded',
  }), responseType: 'blob',
  })
16
matejko219

Vous pouvez obtenir la path à partir de query en supprimant l'attribut [fromBody]

public HttpResponseMessage ImagesFromPaths(HttpRequestMessage request, string path)

et dans le chemin d’envoi de poste dans post demande ${apiUrl}/${path}:

return this.http.post(
  `${apiUrl}/${path}`,
  { headers: new HttpHeaders({
    'Content-Type': 'application/json',
  }), responseType: 'blob',
  })
5
Yerkon

Je viens d'essayer une autre manière alternative par cette option et en dirigeant l'affichage du chemin de chaîne Json vers le corps de la méthode de publication.

 getImage(path: string) {
            let headers = new Headers({ 'Content-Type': 'application/json' });
            let options = new RequestOptions({ headers: headers });

            return new Promise((resolve, reject) => {
                this.http.post('${apiUrl}',path, options)
                .map((res) => res.json()).share()
                .subscribe(res => {
                  resolve(res)
                }, (err) => {
                  reject(err);
                });
            });
          }

Je serais heureux si cela fonctionne. Merci

0
this_is_om_vm