调用Restful接口【HttpURLConnection、HttpClients】
一、区别
1. HttpURLConnection是Java的标准类,它继承自URLConnection,可用于向指定网站发送GET请求、POST请求。采用流式处理,比较便于流量管控、处理大的文件或参数
2. HttpClient 是Apache
的一个三方网络框架,网络请求做了完善的封装,api众多,用起来比较方便,开发快。
二、HttpURLConnection实现调用Restful接口
public static void main(String[] args) throws Exception{ String url = "http://localhost:8080/gjxx-system-web/getBusiness?licnum=" + "123&organiz="+"345"; URL urlUtil = new URL(url); /** * 此处的urlConnection对象实际上是根据URL的请求协议(此处是http)生成的URLConnection类的子类HttpURLConnection, * 故此处最好将其转化为HttpURLConnection类型的对象,以便用到HttpURLConnection更多的API. */ HttpURLConnection urlConnnection = (HttpURLConnection) urlUtil.openConnection(); //设定请求的方法为"POST",默认是GET urlConnnection.setRequestMethod("POST"); //设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false; urlConnnection.setDoOutput(true); //设置是否从httpUrlConnection读入,默认情况下是true; urlConnnection.setDoInput(true); //Post请求不能使用缓存 urlConnnection.setUseCaches(true); //设定传送的内容类型是可序列化的java对象(如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException) urlConnnection.setRequestProperty("Content-Type", "application/json"); //设置连接超时 urlConnnection.setConnectTimeout(10000); //设置读取超时(从输入流读取时的超时) urlConnnection.setReadTimeout(20000); /** * connect()会按照之前set生成HttpHeader * 正文的内容是通过outputStream流写入 */ // 此处getOutputStream会隐含的进行connect() OutputStream outputStream = urlConnnection.getOutputStream(); JSONObject jsonObject = new JSONObject(); jsonObject.put("licnum", "123"); jsonObject.put("organiz", "345"); //向对象输出流写出数据,outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络 outputStream.write(jsonObject.toString().getBytes("utf-8")); //刷新对象输出流,将任何字节都写入潜在的流中(些处为outputStream) outputStream.flush(); //关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中, 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器 outputStream.close(); /** * 实际发送请求的代码段在下面 */ // 调用HttpURLConnection连接对象的getInputStream()函数,将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。 InputStream inputStream = urlConnnection.getInputStream(); // <===注意,实际发送请求的代码段就在这里 BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "utf-8")); String line = ""; String result = ""; for (; (line = br.readLine()) != null; result += line) { ; } System.out.println(result); br.close(); }
三、HttpClient实现调用Restful接口
方式一:Http调用第三方接口代码
/**
* 房融界接口对接
* @return
*/
public Map<String,Object> frjRequest(){
String url="房融界提供的接口地址";
String result = "";
HttpPost httppost=new HttpPost(url); //建立HttpPost对象
CloseableHttpClient client = HttpClients.createDefault();//创建HttpClient对象
try {
//添加参数
List<NameValuePair> paramsList=new ArrayList<NameValuePair>();
paramsList.add(new BasicNameValuePair("键","值"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramsList, "UTF-8");
//设置请求和传输时长
RequestConfig.Builder builder = RequestConfig.custom();
builder.setSocketTimeout(120000);
builder.setConnectTimeout(60000);
RequestConfig config = builder.build();
httppost.setEntity(entity);
httppost.setConfig(config);
//发送Post
CloseableHttpResponse response = client.execute(httppost);
HttpEntity httpEntity = response.getEntity();
if (httpEntity != null) {
result = EntityUtils.toString(httpEntity, "UTF-8");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
client.close();
httppost.releaseConnection();
} catch (IOException e) {
logger.info(e.toString(), e);
}
}
return JSON.parseObject(result, Map.class);
}
方法二:传递JSON格式请求
/**
* 发送json流数据*/
public static String postWithJSON(String url, String jsonParam) throws Exception {
HttpPost httpPost = new HttpPost(url);
CloseableHttpClient client = HttpClients.createDefault();
String respContent = null;
StringEntity entity = new StringEntity(jsonParam, "utf-8");//解决中文乱码问题
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
HttpResponse resp = client.execute(httpPost);
if (resp.getStatusLine().getStatusCode() == 200) {
HttpEntity he = resp.getEntity();
respContent = EntityUtils.toString(he, "UTF-8");
}
return respContent;
}
注意:
//Map --> JSONString
Map<String,Object> param = new HashMap<>();
param.put("name",name);
param.put("phone",phone);
String jsonParam = JSONUtils.toJSONString(param);
//JSONString --> JSONObj
JSONObject resultObj = JSONObject.parseObject(jsonParam);
方法三:传递字符串格式数据
public static String postWithString(String url, String stringParam) throws Exception {
HttpPost httpPost = new HttpPost(url);
CloseableHttpClient client = HttpClients.createDefault();
String respContent = null;
StringEntity entity = new StringEntity(stringParam, "utf-8");//解决中文乱码问题
entity.setContentEncoding("UTF-8");
entity.setContentType("text");
httpPost.setEntity(entity);
HttpResponse resp = client.execute(httpPost);
if (resp.getStatusLine().getStatusCode() == 200) {
HttpEntity he = resp.getEntity();
respContent = EntityUtils.toString(he, "UTF-8");
}
return respContent;
}