Neste artigo, vamos ver como podemos invocar os serviços de domínio WCF para operações de alteração ou CRUD, usando o endpoint JSON. Veremos, nomeadamente, como podemos inserir um registo numa tabela, submetendo ao Domain Service WCF um conjunto de dados a alterar no domínio.
Para este exemplo foi particularmente útil a primeira referência da lista apresentada no final.
Este exemplo corre com as páginas HTML no mesmo servidor e porta que os serviços WCF. No próximo artigo veremos como fazer invocações cross domain, as quais trazem as suas próprias dores de cabeça.
A criação dos serviços WCF (Windows Communication Foundation) utilizados neste exemplo foi abordada nos artigos:
- Criar Modelo de dados EntityFramework e Serviços WCF a partir da Base de Dados, e
- Disponibilizar Serviços WCF em JSON
Neste exemplo vamos submeter ao Domain Service WCF, através de um pedido HTTP POST, um conjunto de alterações (change set) a efetuar no domínio de dados.
Tal como no exemplo anterior, iremos utilizar o JQuery para simplificar o nosso exemplo, e assume-se que o leitor já tem algum conhecimento de HTML e Javascript.
Vamos criar uma simples página HTML com um conjunto de campos para introdução de texto e um botão para submeter os dados ao servidor.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HTML</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="scripts/jQueryCRUD_Car.js"></script>
</script>
</head>
<body>
<h1 id="insertCar">Insert Car</h1>
Brand: <input type="text" id="brand" name="brand"/> <br/>
Model: <input type="text" id="model" name="model"/> <br/>
Plate number: <input type="text" id="plate_number" name="plate_number"/> <br/>
<button id="Create">Create</button>
</body>
</html>
De notar a inclusão dos ficheiros http://code.jquery.com/jquery-1.10.2.min.js, biblioteca de jQuery que vamos usar, e jQueryCRUD_Car.js, ficheiro com a nossa script para submissão dos dados ao serviço WCF.
No ficheiro jQueryCRUD_Car.js vamos, então, começar por associar o evento click do botão 'Create' a uma função Javascript, a que chamámos InsertNewCar():
$(document).ready(function () {
$(Create).click(function () { InsertNewCar(); });
});
Depois, vamos escrever a função InsertNewCar():
function InsertNewCar() {
var _brandName = $(brand).val();
var _modelName = $(model).val();
var _plate_number = $(plate_number).val();
var changeSet = [];
var entityChange = {};
//Setting Id for entityChange, not the entity key but how the changeset tracks each change if there is more than one
entityChange.Id = 0;
//Set the type of Operation to be performed on the Entity
//2 - insert
//3 - update
//4 - delete
entityChange.Operation = 2;
entityChange.Entity = { '__type': "Car:#WcfRentACarService", 'brand': _brandName, 'model': _modelName, 'plate_number': _plate_number};
changeSet.push(entityChange);
var changesetPayload = JSON.stringify({ "changeSet": changeSet });
//Create jQuery ajax request
var Params = {}
Params.type = "POST";
Params.url = 'WcfRentACarService-RentACarDomainService.svc/JSON/SubmitChanges';
Params.dataType = "json";
Params.data = changesetPayload;
Params.contentType = "application/json";
Params.error = function (httpRequest, textStatus, errorThrown) {
alert('Failed!!!');
}
Params.success = function (data) {
alert('Success !!!');
}
//Make the ajax request
$.ajax(Params);
}
- ler os valores dos campos de introdução de texto HTML;
- criar um array, changeset, e um uma estrutura, entityChange, vazios;
- criar os seguintes campos e atribuir valores na estrutura entityChange:
entityChange.Id = 0;
entityChange.Operation = 2; // 2 = operação de INSERT// Entity refere a entidade (classe) do domínio, Car, e o namespace onde está definida no serviço WCF. Contém ainda os campos e valores para instanciação de uma classe.
entityChange.Entity = { '__type':"Car:#WcfRentACarService", 'brand': _brandName, 'model': _modelName, 'plate_number': _plate_number};
- acrescentar a estrutura entityChange ao array changeSet:
changeSet.push(entityChange);
- criar uma variável, changesetPayload, com os dados a submeter ao serviço (o changeSet), no formato de uma string JSON:
var changesetPayload = JSON.stringify({ "changeSet": changeSet });
- criar os parametros para a função JQuery.ajax, que será usada para invocar o serviço WCF:
//Create jQuery ajax request
var Params = {}
Params.type = "POST";
Params.url = 'WcfRentACarService-RentACarDomainService.svc/JSON/SubmitChanges';
Params.dataType = "json";
Params.data = changesetPayload;
Params.contentType = "application/json";
Params.error = function (httpRequest, textStatus, errorThrown) {
alert('Failed!!!');
}
Params.success = function (data) {
alert('Success !!!');
}
- Enviar o pedido ao serviço WCF:
//Make the ajax request
$.ajax(Params);
De notar que todas as operações enviadas ao domain service WCF para alteração de dados (Insert, Update, Delete) referem o serviço SubmitChanges, e que a seleção da operação a efetuar é feita no parâmetro entityChange.Operation, e a identificação da entidade a alterar é feita no campo __type da entityChange.Entity.
O resultado da execução de esta função, é a inclusão de uma nova viatura na BD, como poderemos aferir usando o exemplo anterior para consultar a BD.
Referências:
- http://codesmartinc.com/2011/08/20/utilizing-json-endpoints-in-wcf-domain-services/
- http://blogs.msdn.com/b/davrous/archive/2010/12/14/how-to-open-a-wcf-ria-services-application-to-other-type-of-clients-the-json-endpoint-4-5.aspx
- http://api.jquery.com/jQuery.ajax/
- http://www.json.org/js.html
- http://blogs.msdn.com/b/cesardelatorre/archive/2011/06/07/working-with-wcf-ria-services-json-endpoints-for-html5-javascript-amp-jquery.aspx
- http://programmaticponderings.wordpress.com/2011/09/25/consuming-cross-domain-wcf-rest-services-with-jquery-using-jsonp/
- http://www.silverlightshow.net/items/WCF-RIA-Services-Part-10-Exposing-Domain-Services-To-Other-Clients.aspx
- http://www.yumasoft.com/node/108
- http://www.yumasoft.com/node/69
- http://social.msdn.microsoft.com/Forums/vstudio/en-US/1744853c-23a3-49d1-a312-a5993aa0ff75/domain-service-not-exposing-update-method-to-json-endpoint
Artigos relacionados:
- Criar Modelo de dados EntityFramework e Serviços WCF a partir da Base de Dados, e
- Disponibilizar Serviços WCF em JSON
- Invocar serviços WCF via JSON endpoint numa página HTML - 1
- Invocar serviços WCF via JSON endpoint numa página HTML - 3
Sem comentários:
Enviar um comentário