Potência Idem
Após o RFC, um PUT teria que entregar um objeto completo ao recurso. A principal razão disso é que o PUT deve ser idempotente. Isso significa que uma solicitação repetida deve ser avaliada para o mesmo resultado no servidor.
Se você permitir atualizações parciais, ela não poderá mais ser idem-potente. Se você tem dois clientes. Cliente A e B, o seguinte cenário pode evoluir:
O cliente A obtém uma imagem das imagens de recursos. Isso contém uma descrição da imagem, que ainda é válida. O cliente B coloca uma nova imagem e atualiza a descrição de acordo. A imagem mudou. O cliente A vê, ele não precisa alterar a descrição, porque é como ele deseja e colocar apenas a imagem.
Isso levará a uma inconsistência, a imagem tem os metadados incorretos anexados!
Ainda mais irritante é que qualquer intermediário pode repetir a solicitação. Caso decida de alguma forma, o PUT falhou.
O significado de PUT não pode ser alterado (embora você possa usá-lo mal).
Outras opções
Felizmente, há uma outra opção, este é o PATCH. PATCH é um método que permite atualizar parcialmente uma estrutura. Você pode simplesmente enviar uma estrutura parcial. Para aplicativos simples, isso é bom. Não é garantido que este método seja idem potente. O cliente deve enviar uma solicitação no seguinte formato:
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 20
{fielda: 1, fieldc: 2}
E o servidor pode responder novamente com 204 (Sem conteúdo) para sinalizar o sucesso. Por erro, você não pode atualizar uma parte da estrutura. O método PATCH é atômico.
A desvantagem desse método é que nem todos os navegadores suportam isso, mas essa é a opção mais natural em um serviço REST.
Exemplo de solicitação de patch:
http://tools.ietf.org/html/rfc5789#section-2.1
Correção de Json
A opção json parece ser bastante abrangente e uma opção interessante. Mas pode ser difícil de implementar para terceiros. Você precisa decidir se sua base de usuários pode lidar com isso.
Também é um pouco complicado, porque você precisa criar um pequeno intérprete que converta os comandos em uma estrutura parcial, que você usará para atualizar seu modelo. Esse intérprete também deve verificar se os comandos fornecidos fazem sentido. Alguns comandos se cancelam. (escreva fielda, exclua fielda). Acho que você deseja denunciar isso ao cliente para limitar o tempo de depuração do lado dele.
Mas se você tiver tempo, essa é uma solução realmente elegante. Você ainda deve validar os campos, é claro. Você pode combinar isso com o método PATCH para permanecer no modelo REST. Mas acho que o POST seria aceitável aqui.
Indo mal
Se você decidir optar pela opção PUT, o que é um pouco arriscado. Então você deve pelo menos não descartar o erro. O usuário tem uma certa expectativa (os dados serão atualizados) e, se você quebrar isso, não dará um bom tempo a alguns desenvolvedores.
Você pode optar por sinalizar de volta: 409 Conflito ou 403 Proibido. Depende de como você olha o processo de atualização. Se você o vir como um conjunto de regras (centralizado no sistema), o conflito será mais agradável. Algo como, esses campos não são atualizáveis. (Em conflito com as regras). Se você o vir como um problema de autorização (centrado no usuário), deverá retornar proibido. Com: você não está autorizado a alterar esses campos.
Você ainda deve forçar os usuários a enviar todos os campos modificáveis.
Uma opção razoável para impor isso é configurá-lo como um sub-recurso, que oferece apenas os dados modificáveis.
Opinião pessoal
Pessoalmente, eu iria (se você não precisar trabalhar com navegadores) pelo modelo PATCH simples e depois o estenderia com um processador de patch JSON. Isso pode ser feito diferenciando-se nos tipos mimetizados: O tipo mime do patch json:
application / json-patch
E json: application / json-patch
facilita a implementação em duas fases.