com.xyxy.platform.examples.showcase.functional.rest.UserRestFT.java Source code

Java tutorial

Introduction

Here is the source code for com.xyxy.platform.examples.showcase.functional.rest.UserRestFT.java

Source

/*******************************************************************************
 * Copyright (c) 2005, 2014
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.xyxy.platform.examples.showcase.functional.rest;

import static org.assertj.core.api.Assertions.*;

import java.io.IOException;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.HttpStatusCodeException;
import org.springframework.web.client.RestTemplate;
import com.xyxy.platform.examples.showcase.functional.BaseFunctionalTestCase;
import com.xyxy.platform.examples.showcase.webservice.rest.UserDTO;
import com.xyxy.platform.modules.core.test.category.Smoke;
import com.xyxy.platform.modules.core.web.Servlets;

import com.google.common.collect.Lists;

/**
 * Rest Service?
 * 1. exchange()Header???
 * 2. JDK HttpConnectionApache HttpClient4?
 * 3. ?JSONXML??
 * 4. ?Shiro?HttpBasic?
 * 
 *
 */
public class UserRestFT extends BaseFunctionalTestCase {

    private static String resourceUrl = baseUrl + "/api/secure/v1/user";

    private RestTemplate jdkTemplate;
    private RestTemplate httpClientRestTemplate;
    private HttpComponentsClientHttpRequestFactory httpClientRequestFactory;

    @Before
    public void initRestTemplate() {
        // JDK Connection
        jdkTemplate = new RestTemplate();
        // (optional)20
        ((SimpleClientHttpRequestFactory) jdkTemplate.getRequestFactory()).setConnectTimeout(20000);
        ((SimpleClientHttpRequestFactory) jdkTemplate.getRequestFactory()).setReadTimeout(20000);

        // HttpClient4.0
        httpClientRestTemplate = new RestTemplate();
        httpClientRequestFactory = new HttpComponentsClientHttpRequestFactory();
        // (optional)20
        httpClientRequestFactory.setConnectTimeout(20000);

        httpClientRestTemplate.setRequestFactory(httpClientRequestFactory);

        // ?HttpBasic HeaderInterceptor
        ClientHttpRequestInterceptor interceptor = new HttpBasicInterceptor("admin", "admin");
        httpClientRestTemplate.setInterceptors(Lists.newArrayList(interceptor));
    }

    @After
    public void destoryClient() throws Exception {
        // HttpClient4
        httpClientRequestFactory.destroy();
    }

    /**
     * exchange()?Headers.
     * xml??.
     * jdk connection.
     */
    @Test
    public void getUserAsXML() {
        // Http Basic?
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.set(com.google.common.net.HttpHeaders.AUTHORIZATION,
                Servlets.encodeHttpBasic("admin", "admin"));
        System.out.println("Http header is" + requestHeaders);
        HttpEntity<?> requestEntity = new HttpEntity(requestHeaders);

        try {
            HttpEntity<UserDTO> response = jdkTemplate.exchange(resourceUrl + "/{id}.xml", HttpMethod.GET,
                    requestEntity, UserDTO.class, 1L);
            assertThat(response.getBody().getLoginName()).isEqualTo("admin");
            assertThat(response.getBody().getName()).isEqualTo("?");
            assertThat(response.getBody().getTeamId()).isEqualTo(1);

            // ?XML
            HttpEntity<String> xml = jdkTemplate.exchange(resourceUrl + "/{id}.xml", HttpMethod.GET, requestEntity,
                    String.class, 1L);
            System.out.println("xml output is " + xml.getBody());
        } catch (HttpStatusCodeException e) {
            fail(e.getMessage());
        }
    }

    /**
     * ClientHttpRequestInterceptorheader, see #initRestTemplate()
     * json??.
     * Apache Http client4.
     */
    @Test
    @Category(Smoke.class)
    public void getUserAsJson() {
        UserDTO user = httpClientRestTemplate.getForObject(resourceUrl + "/{id}.json", UserDTO.class, 1L);
        assertThat(user.getLoginName()).isEqualTo("admin");
        assertThat(user.getName()).isEqualTo("?");
        assertThat(user.getTeamId()).isEqualTo(1);

        try {
            // ?JSON
            String json = httpClientRestTemplate.getForObject(resourceUrl + "/{id}.json", String.class, 1L);
            System.out.println("json output is " + json);
        } catch (HttpStatusCodeException e) {
            fail(e.getMessage());
        }
    }

    /**
     * ?ShiroHttpBasic?
     */
    @Test
    public void authWithHttpBasic() {
        // Http Basic?
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.set(com.google.common.net.HttpHeaders.AUTHORIZATION,
                Servlets.encodeHttpBasic("admin", "wrongpassword"));
        HttpEntity<?> requestEntity = new HttpEntity(requestHeaders);

        try {
            jdkTemplate.exchange(resourceUrl + "/{id}.xml", HttpMethod.GET, requestEntity, UserDTO.class, 1L);
            fail("Get should fail with error username/password");
        } catch (HttpStatusCodeException e) {
            assertThat(e.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED);
        }
    }

    /**
     * ?HttpBasicHeaderInterceptor
     */
    public static class HttpBasicInterceptor implements ClientHttpRequestInterceptor {

        private final String user;
        private final String password;

        public HttpBasicInterceptor(String user, String password) {
            this.user = user;
            this.password = password;
        }

        @Override
        public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
                throws IOException {
            request.getHeaders().set(com.google.common.net.HttpHeaders.AUTHORIZATION,
                    Servlets.encodeHttpBasic(user, password));
            return execution.execute(request, body);
        }
    }
}