java web api接口调用
Web Services 被W3C进行了标准化定义。
Web Services 发布到网上,可以公布到某个全局注册表,自动提供服务URL,服务描述、接口调用要求、参数说明以及返回值说明。比如中国气象局可以发布天气预报服务。所有其它网站或手机App如果需要集成天气预报功能,都可以访问该Web Service获取数据。
Web Services 主要设计目标是提供公共服务。
Web Services 全部基于XML。按照W3C标准来描述服务的各个方面(参数、参数传递、返回值及服务发布发现等)。要描述清楚Web Services标准的各个方面,可能需要2000页的文档。
Web Services 还有标准的身份验证方式(非公共服务时验证使用者身份)。
轻量化的Web API
公司内部使用的私有服务,我们知道它的接口Url,因此不需要自动发现它。我们有它的服务接口文档,因此也不需要自动描述和自动调用。
即使Web Services的特性(自动发现、自动学会调用方式)很美好,但私有服务往往不需要这些。
Web API一般基于HTTP/REST来实现,什么都不需要定义,参数(输入的数据)可以是JSON, XML或者简单文本,响应(输出数据)一般是JSON或XML。它不提供服务调用标准和服务发现标准。可以按你服务的特点来写一些简单的使用说明给使用者。
获取远程数据的方式正在从Web Services向Web API转变。
Web Services的架构要比Web API臃肿得多,它的每个请求都需要封装成XML并在服务端解封。因此它不易开发且吃更多的资源(内存、带宽)。性能也不如Web API。
/**
* 根据指定url,编码获得字符串
*
* @param address
* @param Charset
* @return
*/
public static String getStringByConAndCharset(String address, String Charset) {
StringBuffer sb;
try {
URL url = new URL(address);
URLConnection con = url.openConnection();
BufferedReader bw = new BufferedReader(new InputStreamReader(con.getInputStream(), Charset));
String line;
sb = new StringBuffer();
while ((line = bw.readLine()) != null) {
sb.append(line + "\n");
}
bw.close();
} catch (Exception e) {
e.printStackTrace();
sb = new StringBuffer();
}
return sb.toString();
}
/**
* 通过post方式获取页面源码
*
* @param urlString
* url地址
* @param paramContent
* 需要post的参数
* @param chartSet
* 字符编码(默认为ISO-8859-1)
* @return
* @throws IOException
*/
public static String postUrl(String urlString, String paramContent, String chartSet, String contentType) {
long beginTime = System.currentTimeMillis();
if (chartSet == null || "".equals(chartSet)) {
chartSet = "ISO-8859-1";
}
StringBuffer result = new StringBuffer();
BufferedReader in = null;
try {
URL url = new URL((urlString));
URLConnection con = url.openConnection();
// 设置链接超时
con.setConnectTimeout(3000);
// 设置读取超时
con.setReadTimeout(3000);
// 设置参数
con.setDoOutput(true);
if (contentType != null && !"".equals(contentType)) {
con.setRequestProperty("Content-type", contentType);
}
OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream(), chartSet);
writer.write(paramContent);
writer.flush();
writer.close();
in = new BufferedReader(new InputStreamReader(con.getInputStream(), chartSet));
String line = null;
while ((line = in.readLine()) != null) {
result.append(line + "\r\n");
}
in.close();
} catch (MalformedURLException e) {
logger.error("Unable to connect to URL: " + urlString, e);
} catch (SocketTimeoutException e) {
logger.error("Timeout Exception when connecting to URL: " + urlString, e);
} catch (IOException e) {
logger.error("IOException when connecting to URL: " + urlString, e);
} finally {
if (in != null) {
try {
in.close();
} catch (Exception ex) {
logger.error("Exception throws at finally close reader when connecting to URL: " + urlString, ex);
}
}
long endTime = System.currentTimeMillis();
logger.info("post用时:" + (endTime - beginTime) + "ms");
}
return result.toString();
}
/**
* 发送https请求
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET、POST)
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
*/
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) throws Exception {
JSONObject json = null;
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 当outputStr不为null时向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 注意编码格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
json = JSON.parseObject(buffer.toString());
String errcode = json.getString("errcode");
if (!StringUtil.isBlank(errcode) && !errcode.equals("0")) {
logger.error(json.toString());
throw new SysException("ERRCODE:"+ errcode);
}
return json;
}
}
java web api接口调用的更多相关文章
- WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递
回到目录 上一讲中介绍了使用HttpClient如何去调用一个标准的Web Api接口,并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对 ...
- Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口
1.WebApi系列~通过HttpClient来调用Web Api接口 http://www.cnblogs.com/lori/p/4045413.html HttpClient使用详解(java版本 ...
- ASP.NET Web API 接口执行时间监控
软件产品常常会出现这样的情况:产品性能因某些无法预料的瓶颈而受到干扰,导致程序的处理效率降低,性能得不到充分的发挥.如何快速有效地找到软件产品的性能瓶颈,则是我们感兴趣的内容之一. 在本文中,我将解释 ...
- Web API接口之FileReader
Web API接口之FileReader *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...
- Winform混合式开发框架访问Web API接口的处理
在我的混合式开发框架里面,集成了WebAPI的访问,这种访问方式不仅可以实现简便的数据交换,而且可以在多种平台上进行接入,如Winform程序.Web网站.移动端APP等多种接入方式,Web API的 ...
- Web API接口设计经验总结
在Web API接口的开发过程中,我们可能会碰到各种各样的问题,我在前面两篇随笔<Web API应用架构在Winform混合框架中的应用(1)>.<Web API应用架构在Winfo ...
- 如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问。
由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题. 刚开始没做任何处理,用jsonp的方式调用 web api 接口, ...
- Web API接口 安全验证
在上篇随笔<Web API应用架构设计分析(1)>,我对Web API的各种应用架构进行了概括性的分析和设计,Web API 是一种应用接口框架,它能够构建HTTP服务以支撑更广泛的客户端 ...
- Asp.Net Web Api 接口,拥抱支持跨域访问。
如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问. 由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题 ...
随机推荐
- #6432. 「PKUSC2018」真实排名(组合数学)
题面 传送门 题解 这数据范围--这输出大小--这模数--太有迷惑性了-- 首先对于\(0\)来说,不管怎么选它们的排名都不会变,这个先特判掉 对于一个\(a_i\)来说,如果它不选,那么所有大于等于 ...
- 使用Tensorflow object detection API——训练模型(Window10系统)
[数据标注处理] 1.先将下载好的图片训练数据放在models-master/research/images文件夹下,并分别为训练数据和测试数据创建train.test两个文件夹.文件夹目录如下 2. ...
- 【2014年百度之星资格赛1001】Energy Conversion
Problem Description 魔法师百小度也有遇到难题的时候—— 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力. 过了许久, ...
- js-eval运算符
js中使用eval运算符需要注意—— eval()只有一个参数 传入的参数是字符串时,才会去解析执行:否则,将直接返回这个参数 作用域与调用它的变量作用域保持一致 返回字符串中最后一个表达式或语句的值 ...
- vs 部署SharePoint项目时, package丢失
bug描述:vs部署sharepoint项目时报错:重启iis应用池失败,未将对象设置引用到实例. 解决方案:查看项目文件(包括隐藏文件),发现package文件不见了,在回收站内能找到被删除的pac ...
- POJ1185炮兵阵地(状态压缩DP)
POJ飞翔.数据弱 ZQOJ飞翔 数据强 Description 司令部的将军们打算在N×M的网格地图上部署他们的炮兵部队.一个N×M的地图由N行M列组成,地图的每一格可能是山地(用"H&q ...
- jq自定义鼠标右键菜单
效果: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- sqoop数据校验
sqoop数据校验 # check data oracle_cnt=$(sqoop eval \ -Dmapred.job.queue.name=${queue} \ --connect ${conn ...
- 查看SQL SERVER Job details
SELECT [sJOB].[job_id] AS [JobID] , [sJOB].[name] AS [JobName] , [sDBP].[name] AS [JobOwner] , [sCAT ...
- python 安装以及初步应用
官网下载地址: https://www.jetbrains.com/pycharm/ Windows系统安装: https://www.jianshu.com/p/042324342bf4 mac系统 ...