私は現在、最初のJavaプログラムを開発しています。このプログラムは、Rest API(より具体的には、Jira Rest API)を呼び出します)。
したがって、ブラウザに移動してurl = " http:// my-jira-domain/rest/api/latest/search?jql = assignee = currentuser()&fields = worklog "と入力すると、
現在のユーザーのすべての作業ログを含む応答(json)を取得します。しかし、私の問題は、どのように私のJavaプログラムでこれを行うか?このように、このURLに接続し、応答を取得してオブジェクトに格納することですか?
私は春を使用しています。事前にみんなのTHX。
ここに私のコードを追加します:
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
誰もがなぜ知っていますか?
私は戻ってきて、解決策を持っています(:
@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;
}
}
上記のコードは機能しますが、誰かが私にこれらの2行を説明できますか?
HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
response = restTemplate.exchange(theUrl, HttpMethod.GET, entity, JiraWorklogIssue.class);
そして、これは良いコードですか? THX (:
必要なのはhttpクライアントだけです。たとえば、RestTemplate(Springに関連する簡単なクライアント)や、より高度で、Retrofit(またはお気に入りのクライアント)にとっては少し読みやすいかもしれません。
このクライアントを使用すると、次のようなリクエストを実行してJSONを取得できます。
RestTemplate coolRestTemplate = new RestTemplate();
String url = "http://Host/user/";
ResponseEntity<String> response
= restTemplate.getForEntity(userResourceUrl + "/userId", String.class);
JavaはJackson/Gsonライブラリです)でbeetwen JSONとオブジェクト/コレクションをマッピングするための一般的に推奨される方法です。
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
を使用しているので、RestTemplate
of spring-web
事業。
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));
シリアル化が原因である可能性があります。応答に来るフィールドで適切なモデルを定義します。これで問題が解決するはずです。
初心者にとっては良いオプションではないかもしれませんが、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();
また、 headers を渡す簡単な方法も提供します。
私のRESTUtilクラスを使用して、RESTサービスをJavaアプリで呼び出すことができます。 https://github.com/gajeralalji/Javaを参照してください。 -REST-Client/wiki