Skip to content

Example

readeyKim edited this page Aug 14, 2019 · 1 revision

기본적인 μ˜ˆμ œλ“€μ„ μ†Œκ°œν•©λ‹ˆλ‹€.
λ³Έ μ˜ˆμ œλŠ” REST API에 λŒ€ν•΄ Fake Dataλ₯Ό 무료둜 μ œκ³΅ν•΄μ£ΌλŠ” JSONPlaceholder을 μ΄μš©ν–ˆμŠ΅λ‹ˆλ‹€.


κ°€μž₯ λ¨Όμ € ν•΄μ•Όν•  일은 HttpClient 객체λ₯Ό μƒμ„±ν•˜κ³  Service Interfaceλ₯Ό μ •μ˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
μ˜ˆμ œμ—μ„œ μ‚¬μš©ν•  base URL은 "http://jsonplaceholder.typicode.com"을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

HttpClient httpClient = new HttpClient.Builder()
            .baseUrl("http://jsonplaceholder.typicode.com")
            .build();

JSONPlaceholderμ—μ„œ μ œκ³΅ν•˜λŠ” Post data에 λŒ€ν•œ json은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
(이 λ•Œ POSTλŠ” HTTP Methodκ°€ μ•„λ‹Œ, κ²Œμ‹œκΈ€μ΄λž€ 의미의 μ˜μ–΄ λ‹¨μ–΄μž…λ‹ˆλ‹€.)

