2015-08-19 20 views
5

Ich habe eine Bestellung Ressource, die so aussieht.PUT Anfrage Senden von Parametern über URL

.factory('Order', order) 

order.$inject = ['$resource', "ApiEndpoint"]; 

function order($resource, ApiEndpoint) { 
    return $resource(ApiEndpoint.url + 'orders.json', {}, { 
    create: {method: 'POST', url: ApiEndpoint.url + 'orders.json'}, 
    update: {method: 'PUT'}, 
    edit: {method: 'GET', url: ApiEndpoint.url + 'orders/edit.json'}, 
    remove_item: {method: 'GET', url: ApiEndpoint.url + 'orders/remove_item.json'}, 
    }); 
} 

Als ich Order.update laufen wie so

var params = { 
    order: { 
    line_items_attributes: {0: {quantity: 2, id: 1}} 
    }, 
    order_id: 3 
}; 

Order.update(params, function (resp, respHeaders) { 
    console.log("response headers", respHeaders()); 
    console.log("change quantity resp", resp); 
}) 

Ich habe auch versucht dies:

Order.update({}, params, function (resp, respHeaders) { 
    console.log("response headers", respHeaders()); 
    console.log("change quantity resp", resp); 
}) 

Die params an den Server innerhalb der URL am Ende gesendet wird. Zum Beispiel war dies eine der Urls der Server

erhielt
path="/api/mobile/orders.json?order=%7B%22line_items_attributes%22:%7B%220%22:%7B%22quantity%22:8,%22id%22:356265%7D%7D%7D" 

Ich sollte auch beachten, dass das Verfahren durch den Server eine OPTIONS Anforderung empfangen wird. Der Server wurde dafür eingerichtet.

Da ich eine PUT-Anfrage senden, warum ist $resource die Params über die URL und nicht Teil der Nutzlast liefern?

Antwort

1

von den docs:

Nicht-GET "Klasse" Aktionen: Resource.action ([Parameter], postdata [Erfolg], [Fehler])

die Nutzlast ist die zweites Argument, also versuchen Sie mit diesem Code

var params = { 
    order: { 
    line_items_attributes: {0: {quantity: 2, id: 1}} 
    }, 
    order_id: 3 
}; 

Order.update({}, params, function (resp, respHeaders) { 
    console.log("response headers", respHeaders()); 
    console.log("change quantity resp", resp); 
}) 

Fügen Sie einfach ein leeres Objekt als ersten Parameter der Update-Methode hinzu.

haben auch einen Blick auf ihn Abschnitt in Bezug auf custom put requests

+0

Ich versuchte dies und die Parameter werden noch in die URL geladen. – jason328

+0

der Aufruf von OPTIONEN sollte durch [CORS] (https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) verursacht werden, ist Ihr API-Endpunkt auf einer anderen Domäne als die eckige App? –

+0

Ja ist es. Ich glaube, in der Vergangenheit haben wir dieses Problem behoben, als wir in der Vergangenheit eine POST-Anfrage gemacht haben und die POST-Anfrage nicht wie in der PUT-Anfrage Parameter an die URL weitergibt. – jason328

0

Wenn Sie eine Bestellung aktualisieren, dann sollten Sie die Reihenfolge ID speficy so dass Service jetzt kann, die aktualisiert werden,

function order($resource, ApiEndpoint) { 
    return $resource(ApiEndpoint.url + 'orders.json/:orderid', {}, { 
    create: {method: 'POST', url: ApiEndpoint.url + 'orders.json'}, 
    update: {method: 'PUT',params : {orderid : '@order_id'}, 
    edit: {method: 'GET', url: ApiEndpoint.url + 'orders/edit.json'}, 
    remove_item: {method: 'GET', url: ApiEndpoint.url + 'orders/remove_item.json'}, 
    }); 
} 

wird und dann Ihr Anruf

Order.update(params, function (resp, respHeaders) { 
    console.log("response headers", respHeaders()); 
    console.log("change quantity resp", resp); 
}) 
+0

Es tut uns leid, aber die Parameter werden immer noch über die URL übergeben. – jason328