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



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

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

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

我用弹簧,有人知道如何用它。 提前谢谢伙计们。

我在这里补充我的代码:

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

编辑 我的全班同学:

@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

有人知道为什么吗?

您所需要的只是 http 客户端。例如,它可以是RestTemplate(与spring有关,简单的客户端(或更高级的,对我来说更具可读性 Retrofit(或您最喜欢的客户端(。

使用此客户端,您可以执行如下请求来获取 JSON:

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

在Java中映射beetwen JSON和对象/集合的通常推荐方法是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因此您可以查看spring-web项目的RestTemplate

使用RestTemplate的简单休息调用可以是:

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

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

对于新手来说可能不是更好的选择,但我觉得春天云假装帮助我保持代码干净。

基本上,您将拥有一个用于调用 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);

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