web-dev-qa-db-fra.com

Comment faire un appel api de repos dans Java et mapper l'objet de réponse?

Je développe actuellement mon premier Java qui fera un appel à une api de repos (jira rest api, pour être plus précis).

Donc, si je vais dans mon navigateur et que je tape l'url = " http: // my-jira-domain/rest/api/latest/search? Jql = assignee = currentuser () & fields = worklog "

J'obtiens une réponse (json) avec tous les journaux de travail de l'utilisateur actuel. Mais mon problème est, comment je fais mon programme Java pour faire cela? Comme, se connecter à cette URL, obtenir la réponse et la stocker dans un objet?

J'utilise le printemps, avec quelqu'un sait comment faire avec ça. Merci d'avance les gars.

J'ajoute mon code ici:

RestTemplate restTemplate = new RestTemplate();
String url;
url = http://my-jira-domain/rest/api/latest/search/jql=assignee=currentuser()&fields=worklog
jiraResponse = restTemplate.getForObject(url,JiraWorklogResponse.class);

JiraWorkLogResponse est une classe simple avec quelques attributs uniquement.

Modifier, toute ma classe:

@Controller
@RequestMapping("/jira/worklogs")
public class JiraWorkLog {

    private static final Logger logger = Logger.getLogger(JiraWorkLog.class.getName() );
@RequestMapping(path = "/get", method = RequestMethod.GET, produces = "application/json")

    public ResponseEntity getWorkLog() {


    RestTemplate restTemplate = new RestTemplate();
    String url;
    JiraProperties jiraProperties = null;


    url = "http://my-jira-domain/rest/api/latest/search?jql=assignee=currentuser()&fields=worklog";

    ResponseEntity<JiraWorklogResponse> jiraResponse;
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders = this.createHeaders();


    try {
        jiraResponse = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<Object>(httpHeaders),JiraWorklogResponse.class);



    }catch (Exception e){
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
    }

    return ResponseEntity.status(HttpStatus.OK).body(jiraResponse);

}


private HttpHeaders createHeaders(){
    HttpHeaders headers = new HttpHeaders(){
        {
            set("Authorization", "Basic something");
        }
    };
    return headers;
}

Ce code renvoie: org.springframework.http.converter.HttpMessageNotWritableException

Quelqu'un sait pourquoi?

3
Estudeiro

je suis de retour et avec une solution (:

@Controller
@RequestMapping("/jira/worklogs")
public class JiraWorkLog {

    private static final Logger logger = Logger.getLogger(JiraWorkLog.class.getName() );

    @RequestMapping(path = "/get", method = RequestMethod.GET, produces = "application/json")
    public ResponseEntity<JiraWorklogIssue> getWorkLog(@RequestParam(name = "username") String username) {


        String theUrl = "http://my-jira-domain/rest/api/latest/search?jql=assignee="+username+"&fields=worklog";
        RestTemplate restTemplate = new RestTemplate();

        ResponseEntity<JiraWorklogIssue> response = null;
        try {
            HttpHeaders headers = createHttpHeaders();
            HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
            response = restTemplate.exchange(theUrl, HttpMethod.GET, entity, JiraWorklogIssue.class);
            System.out.println("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody());
        }
        catch (Exception eek) {
            System.out.println("** Exception: "+ eek.getMessage());
        }

        return response;

    }

    private HttpHeaders createHttpHeaders()
    {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.add("Authorization", "Basic encoded64 username:password");
        return headers;
    }

}

Le code ci-dessus fonctionne, mais quelqu'un peut-il m'expliquer ces deux lignes?

HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
                response = restTemplate.exchange(theUrl, HttpMethod.GET, entity, JiraWorklogIssue.class);

Et, c'est un bon code? THX (:

0
Estudeiro

Tout ce dont vous avez besoin est un client http. Cela pourrait être par exemple RestTemplate (lié au printemps, client facile) ou plus avancé et un peu plus lisible pour moi Retrofit (ou votre client préféré).

Avec ce client, vous pouvez exécuter des requêtes comme celle-ci pour obtenir du JSON:

 RestTemplate coolRestTemplate = new RestTemplate();
 String url = "http://Host/user/";
 ResponseEntity<String> response
 = restTemplate.getForEntity(userResourceUrl + "/userId", String.class);

Moyen généralement recommandé de mapper entre JSON et les objets/collections dans Java correspond aux bibliothèques Jackson/Gson. À la place, pour une vérification rapide, vous pouvez:

  1. Définissez l'objet POJO:

    public class User implements Serializable {
    private String name;
    private String surname;
    // standard getters and setters
    }
    
  2. Utilisez la méthode getForObject () de RestTemplate.

    User user = restTemplate.getForObject(userResourceUrl + "/userId", User.class);
    

Pour obtenir des connaissances de base sur le travail avec RestTemplate et Jackson, je vous recommande de très bons articles de baeldung:

http://www.baeldung.com/rest-template

http://www.baeldung.com/jackson-object-mapper-tutorial

2
B.Ohara

Puisque vous utilisez Spring, vous pouvez jeter un œil à RestTemplate de spring-web projet.

Un simple appel de repos utilisant RestTemplate peut être:

RestTemplate restTemplate = new RestTemplate();
String fooResourceUrl = "http://localhost:8080/spring-rest/foos";
ResponseEntity<String> response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
0
pleft

Le problème pourrait être dû à la sérialisation. Définissez un modèle approprié avec des champs venant à la réponse. Cela devrait résoudre votre problème.

Ce n'est peut-être pas une meilleure option pour un débutant, mais je pensais que spring-cloud-feign m'a aidé à garder le code propre.

Fondamentalement, vous aurez une interface pour invoquer l'API JIRA.

@FeignClient("http://my-jira-domain/")
public interface JiraClient {  
    @RequestMapping(value = "rest/api/latest/search?jql=assignee=currentuser()&fields=", method = GET)
    JiraWorklogResponse search();
}

Et dans votre contrôleur, il vous suffit d'injecter le JiraClient et d'appeler la méthode

jiraClient.search ();

Et il fournit également un moyen facile de passer les en-têtes .

0
Thiru

Vous pouvez utiliser ma classe RESTUtil pour appeler n'importe quel service REST dans votre application Java. Voir https://github.com/gajeralalji/Java -REST-Client/wiki

0
Lalji Gajera