Java远程访问接口的几种方式
一、Java访问远程url接口并获取结果
1、原生JavaAPI获取
package com.util;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
/**
* <pre>
* 功能:httpUrlConnection访问远程接口工具
* 日期:2015年3月17日 上午11:19:21
* </pre>
*/
public class HttpUrlConnectionUtil {
/**
* <pre>
* 方法体说明:向远程接口发起请求,返回字符串类型结果
* @param url 接口地址
* @param requestMethod 请求方式
* @param params 传递参数 重点:参数值需要用Base64进行转码
* @return String 返回结果
* </pre>
*/
public static String httpRequestToString(String url, String requestMethod,
Map<String, String> params){
String result = null;
try {
InputStream is = httpRequestToStream(url, requestMethod, params);
byte[] b = new byte[is.available()];
is.read(b);
result = new String(b);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* <pre>
* 方法体说明:向远程接口发起请求,返回字节流类型结果
* 作者:itar
* 日期:2015年3月17日 上午11:20:25
* @param url 接口地址
* @param requestMethod 请求方式
* @param params 传递参数 重点:参数值需要用Base64进行转码
* @return InputStream 返回结果
* </pre>
*/
public static InputStream httpRequestToStream(String url, String requestMethod,
Map<String, String> params){
InputStream is = null;
try {
String parameters = "";
boolean hasParams = false;
//将参数集合拼接成特定格式,如name=zhangsan&age=24
for(String key : params.keySet()){
String value = URLEncoder.encode(params.get(key), "UTF-8");
parameters += key +"="+ value +"&";
hasParams = true;
}
if(hasParams){
parameters = parameters.substring(0, parameters.length()-1);
}
//请求方式是否为get
boolean isGet = "get".equalsIgnoreCase(requestMethod);
//请求方式是否为post
boolean isPost = "post".equalsIgnoreCase(requestMethod);
if(isGet){
url += "?"+ parameters;
}
URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
//请求的参数类型(使用restlet框架时,为了兼容框架,必须设置Content-Type为“”空)
conn.setRequestProperty("Content-Type", "application/octet-stream");
//conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//设置连接超时时间
conn.setConnectTimeout(50000);
//设置读取返回内容超时时间
conn.setReadTimeout(50000);
//设置向HttpURLConnection对象中输出,因为post方式将请求参数放在http正文内,因此需要设置为ture,默认false
if(isPost){
conn.setDoOutput(true);
}
//设置从HttpURLConnection对象读入,默认为true
conn.setDoInput(true);
//设置是否使用缓存,post方式不能使用缓存
if(isPost){
conn.setUseCaches(false);
}
//设置请求方式,默认为GET
conn.setRequestMethod(requestMethod);
//post方式需要将传递的参数输出到conn对象中
if(isPost){
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(parameters);
dos.flush();
dos.close();
}
//从HttpURLConnection对象中读取响应的消息
//执行该语句时才正式发起请求
is = conn.getInputStream();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
}
2、利用httpClient访问获取
package com.util;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils;
/**
* <pre>
* 功能:httpClient访问远程接口工具类
* 日期:2015年3月17日 上午11:19:21
* </pre>
*/
@SuppressWarnings("deprecation")
public class HttpClientUtil {
/**
* <pre>
* 方法体说明:向远程接口发起请求,返回字符串类型结果
* @param url 接口地址
* @param requestMethod 请求类型
* @param params 传递参数
* @return String 返回结果
* </pre>
*/
public static String httpRequestToString(String url, String requestMethod,
Map<String, String> params, String ...auth){
//接口返回结果
String methodResult = null;
try {
String parameters = "";
boolean hasParams = false;
//将参数集合拼接成特定格式,如name=zhangsan&age=24
for(String key : params.keySet()){
String value = URLEncoder.encode(params.get(key), "UTF-8");
parameters += key +"="+ value +"&";
hasParams = true;
}
if(hasParams){
parameters = parameters.substring(0, parameters.length()-1);
}
//是否为GET方式请求
boolean isGet = "get".equalsIgnoreCase(requestMethod);
boolean isPost = "post".equalsIgnoreCase(requestMethod);
boolean isPut = "put".equalsIgnoreCase(requestMethod);
boolean isDelete = "delete".equalsIgnoreCase(requestMethod);
//创建HttpClient连接对象
DefaultHttpClient client = new DefaultHttpClient();
HttpRequestBase method = null;
if(isGet){
url += "?" + parameters;
method = new HttpGet(url);
}else if(isPost){
method = new HttpPost(url);
HttpPost postMethod = (HttpPost) method;
StringEntity entity = new StringEntity(parameters);
postMethod.setEntity(entity);
}else if(isPut){
method = new HttpPut(url);
HttpPut putMethod = (HttpPut) method;
StringEntity entity = new StringEntity(parameters);
putMethod.setEntity(entity);
}else if(isDelete){
url += "?" + parameters;
method = new HttpDelete(url);
}
method.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 6000);
//设置参数内容类型
method.addHeader("Content-Type","application/x-www-form-urlencoded");
//httpClient本地上下文
HttpClientContext context = null;
if(!(auth==null || auth.length==0)){
String username = auth[0];
String password = auth[1];
UsernamePasswordCredentials credt = new UsernamePasswordCredentials(username,password);
//凭据提供器
CredentialsProvider provider = new BasicCredentialsProvider();
//凭据的匹配范围
provider.setCredentials(AuthScope.ANY, credt);
context = HttpClientContext.create();
context.setCredentialsProvider(provider);
}
//访问接口,返回状态码
HttpResponse response = client.execute(method, context);
//返回状态码200,则访问接口成功
if(response.getStatusLine().getStatusCode()==200){
methodResult = EntityUtils.toString(response.getEntity());
}
client.close();
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return methodResult;
}
}
Java远程访问接口的几种方式的更多相关文章
- Java中创建对象的几种方式
Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...
- JAVA解析XML的四种方式
java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...
- Java添加事件的四种方式
Java添加事件的几种方式(转载了codebrother的文章,做了稍微的改动) /** * Java事件监听处理——自身类实现ActionListener接口,作为事件监听器 * * @author ...
- java解析xml的几种方式
java解析xml的几种方式 DOM DOM的全称是Document ObjectModel,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称D ...
- Java中创建对象的五种方式
我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...
- java 实现websocket的三种方式
Java中实现websocket常见有以下三种方式: 使用tomcat的websocket实现,需要tomcat 7.x,JEE7的支持. 使用spring的websocket,spring与webs ...
- Java新建线程的两种方式
Java新建线程有两种方式,一种是通过继承Thread类,一种是实现Runnable接口,下面是新建线程的两种方式. 我们假设有个竞赛,有一个选手A做俯卧撑,一个选手B做仰卧起坐.分别为两个线程: p ...
- 【转】Java中创建对象的5种方式
Java中创建对象的5种方式 作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有 ...
- Java创建线程的四种方式
Java创建线程的四种方式 1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,run()方法的内容就是该线程执行的内容 创建Thread子类的实例,即创建了线程对象. ...
随机推荐
- java maven项目迁移时缺失jar包 或者 maven jar包缺失时的解决方案
这样弄完,jar包就都下载好了,就不缺失了. 从GitHub上checkout一个项目下来,导入idea后发现加载依赖奇慢无比,所以临时把网络调成FQ的代理,结果会发现idea会停止之前的下载,那怎么 ...
- CSS布局的一些技巧
max-width 通常使元素水平居中用的较多的方法为: #main { width: 600px; margin: 0 auto; } 但是,当浏览器窗口比元素的宽度还要窄时,浏览器会显示一个水平滚 ...
- [BZOJ4082][Wf2014]Surveillance[倍增]
题意 给你一个长度为 \(len\) 的环,以及 \(n\) 个区间,要你选择尽量少的区间,使得它们完全覆盖整个环.问最少要多少个区间. \(len,n\leq 10^6\) . 分析 考虑普通的区间 ...
- 深入浅出OAuth2.0授权
一.前言 说到OAuth,先来一段百度到的比较官方的解释: OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信 ...
- 写个发邮件的功能php的(全代码)
---恢复内容开始--- 正好做了个项目,需要在线留言,一般在线留言发邮件是很常见的方式,一开始从网上搜了很久都没有很全的,也有全一点的,但是也不能用,运行不成功,下面给大家分享一下运行成功了的全部代 ...
- OpenStack与OpenDaylight的对接过程
由于项目中需要使用OpenDaylight(Oxygen)替换OpenStack(Otaca)中的neutron-openvswitch-agent,能找到的一些资料都是比较旧的版本,官网上的文档也一 ...
- Ubuntu 18.04下Couldn't connect to Docker daemon at http+docker://localunixsocket解决办法
一台服务器系统为:Ubuntu 18.04 LTS,上面建了git裸仓库,用于开发吧代码push到这里.同时WEB测试环境通过docker也部署在这台.通过git钩子post-receive,当有新代 ...
- 【Alpha】第八次Scrum meeting
今日任务一览: 姓名 今日完成任务 所耗时间 刘乾 学习js并学会使用js读写xml文件.学习python读取xml的方式... 然后上午满课,下午从1点到10点当计组助教去沙河教了一下午+一晚上,所 ...
- 读书笔记(chapter5)
系统调用 5.1与内核通信 1.系统调用在用户空间进程和硬件设备之间添加一个中间层.作用有三个:它为用户空间提供了一种硬件的抽象接口:系统调用保证了系统的稳定和安全:系统调用是用户空间访问内核的唯一手 ...
- YQCB冲刺第二周第五天
今天的任务为实现由用户设置每月初始额度的功能. 昨天的任务为实现精准查账的功能. 遇到的问题为界面的布局以及精准查账按什么标准查找,最后决定按分类查账与时间查账相结合. 站立会议 任务面板