web-dev-qa-db-ja.com

JavaでREST APIを呼び出し、応答オブジェクトをマップする方法は?

私は現在、最初の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

誰もがなぜ知っていますか?

3
Estudeiro

私は戻ってきて、解決策を持っています(:

@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 (:

0
Estudeiro

必要なのは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とオブジェクト/コレクションをマッピングするための一般的に推奨される方法です。

  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

2
B.Ohara

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

シリアル化が原因である可能性があります。応答に来るフィールドで適切なモデルを定義します。これで問題が解決するはずです。

初心者にとっては良いオプションではないかもしれませんが、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 を渡す簡単な方法も提供します。

0
Thiru

私のRESTUtilクラスを使用して、RESTサービスをJavaアプリで呼び出すことができます。 https://github.com/gajeralalji/Javaを参照してください。 -REST-Client/wiki

0
Lalji Gajera