使用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();
}
}