{
    "userId": 1,
    "id": 1,
    "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}

λ”°λΌμ„œ 이에 맞게 data classλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

public class Post {
    int userId;
    int id;
    String title;
    String body;

    public Post(int userId, int id, String title, String body) {
        this.userId = userId;
        this.id = id;
        this.title = title;
        this.body = body;
    }

    // getter and setter μƒλž΅

    @Override
    public String toString() {
        return "Post{" +
                "userId=" + userId +
                ", id=" + id +
                ", title='" + title + '\'' +
                ", body='" + body + '\'' +
                '}';
    }
}

그리고 이λ₯Ό ν™œμš©ν•˜μ—¬ Service Interfaceλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

public interface HttpService {
    @RequestMapping(value="/posts", method=RequestMethod.GET)
    CallTask<List<Post>> getPosts();

    @RequestMapping(value="/posts", method=RequestMethod.POST)
    CallTask<Post> postPosts(@RequestBody Post post);
}

λ‹€μŒ λ‹¨κ³„λ‘œλŠ” HttpClient의 create() λ©”μ†Œλ“œλ₯Ό 톡해 Service Interface에 μΈμŠ€ν„΄μŠ€λ₯Ό μ£Όμž…ν•©λ‹ˆλ‹€.

HttpService httpService = httpClient.create(HttpService.class);

μ•žμ„  μ€€λΉ„ μž‘μ—…μ΄ λͺ¨λ‘ μ™„λ£Œλ˜μ—ˆλ‹€λ©΄ Http GET method둜 Sync/Async 톡신을 μ‹€μŠ΅ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

Synchronous GET

    CallTask<List<Post>> posts = httpService.getPosts();
    try {
        Response<List<Post>> res = posts.execute(); // execute()λ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ μ‹€μ œ 톡신이 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
        List<Post> result = res.body();
        for (Post post : result) {
            System.out.println(post.toString());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

Asynchronous GET

    CallTask<List<Post>> posts = httpService.getPosts();
    posts.enqueue(new CallBack() {
        @Override
        public void onResponse(Response<?> response) throws IOException {
            System.out.println(response.body());
        }
        @Override
        public void onFailure(IOException e) {
            System.out.println(e.getMessage());
        }
    });

Synchronous POST

λ‹€μŒμ€ POST Http Methodλ₯Ό μ‚¬μš©ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€.

    Post newPost = new Post(101, 101, "new Title", "new Body");
    CallTask<Post> post = httpService.postPosts(newPost);
    try {
        Post result = post.execute().body();
        System.out.println(result);
    } catch (IOException e) {
        e.printStackTrace();
    }

μ΄μ œλΆ€ν„°λŠ” HttpService λ‚΄ λ©”μ†Œλ“œ μ •μ˜μ™€ HttpClient 객체 생성 λ‹¨κ³„λ§Œ μˆ˜μ •ν•΄κ°€λ©΄μ„œ λ‹€μ–‘ν•œ 예제λ₯Ό μ‹€μŠ΅ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

@PathParam

@PathParam 을 μ‚¬μš©ν•  λ•ŒλŠ” Relative URL에 μ€‘κ΄„ν˜Έ{} λ‚΄ μΌμΉ˜ν•˜λŠ” name 값이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

public interface HttpService {
    @RequestMapping(value="/posts/{id}", method=RequestMethod.GET)
    CallTask<Post> getPostsById(@PathParam("id") int id);
}
    CallTask<Post> post = httpService.getPostsById(5);
    try {
        Post result = post.execute().body();
        System.out.println(result.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }

@Query

    @RequestMapping(value="/posts", method=RequestMethod.GET)
    CallTask<List<Post>> getPostsByUserId(@Query("userId") Integer userId);

@Queries

@Queries λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•˜λ‚˜μ˜ name에 λŒ€ν•΄ μ—¬λŸ¬ 개의 valueλ₯Ό query둜 ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

    @RequestMapping(value="/posts", method=RequestMethod.GET)
    CallTask<List<Post>> getPostsById(@Queries("id") List<Integer> id);

@QueryMap

@QueryMap 을 μ‚¬μš©ν•˜λ©΄ ν•œ λ²ˆμ— λ‹€μ–‘ν•œ Query λ₯Ό ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

    @RequestMapping(value="/posts", method=RequestMethod.GET)
    CallTask<List<Post>> getPostsByUserId(@QueryMap Map<String, Integer> userId);

@Header, @HeaderMap

@Header, @HeaderMap λ₯Ό μ‚¬μš©ν•˜λ©΄ Request에 Headerλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    @RequestMapping(value="/posts", method=RequestMethod.GET)
    CallTask<List<Post>> getPostsWithHeader(@Header("content-type") String contentType);
    @RequestMapping(value="/posts", method=RequestMethod.GET)
    CallTask<List<Post>> getPostsWithHeaderMap(@HeaderMap Map<String, String> headerMap);

@Headers

@Headers λŠ” Parameter μˆ˜μ€€μ΄ μ•„λ‹Œ Method μˆ˜μ€€μ˜ μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.

    @Headers({
        "content-type:text/html",
        "User-Agent:Naver"
    })
    @RequestMapping(value="/posts", method=RequestMethod.GET)
    CallTask<List<Post>> getPostsWithHeaders();

@FormUrlEncoded

@FormUrlEncoded λŠ” Request Bodyλ₯Ό κ΅¬μ„±ν•˜λŠ” ν•˜λ‚˜μ˜ λ°©μ‹μœΌλ‘œ, @Field 와 @FieldMap 을 μ‚¬μš©ν•˜μ—¬ name:value ν˜•μ‹μ„ κ°–μŠ΅λ‹ˆλ‹€.
@RequestBody 와 ν•¨κ»˜ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

    @FormUrlEncoded
    @RequestMapping(value="/posts", method=RequestMethod.POST)
    CallTask<Post> postPostsFormUrlEncoded(@Field("userId") int userId, @Field("title") String title);

@DynamicURL

@DynamicURL 은 HttpClient κ°μ²΄μ—μ„œ μ§€μ •ν•œ base URLμ΄λ‚˜ @RequestMapping 의 relative URLκ³Ό 상관 없이 λ™μ μœΌλ‘œ URL을 μ„€μ •ν•  수 있게 ν•΄μ£ΌλŠ” Method μˆ˜μ€€μ˜ μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
@Query, @Queries, @QueryMap 은 μ‚¬μš©ν•  수 μžˆμœΌλ‚˜ @PathParam 은 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ‹€μ œ URL을 μž…λ ₯ λ°›λŠ” 것은 Parameter μˆ˜μ€€μ˜ @URL μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ„€μ •λœ Stringμ΄λ‚˜ URL, URI 등을 톡해 κ°€λŠ₯ν•©λ‹ˆλ‹€.

    @DynamicURL(method=RequestMethod.GET)
    CallTask<List<Post>> getPostsByDynamicURL(@URL String url);

Clone this wiki locally