使用Java调用RestFul接口的几种方法

 

1. HttpURLConnection

public String postRequest(String url, String param) {
    StringBuffer result = new StringBuffer();

    HttpURLConnection conn = null;
    OutputStream out = null;
    BufferedReader reader = null;
    try {
        URL restUrl = new URL(url);
        conn = (HttpURLConnection) restUrl.openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        conn.setDoInput(true);

        conn.setRequestProperty("accept", "*/*");
        conn.setRequestProperty("connection", "Keep-Alive");
        conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
        conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");

        conn.connect();
        out = conn.getOutputStream();
        out.write(param.getBytes());
        out.flush();

        int responseCode = conn.getResponseCode();
        if(responseCode != 200){
            throw new RuntimeException("Error responseCode:" + responseCode);
        }

        String output = null;
        reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
        while((output=reader.readLine()) != null){
            result.append(output);
        }
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException("调用接口出错:param+"+param);
    } finally {
        try {
            if(reader != null){
                reader.close();
            }
            if(out != null){
                out.close();
            }
            if(conn != null){
                conn.disconnect();
            }
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }

    return result.toString();
}

 

2. HttpClient方式

public class HttpClientUtil {

    public String post(String url, Map<String, Object> pramMap) throws Exception {
        String result = null;
        // DefaultHttpClient已过时,使用CloseableHttpClient替代
        CloseableHttpClient closeableHttpClient = null;
        CloseableHttpResponse response = null;
        try {
            closeableHttpClient = HttpClients.createDefault();
            HttpPost postRequest = new HttpPost(url);
            List<NameValuePair> pairs = new ArrayList<>();
            if(pramMap!=null && pramMap.size() > 0){
                for (Map.Entry<String, Object> entry : pramMap.entrySet()) {
                    pairs.add(new BasicNameValuePair(entry.getKey(), String.valueOf(entry.getValue())));
                }
            }
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(pairs, "utf-8");
            postRequest.setEntity(formEntity);

            response = closeableHttpClient.execute(postRequest);
            if(response!=null && response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
                result = EntityUtils.toString(response.getEntity(), "utf-8");
            }else{
                throw new Exception("post请求失败,url" + url);
            }

        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            try {
                if(response != null){
                    response.close();
                }
                if(closeableHttpClient != null){
                    closeableHttpClient.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return result;
    }

}

 

3.  spring提供的RestTemplate模板方式

public class RestTemplateUtil {
 
    @Bean
    public RestTemplate restTemplate(){
        RestTemplate template = new RestTemplate();
        // messageConverters是RestTemplate的一个final修饰的List类型的成员变量
        // messageConverters的第二个元素存储的是StringHttpMessageConverter类型的消息转换器
        // StringHttpMessageConverter的默认字符集是ISO-8859-1,在此处设置utf-8字符集避免产生乱码
        template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("utf-8")));
        return template;
    }
 
    @Autowired
    private RestTemplate restTemplate;
 
    public String post(String url, String jsonParam){
        // 自定义请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAcceptCharset(Collections.singletonList(Charset.forName("utf-8")));
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
 
        // 参数
        HttpEntity<String> entity = new HttpEntity<String>(jsonParam, headers);
        // POST方式请求
        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
        if(responseEntity == null){
            return null;
        }
 
        return responseEntity.getBody().toString();
    }
 
}