如何在 java 中进行休息 api 调用并映射响应对象?

How to make a rest api call in java and map the response object?

我目前正在开发我的第一个 java 程序,它会调用 rest api(jira rest api,更具体地说)。

因此,如果我转到浏览器并输入 url = “http://my-jira-domain/rest/api/latest/search?jql=assignee=currentuser()&fields=worklog

我收到一个包含当前用户所有工作日志的响应(json)。 但我的问题是,我的 java 程序如何做到这一点? 例如,连接到此 url,获取响应并将其存储在对象中?

我使用 spring,有人知道如何使用它。 提前谢谢大家。

我补充一下,我的代码在这里:

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 是一个简单的 class,只有一些属性。

编辑, 我整个 class:

@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;
}

此代码正在返回: org.springframework.http.converter.HttpMessageNotWritableException

有人知道为什么吗?

由于您正在使用 Spring,您可以查看 spring-web 项目的 RestTemplate

使用 RestTemplate 的简单 rest 调用可以是:

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));

您只需要 http 客户端。例如,它可能是 RestTemplate(与 spring、easy client 相关)或更高级且对我来说更具可读性的 Retrofit(或您最喜欢的客户端)。

使用此客户端,您可以执行这样的请求以获得 JSON:

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

在 Java 中映射 beetwen JSON 和 objects/collections 的一般推荐方法是 Jackson/Gson 库。相反,他们可以快速检查您可以:

  1. 定义 POJO 对象:

    public class User implements Serializable {
    private String name;
    private String surname;
    // standard getters and setters
    }
    
  2. 使用 RestTemplate 的 getForObject() 方法。

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

要获得有关使用 RestTemplate 和 Jackson 的基本知识,我向您推荐来自 baeldung 的非常棒的文章:

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

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

问题可能是因为序列化。定义一个适当的模型,其中包含用于响应的字段。那应该可以解决您的问题。

对于新手来说可能不是一个更好的选择,但我觉得 spring-cloud-feign 帮助我保持代码整洁。

基本上,您将拥有一个调用 JIRA 的界面 api。

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

在您的控制器中,您只需注入 JiraClient 并调用方法

jiraClient.search();

并且它还提供了通过 的简单方法。

我回来了,有了解决方案 (:

@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;
    }

}

上面的代码有效,但是有人可以向我解释这两行吗?

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

而且,这是一个很好的代码? 谢谢 (: