如何在 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 库。相反,他们可以快速检查您可以:
定义 POJO 对象:
public class User implements Serializable {
private String name;
private String surname;
// standard getters and setters
}
使用 RestTemplate 的 getForObject() 方法。
User user = restTemplate.getForObject(userResourceUrl + "/userId", User.class);
要获得有关使用 RestTemplate 和 Jackson 的基本知识,我向您推荐来自 baeldung 的非常棒的文章:
问题可能是因为序列化。定义一个适当的模型,其中包含用于响应的字段。那应该可以解决您的问题。
对于新手来说可能不是一个更好的选择,但我觉得 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);
而且,这是一个很好的代码?
谢谢 (:
我目前正在开发我的第一个 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 库。相反,他们可以快速检查您可以:
定义 POJO 对象:
public class User implements Serializable { private String name; private String surname; // standard getters and setters }
使用 RestTemplate 的 getForObject() 方法。
User user = restTemplate.getForObject(userResourceUrl + "/userId", User.class);
要获得有关使用 RestTemplate 和 Jackson 的基本知识,我向您推荐来自 baeldung 的非常棒的文章:
问题可能是因为序列化。定义一个适当的模型,其中包含用于响应的字段。那应该可以解决您的问题。
对于新手来说可能不是一个更好的选择,但我觉得 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);
而且,这是一个很好的代码? 谢谢 (: