2013-10-22 4 views
21

Angenommen, ich eine Ressource wie folgt aufgebaut:Wie sende ich URL-Vorlage Parameter mit Anfrage Körper in eckigen?

resource = $resource(
    "http://foo.com/service/:type/:id", 
    {}, 
    {save: {method:'PUT', params: {type:'@type', id: '@id'}}} 
); 
resource.save({type:'user', id:14, name:'Bob Dole'}); 

Gibt es eine Möglichkeit, type und id davor eingereicht als Teil des Antrags Körper verhindern kann, und name in der PUT Nutzlast nur senden? Ich kontrolliere nicht die API, an die ich mich bewerbe, und es scheint die zusätzlichen Parameter nicht zu mögen, die ich es sende.

Danke!

aktualisieren - 10/25/13 - 13:38

Die Dokumentation für resource sagt dies:

Wenn der Parameterwert mit @ dann der Wert dieses Parameters vorangestellt wird extrahiert aus dem Datenobjekt (nützlich für Nicht-GET-Operationen).

Das bedeutet, dass diese sollten die Parameter aus den Daten entfernen:

resource.save({type:'@user', id:'@14', name:'Bob Dole'}); 

, aber es scheint nicht zu funktionieren. Immer noch ratlos.

+0

Dies ist eine große Rate; aber bei Verwendung von $ HTTP; Sie können eine Transformationsfunktion hinzufügen, um die Anfrage zu ändern. Kannst du dasselbe mit $ resource machen? – JeffryHouser

+0

Danke - das funktioniert! Siehe oben für meine Lösung. Die Dokumente erwähnen jedoch einen einfacheren Weg, der funktionieren sollte, aber nicht. –

+0

Sie sollten Ihre Lösung als eine formelle Antwort veröffentlichen [AKA Beantworten Sie Ihre eigene Frage]. Es wird Leuten helfen, die in der Zukunft finden. – JeffryHouser

Antwort

7

FWIW, habe ich ein Problem zu umgehen, dank @ Reboog711 finden, indem wie so ein transformRequest Parameter einschließlich:

resource = $resource(
    "http://foo.com/service/:type/:id", 
    {}, 
    {save: { 
     method:'PUT', 
     transformRequest:function(data) { 
      delete data.type; 
      delete data.id; 
      return JSON.stringify(data); 
     }, 
     params: {type:'@type', id: '@id'} 
    }} 
); 
32

Verwenden Sie den ersten Parameter für Ihre URL Template-Parameter und Ihre Post-Daten im zweiten Parameter setzen dies wie:

resource.save({id:14, type:'user'}, {name:'Bob Dole'}); 

Hier ist die Linie von der Angular docs, die die Funktion Signatur zeigt:

nicht-GET "Klasse" ac gen: Resource.action ([Parameter], postdata [Erfolg], [Fehler])

ein Beispiel in plunker

Hier ist die Anfrage Sie wird nicht die URL-Parameter im Körper haben:

Request URL:http://run.plnkr.co/JAOqZqW6RSywatUM/badUrl/user/14 
Request Method:PUT 
Request Payloadview source 
{name:Bob Dole} 
+4

Dies ist die richtige Antwort. – marapet

Verwandte Themen