Chamada HTTP a serviço RestFul

Bom dia a todos, eu gostaria de fazer uma chamada HTTP para meu serviço RestFul, meu servidor funciona normalmente, agora eu gostaria de implementar o lado cliente (Javafx desktop), mas não tenho ideia de uma biblioteca e nem de uma implementação que faça o seguinte:

Chamar o endereço "http://localhost:8080/api/login (verbo POST) com um HEADER (Content-Type : application/json) e um BODY com o json das informações de login…

Chamar o endereço "http://localhost:8080/api/recursos/usuario (verbo GET) com um HEADER (Authentication : “teste”)…

Ja testei tudo isso que eu disse acima pelo POSTMAN um programa que faz essas chamadas pra testar minha API e tudo funciona normalmente, eu gostaria de implementar e acredito que seja uma coisa comum pra muitos de nós… Alguém pode me dar uma luz?

Pesquisa sobre estas bibliotecas:

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

Aqui um exemplo:

public List<Autorizacao> getVeiculos() {
	    
		String url = urlBase+"/veiculos";
		
	    List<Autorizacao> autorizacoes = null;
	    BasicCookieStore cookieStore = new BasicCookieStore();
	    CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
	    
	    try {
	    	
	        HttpGet httpget = new HttpGet(url);
	        httpget.setHeaders(getHeaders());
	        CloseableHttpResponse response = httpClient.execute(httpget);
	        
	        try {
	        	
	            HttpEntity entity = response.getEntity();

	            String resposta = IOUtils.toString(entity.getContent(), Charsets.UTF_8);

	            if (resposta != null && !resposta.equals("")) {
	            	
	            	ObjectMapper mapper = new ObjectMapper();
					autorizacoes = mapper.readValue(resposta,
							new TypeReference<List<Autorizacao>>() {
							});
		            
		            EntityUtils.consume(entity);
	
	            }
	            
	        } 
	        finally {
	        	
	        	result = response.getStatusLine().getStatusCode();
	            response.close();
	            
	        }
	        
	    } 
	    catch(Exception exc) {
	    	logger.error("Exceção durante get: "+exc.getMessage(), exc);
	    }
	    
	    return autorizacoes;
	    
	}
1 curtida

Consegui em parte… Quero agora adicionar um body ao HTTPGet com um objeto JSON como faço? Não existe um método setBody ou setEntity no HTTPGet…

Opa, man, tudo bom?
De acordo com Roy T. Fielding, um dos principais autores do protocolo HTTP, todo método pode possuir um corpo, porém, não é interessante adicionar um ao método GET, pois para servidores que utilizam deste protocolo, o corpo num método GET só tem valor semântico apenas.

Yes. In other words, any HTTP request message is allowed to contain a message body, and thus must parse messages with that in mind. Server semantics for GET, however, are restricted such that a body, if any, has no semantic meaning to the request. The requirements on parsing are separate from the requirements on method semantics.

So, yes, you can send a body with GET, and no, it is never useful to do so.

This is part of the layered design of HTTP/1.1 that will become clear again once the spec is partitioned (work in progress).

Acredito que o apache utilize dos mesmos princípios, sendo assim, não faz sentido enviar um corpo em um método GET.