emersonsoares/CorreiosRESTfulAPI — pull request #1 by Ridermansb (2012-11-06 22:02:22+00:00)
Title: Separação das responsabilidades no controller Cep e melhorias no modelo RestFull

Olá Emerson, parabéns pela iniciativa!! Muito bom mesmo cara.

Bom, estou enviando uma pequena contribuição para o projeto.
Basicamente duas modificações:

1. Removi o objeto `ObjetoRetorno.cs`, passei a retornar o próprio endereço.
2. Adicionei uma `constraint` nas configurações da rota (Tornei obrigatório o CEP e apenas números são aceitos), para evitar máscaras e afins.
3. Melhorias no modelo Restfull. Este vou explicar um pouco melhor abaixo;

No meu ponto de vista, um grande erro que os devs comentem ao criar apis é informar o erro em variáveis, (neste exemplo, na propriedade `TemErro` e `Mensagem`) porque os protocolos HTTP estão ai para isto.

Com as modificações, podemos manipular os erros pelos status do HTTP:
Tudo que fiz foi retornar o status do erro e a mensagem, por exemplo no controller CEP caso o CEP não seja encotrado, a seguinte linha é executada:

`return Request.CreateErrorResponse(HttpStatusCode.NotFound, "CEP não encontrado!");`

Isto retorna para o client o erro 404 (o evento success não será executado) então tudo que temos de fazer é manipular o erro:

**Exemplo client***

```javascript
$.ajax({
url: 'http://localhost:52368/cep/31030410',
dataType: 'jsonp',
crossDomain: true,
contentType: "application/json",
statusCode: {
200: function(data) { console.log(data); } // Ok
,400: function(msg) { console.log(msg); } // Bad Request
,404: function(msg) { console.log("CEP não encontrado!!"); } // Not Found
}
});
```

Observe que o status 404 informa CEP não encontrado e 400 com algum erro no client.
Você pode manipular erros 500 (Server error) da mesma forma.

A ideia que que ele só deve retornar 200 (ok) se a API encontrou e processou o endereço com sucesso!

Bom, qualquer dúvida estou a disposição!