Teste uma API REST com curl

Teste uma API REST com curl

 

1. Visão geral

Este tutorial oferece uma breve visão geral do teste de uma API REST usandocurl.

curl is a command-line tool for transferring data and supports about 22 protocols including HTTP. Essa combinação o torna uma ferramenta ad-hoc muito boa para testar nossos serviços REST.

Leitura adicional:

Testando APIs da Web com coleções de carteiro

Aprenda a criar uma coleção de carteiro que pode testar uma API REST

Read more

Um Guia para Garantia de REST

Explore os conceitos básicos da REST-assegurada - uma biblioteca que simplifica o teste e a validação das APIs REST.

Read more

2. Opções de linha de comando

curl supports over 200 command-line options. E podemos ter zero ou mais deles para acompanhar a URL no comando.

Mas antes de usá-lo para nossos propósitos, vamos dar uma olhada em dois que tornariam nossas vidas mais fáceis.

2.1. Verbose

Quando estamos testando, é uma boa ideia ativar o modo detalhado:

curl -v http://www.example.com/

Como resultado, os comandos forneceriam informações úteis, como o endereço IP resolvido, a porta à qual estamos tentando conectar e os cabeçalhos.

2.2. Resultado

Por padrão, curl gera o corpo da resposta na saída padrão. Opcionalmente, podemos fornecer a opção de saída para salvar em um arquivo:

curl -o out.json http://www.example.com/index.html

Isso é especialmente útil quando o tamanho da resposta é grande.

3. Métodos HTTP com curl

Toda solicitação HTTP contém um método. Os métodos mais usados ​​são GET, POST, PUT e DELETE.

3.1. GET

Este é o método padrão ao fazer chamadas HTTP com curl. De fato, os exemplos mostrados anteriormente eram chamadas GET simples.

Ao executar uma instância local de um serviço na porta 8082, usaríamos algo como este comando para fazer uma chamada GET:

curl -v http://localhost:8082/spring-rest/foos/9

E como temos o modo verbose ativado, obteríamos um pouco mais de informações junto com o corpo da resposta:

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8082 (#0)
> GET /spring-rest/foos/9 HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.60.0
> Accept: */*
>
< HTTP/1.1 200
< X-Application-Context: application:8082
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 15 Jul 2018 11:55:26 GMT
<
{
  "id" : 9,
  "name" : "TuwJ"
}* Connection #0 to host localhost left intact

3.2. POST

Usamos esse método para enviar dados para um serviço de recebimento. E para isso, usamos a opção de dados.

A maneira mais simples de fazer isso é incorporar os dados no comando:

curl -d 'id=9&name=example' http://localhost:8082/spring-rest/foos/new

ou, passe um arquivo contendo o corpo da solicitação para a opção de dados como esta:

curl -d @request.json -H "Content-Type: application/json"
  http://localhost:8082/spring-rest/foos/new

Usando os comandos acima como estão, podemos receber mensagens de erro como a seguinte:

{
  "timestamp" : "15-07-2018 05:57",
  "status" : 415,
  "error" : "Unsupported Media Type",
  "exception" : "org.springframework.web.HttpMediaTypeNotSupportedException",
  "message" : "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
  "path" : "/spring-rest/foos/new"
}

Isso ocorre porque o curl adiciona o seguinte cabeçalho padrão a todas as solicitações POST:

Content-Type: application/x-www-form-urlencoded

Isso também é o que os navegadores usam em um POST simples. Em nosso uso, geralmente queremos personalizar os cabeçalhos de acordo com nossas necessidades.

Por exemplo, se nosso serviço espera o tipo de conteúdo json, podemos usar a opção -H para modificar nossa solicitação POST original:

curl -d '{"id":9,"name":"example"}' -H 'Content-Type: application/json'
  http://localhost:8082/spring-rest/foos/new

O prompt de comando do Windows não oferece suporte para aspas simples, como os shells semelhantes ao Unix.

Como resultado, precisaríamos substituir as aspas simples por aspas duplas; escapando deles sempre que necessário:

curl -d "{\"id\":9,\"name\":\"example\"}" -H "Content-Type: application/json"
  http://localhost:8082/spring-rest/foos/new

Além disso, quando queremos enviar uma quantidade um pouco maior de dados, geralmente é uma boa ideia usar um arquivo de dados.

3.3. PUT

Este método é muito semelhante ao POST. Mas nós o usamos quando queremos enviar uma nova versão de um recurso existente. Para fazer isso, usamos a opção -X.

Sem nenhuma menção a um tipo de método de solicitação, o padrão de ondulação é usar GET. Portanto, mencionamos explicitamente o tipo de método no caso de PUT:

curl -d @request.json -H 'Content-Type: application/json'
  -X PUT http://localhost:8082/spring-rest/foos/9

3.4. EXCLUIR

Novamente, especificamos que queremos usar DELETE usando a opção -X:

curl -X DELETE http://localhost:8082/spring-rest/foos/9

4. Cabeçalhos personalizados

Podemos substituir os cabeçalhos padrão ou adicionar nossos próprios cabeçalhos.

Por exemplo, para alterar o cabeçalho do host, fazemos o seguinte:

curl -H "Host: com.example" http://example.com/

Para desativar o cabeçalho User-Agent, colocamos um valor vazio:

curl -H "User-Agent:" http://example.com/

O cenário mais comum durante o teste é alterar o cabeçalho Content-Type e Accept. Teríamos apenas que prefixar cada cabeçalho com a opção -H:

curl -d @request.json -H "Content-Type: application/json"
  -H "Accept: application/json" http://localhost:8082/spring-rest/foos/new

5. Autenticação

Umservice that requires authentication enviaria de volta um 401 - código de resposta HTTP não autorizado e um cabeçalho WWW-Authenticate associado.

Para autenticação básica, podemossimply embed the username and password combination inside our request using the user option:

curl --user example:secretPassword http://example.com/

No entanto, se quisermosuse OAuth2 for authentication, primeiro precisaremos obter o access_token de nosso serviço de autorização.

A resposta do serviço conteria oaccess_token:

{
  "access_token": "b1094abc0-54a4-3eab-7213-877142c33fh3",
  "token_type": "bearer",
  "refresh_token": "253begef-868c-5d48-92e8-448c2ec4bd91",
  "expires_in": 31234
}

Agora, podemos usar o token em nosso cabeçalho de autorização:

curl -H "Authorization: Bearer b1094abc0-54a4-3eab-7213-877142c33fh3" http://example.com/

6. Conclusão

Examinamos o uso da funcionalidade mínima de curl para testar nossos serviços REST. Embora possa fazer muito mais do que o que foi discutido aqui, para nosso propósito, isso deve bastar.

Sinta-se à vontade para digitar curl -h na linha de comando para verificar todas as opções disponíveis. O serviço REST usado para a demonstração está disponívelhere on GitHub.