浅谈java调用Restful API接口的方式

摘要:最近有一个需求,为客户提供一些RestfulAPI接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试RestfulAPI接口,由于使用的是HTTPS,所以还要考虑到对于HTTPS的处理。由于我也是首次使用Java调用restful接口,所以还要研究一番,自然也是查阅了一些资料。

分析:这个问题与模块之间的调用不同,比如我有两个模块frontend和backend,frontend提供前台展示,backend提供数据支持。之前使用过Hession去把backend提供的服务注册成远程服务,在frontend端可以通过这种远程服务直接调到backend的接口。但这对于一个公司自己的一个项目耦合性比较高的情况下使用,没有问题。但是如果给客户注册这种远程服务,似乎不太好,耦合性太高。所以就考虑用一下方式进行处理。

基本介绍

Restful接口的调用,前端一般使用ajax调用,后端可以使用的方法比较多,

本次介绍三种:

1.HttpURLConnection实现

2.HttpClient实现

3.Spring的RestTemplate

一、HttpClient

HttpClient大家也许比较熟悉但又比较陌生,熟悉是知道他可以远程调用比如请求一个URL,然后在response里获取到返回状态和返回信息,但是今天讲的稍微复杂一点,因为今天的主题是HTTPS,这个牵涉到证书或用户认证的问题。

确定使用HttpClient之后,查询相关资料,发现HttpClient的新版本与老版本不同,随然兼容老版本,但已经不提倡老版本是使用方式,很多都已经标记为过时的方法或类。今天就分别使用老版本4.2和最新版本4.5.3来写代码。

老版本4.2

需要认证

在准备证书阶段选择的是使用证书认证

package com.darren.test.https.v42;
import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import org.apache.http.conn.ssl.SSLSocketFactory;
public class HTTPSCertifiedClient extends HTTPSClient {
	public HTTPSCertifiedClient() {
	}
	@Override
	  public void prepareCertificate() throws Exception {
		// 获得密匙库
		KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
		FileInputStream instream = new FileInputStream(
		        new File("C:/Users/zhda6001/Downloads/software/xxx.keystore"));
		// FileInputStream instream = new FileInputStream(new File("C:/Users/zhda6001/Downloads/xxx.keystore"));
		// 密匙库的密码
		trustStore.load(instream, "password".toCharArray());
		// 注册密匙库
		this.socketFactory = new SSLSocketFactory(trustStore);
		// 不校验域名
		socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
	}
}

跳过认证

在准备证书阶段选择的是跳过认证

package com.darren.test.https.v42;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.conn.ssl.SSLSocketFactory;
public class HTTPSTrustClient extends HTTPSClient {
	public HTTPSTrustClient() {
	}
	@Override
	  public void prepareCertificate() throws Exception {
		// 跳过证书验证
		SSLContext ctx = SSLContext.getInstance("TLS");
		X509TrustManager tm = new X509TrustManager() {
			@Override
			      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
			}
			@Override
			      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
			}
			@Override
			      public X509Certificate[] getAcceptedIssuers() {
				return null;
			}
		}
		;
		// 设置成已信任的证书
		ctx.init(null, new TrustManager[] {
			tm
		}
		, null);
		// 穿件SSL socket 工厂,并且设置不检查host名称
		this.socketFactory = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
	}
}

总结

现在发现这两个类都继承了同一个类HTTPSClient,并且HTTPSClient继承了DefaultHttpClient类,可以发现,这里使用了模板方法模式。

package com.darren.test.https.v42;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
public abstract class HTTPSClient extends DefaultHttpClient {
	protected SSLSocketFactory socketFactory;
	/**
   * 初始化HTTPSClient
   *
   * @return 返回当前实例
   * @throws Exception
   */
	public HTTPSClient init() throws Exception {
		this.prepareCertificate();
		this.regist();
		return this;
	}
	/**
   * 准备证书验证
   *
   * @throws Exception
   */
	public abstract void prepareCertificate() throws Exception;
	/**
   * 注册协议和端口, 此方法也可以被子类重写
   */
	protected void regist() {
		ClientConnectionManager ccm = this.getConnectionManager();
		SchemeRegistry sr = ccm.getSchemeRegistry();
		sr.register(new Scheme("https", 443, socketFactory));
	}
}

下边是工具类

package com.darren.test.https.v42;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class HTTPSClientUtil {
	private static final String DEFAULT_CHARSET = "UTF-8";
	public static String doPost(HTTPSClient httpsClient, String url, Map<String, String> paramHeader,
	      Map<String, String> paramBody) throws Exception {
		return doPost(httpsClient, url, paramHeader, paramBody, DEFAULT_CHARSET);
	}
	public static String doPost(HTTPSClient httpsClient, String url, Map<String, String> paramHeader,
	      Map<String, String> paramBody, String charset) throws Exception {
		String result = null;
		HttpPost httpPost = new HttpPost(url);
		setHeader(httpPost, paramHeader);
		setBody(httpPost, paramBody, charset);
		HttpResponse response = httpsClient.execute(httpPost);
		if (response != null) {
			HttpEntity resEntity = response.getEntity();
			if (resEntity != null) {
				result = EntityUtils.toString(resEntity, charset);
			}
		}
		return result;
	}
	public static String doGet(HTTPSClient httpsClient, String url, Map<String, String> paramHeader,
	      Map<String, String> paramBody) throws Exception {
		return doGet(httpsClient, url, paramHeader, paramBody, DEFAULT_CHARSET);
	}
	public static String doGet(HTTPSClient httpsClient, String url, Map<String, String> paramHeader,
	      Map<String, String> paramBody, String charset) throws Exception {
		String result = null;
		HttpGet httpGet = new HttpGet(url);
		setHeader(httpGet, paramHeader);
		HttpResponse response = httpsClient.execute(httpGet);
		if (response != null) {
			HttpEntity resEntity = response.getEntity();
			if (resEntity != null) {
				result = EntityUtils.toString(resEntity, charset);
			}
		}
		return result;
	}
	private static void setHeader(HttpRequestBase request, Map<String, String> paramHeader) {
		// 设置Header
		if (paramHeader != null) {
			Set<String> keySet = paramHeader.keySet();
			for (String key : keySet) {
				request.addHeader(key, paramHeader.get(key));
			}
		}
	}
	private static void setBody(HttpPost httpPost, Map<String, String> paramBody, String charset) throws Exception {
		// 设置参数
		if (paramBody != null) {
			List<NameValuePair> list = new ArrayList<NameValuePair>();
			Set<String> keySet = paramBody.keySet();
			for (String key : keySet) {
				list.add(new BasicNameValuePair(key, paramBody.get(key)));
			}
			if (list.size() > 0) {
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);
				httpPost.setEntity(entity);
			}
		}
	}
}

然后是测试类:

package com.darren.test.https.v42;
import java.util.HashMap;
import java.util.Map;
public class HTTPSClientTest {
	public static void main(String[] args) throws Exception {
		HTTPSClient httpsClient = null;
		httpsClient = new HTTPSTrustClient().init();
		//httpsClient = new HTTPSCertifiedClient().init();
		String url = "https://1.2.6.2:8011/xxx/api/getToken";
		//String url = "https://1.2.6.2:8011/xxx/api/getHealth";
		Map<String, String> paramHeader = new HashMap<>();
		//paramHeader.put("Content-Type", "application/json");
		paramHeader.put("Accept", "application/xml");
		Map<String, String> paramBody = new HashMap<>();
		paramBody.put("client_id", "ankur.tandon.ap@xxx.com");
		paramBody.put("client_secret", "P@ssword_1");
		String result = HTTPSClientUtil.doPost(httpsClient, url, paramHeader, paramBody);
		//String result = HTTPSClientUtil.doGet(httpsClient, url, null, null);
		System.out.println(result);
	}
}

返回信息:

<?xml version="1.0" encoding="utf-8"?>
 <token>jkf8RL0sw+Skkflj8RbKI5hP1bEQK8PrCuTZPpBINqMYKRMxY1kWCjmCfT191Zpp88VV1aGHW8oYNWjEYS0axpLuGAX89ejCoWNbikCc1UvfyesXHLktcJqyUFiVjevhrEQxJPHncLQYWP+Xse5oD9X8vKFKk7InNTMRzQK7YBTZ/e3U7gswM/5cvAHFl6o9rEq9cWPXavZNohyvnXsohSzDo+BXAtXxa1xpEDLy/8h/UaP4n4dlZDJJ3B8t1Xh+CRRIoMOPxf7c5wKhHtOkEOeXW+xoPQKKSx5CKWwJpPuGIIFWF/PaqWg+JUOsVT7QGdPv8PMWJ9DwEwjTdxguDg==</token> 

新版本4.5.3

需要认证

package com.darren.test.https.v45;
import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import javax.net.ssl.SSLContext;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.ssl.SSLContexts;
public class HTTPSCertifiedClient extends HTTPSClient {
	public HTTPSCertifiedClient() {
	}
	@Override
	  public void prepareCertificate() throws Exception {
		// 获得密匙库
		KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
		FileInputStream instream = new FileInputStream(
		        new File("C:/Users/zhda6001/Downloads/software/xxx.keystore"));
		// FileInputStream instream = new FileInputStream(new File("C:/Users/zhda6001/Downloads/xxx.keystore"));
		try {
			// 密匙库的密码
			trustStore.load(instream, "password".toCharArray());
		}
		finally {
			instream.close();
		}
		SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, TrustSelfSignedStrategy.INSTANCE)
		        .build();
		this.connectionSocketFactory = new SSLConnectionSocketFactory(sslcontext);
	}
}

跳过认证

package com.darren.test.https.v45;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
public class HTTPSTrustClient extends HTTPSClient {
	public HTTPSTrustClient() {
	}
	@Override
	  public void prepareCertificate() throws Exception {
		// 跳过证书验证
		SSLContext ctx = SSLContext.getInstance("TLS");
		X509TrustManager tm = new X509TrustManager() {
			@Override
			      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
			}
			@Override
			      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
			}
			@Override
			      public X509Certificate[] getAcceptedIssuers() {
				return null;
			}
		}
		;
		// 设置成已信任的证书
		ctx.init(null, new TrustManager[] {
			tm
		}
		, null);
		this.connectionSocketFactory = new SSLConnectionSocketFactory(ctx);
	}
}

总结

package com.darren.test.https.v45;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
public abstract class HTTPSClient extends HttpClientBuilder {
	private CloseableHttpClient client;
	protected ConnectionSocketFactory connectionSocketFactory;
	/**
   * 初始化HTTPSClient
   *
   * @return 返回当前实例
   * @throws Exception
   */
	public CloseableHttpClient init() throws Exception {
		this.prepareCertificate();
		this.regist();
		return this.client;
	}
	/**
   * 准备证书验证
   *
   * @throws Exception
   */
	public abstract void prepareCertificate() throws Exception;
	/**
   * 注册协议和端口, 此方法也可以被子类重写
   */
	protected void regist() {
		// 设置协议http和https对应的处理socket链接工厂的对象
		Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
		        .register("http", PlainConnectionSocketFactory.INSTANCE)
		        .register("https", this.connectionSocketFactory)
		        .build();
		PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
		HttpClients.custom().setConnectionManager(connManager);
		// 创建自定义的httpclient对象
		this.client = HttpClients.custom().setConnectionManager(connManager).build();
		// CloseableHttpClient client = HttpClients.createDefault();
	}
}

工具类:

package com.darren.test.https.v45;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class HTTPSClientUtil {
	private static final String DEFAULT_CHARSET = "UTF-8";
	public static String doPost(HttpClient httpClient, String url, Map<String, String> paramHeader,
	      Map<String, String> paramBody) throws Exception {
		return doPost(httpClient, url, paramHeader, paramBody, DEFAULT_CHARSET);
	}
	public static String doPost(HttpClient httpClient, String url, Map<String, String> paramHeader,
	      Map<String, String> paramBody, String charset) throws Exception {
		String result = null;
		HttpPost httpPost = new HttpPost(url);
		setHeader(httpPost, paramHeader);
		setBody(httpPost, paramBody, charset);
		HttpResponse response = httpClient.execute(httpPost);
		if (response != null) {
			HttpEntity resEntity = response.getEntity();
			if (resEntity != null) {
				result = EntityUtils.toString(resEntity, charset);
			}
		}
		return result;
	}
	public static String doGet(HttpClient httpClient, String url, Map<String, String> paramHeader,
	      Map<String, String> paramBody) throws Exception {
		return doGet(httpClient, url, paramHeader, paramBody, DEFAULT_CHARSET);
	}
	public static String doGet(HttpClient httpClient, String url, Map<String, String> paramHeader,
	      Map<String, String> paramBody, String charset) throws Exception {
		String result = null;
		HttpGet httpGet = new HttpGet(url);
		setHeader(httpGet, paramHeader);
		HttpResponse response = httpClient.execute(httpGet);
		if (response != null) {
			HttpEntity resEntity = response.getEntity();
			if (resEntity != null) {
				result = EntityUtils.toString(resEntity, charset);
			}
		}
		return result;
	}
	private static void setHeader(HttpRequestBase request, Map<String, String> paramHeader) {
		// 设置Header
		if (paramHeader != null) {
			Set<String> keySet = paramHeader.keySet();
			for (String key : keySet) {
				request.addHeader(key, paramHeader.get(key));
			}
		}
	}
	private static void setBody(HttpPost httpPost, Map<String, String> paramBody, String charset) throws Exception {
		// 设置参数
		if (paramBody != null) {
			List<NameValuePair> list = new ArrayList<NameValuePair>();
			Set<String> keySet = paramBody.keySet();
			for (String key : keySet) {
				list.add(new BasicNameValuePair(key, paramBody.get(key)));
			}
			if (list.size() > 0) {
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);
				httpPost.setEntity(entity);
			}
		}
	}
}

测试类:

package com.darren.test.https.v45;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.client.HttpClient;
public class HTTPSClientTest {
	public static void main(String[] args) throws Exception {
		HttpClient httpClient = null;
		//httpClient = new HTTPSTrustClient().init();
		httpClient = new HTTPSCertifiedClient().init();
		String url = "https://1.2.6.2:8011/xxx/api/getToken";
		//String url = "https://1.2.6.2:8011/xxx/api/getHealth";
		Map<String, String> paramHeader = new HashMap<>();
		paramHeader.put("Accept", "application/xml");
		Map<String, String> paramBody = new HashMap<>();
		paramBody.put("client_id", "ankur.tandon.ap@xxx.com");
		paramBody.put("client_secret", "P@ssword_1");
		String result = HTTPSClientUtil.doPost(httpClient, url, paramHeader, paramBody);
		//String result = HTTPSClientUtil.doGet(httpsClient, url, null, null);
		System.out.println(result);
	}
}

结果:

<?xml version="1.0" encoding="utf-8"?> 

<token>RxitF9//7NxwXJS2cjIjYhLtvzUNvMZxxEQtGN0u07sC9ysJeIbPqte3hCjULSkoXPEUYGUVeyI9jv7/WikLrzxYKc3OSpaTSM0kCbCKphu0TB2Cn/nfzv9fMLueOWFBdyz+N0sEiI9K+0Gp7920DFEncn17wUJVmC0u2jwvM5FAjQKmilwodXZ6a0Dq+D7dQDJwVcwxBvJ2ilhyIb3pr805Vppmi9atXrVAKO0ODa006wEJFOfcgyG5p70wpJ5rrBL85vfy9WCvkd1R7j6NVjhXgH2gNimHkjEJorMjdXW2gKiUsiWsELi/XPswao7/CTWNwTnctGK8PX2ZUB0ZfA==</token> 

二、HttpURLConnection

@Controller
public class RestfulAction {
	@Autowired
	  private UserService userService;
	// 修改
	@RequestMapping(value = "put/{param}", method = RequestMethod.PUT)
	  public @ResponseBody String put(@PathVariable String param) {
		return "put:" + param;
	}
	// 新增
	@RequestMapping(value = "post/{param}", method = RequestMethod.POST)
	  public @ResponseBody String post(@PathVariable String param,String id,String name) {
		System.out.println("id:"+id);
		System.out.println("name:"+name);
		return "post:" + param;
	}
	// 删除
	@RequestMapping(value = "delete/{param}", method = RequestMethod.DELETE)
	  public @ResponseBody String delete(@PathVariable String param) {
		return "delete:" + param;
	}
	// 查找
	@RequestMapping(value = "get/{param}", method = RequestMethod.GET)
	  public @ResponseBody String get(@PathVariable String param) {
		return "get:" + param;
	}
	// HttpURLConnection 方式调用Restful接口
	// 调用接口
	@RequestMapping(value = "dealCon/{param}")
	  public @ResponseBody String dealCon(@PathVariable String param) {
		try {
			String url = "http://localhost:8080/tao-manager-web/";
			url+=(param+"/xxx");
			URL restServiceURL = new URL(url);
			HttpURLConnection httpConnection = (HttpURLConnection) restServiceURL
			          .openConnection();
			//param 输入小写,转换成 GET POST DELETE PUT
			httpConnection.setRequestMethod(param.toUpperCase());
			//      httpConnection.setRequestProperty("Accept", "application/json");
			if("post".equals(param)){
				//打开输出开关
				httpConnection.setDoOutput(true);
				//        httpConnection.setDoInput(true);
				//传递参数
				String input = "&id="+ URLEncoder.encode("abc", "UTF-8");
				input+="&name="+ URLEncoder.encode("啊啊啊", "UTF-8");
				OutputStream outputStream = httpConnection.getOutputStream();
				outputStream.write(input.getBytes());
				outputStream.flush();
			}
			if (httpConnection.getResponseCode() != 200) {
				throw new RuntimeException(
				            "HTTP GET Request Failed with Error code : "
				                + httpConnection.getResponseCode());
			}
			BufferedReader responseBuffer = new BufferedReader(
			          new InputStreamReader((httpConnection.getInputStream())));
			String output;
			System.out.println("Output from Server: \n");
			while ((output = responseBuffer.readLine()) != null) {
				System.out.println(output);
			}
			httpConnection.disconnect();
		}
		catch (MalformedURLException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
		return "success";
	}
}

三、Spring的RestTemplate

springmvc.xml增加

<!-- 配置RestTemplate -->
  <!--Http client Factory -->
  <bean id="httpClientFactory"
    class="org.springframework.http.client.SimpleClientHttpRequestFactory">
    <property name="connectTimeout" value="10000" />
    <property name="readTimeout" value="10000" />
  </bean>

  <!--RestTemplate -->
  <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <constructor-arg ref="httpClientFactory" />
  </bean>

controller

@Controller
public class RestTemplateAction {
	@Autowired
	  private RestTemplate template;
	@RequestMapping("RestTem")
	  public @ResponseBody User RestTem(String method) {
		User user = null;
		//查找
		if ("get".equals(method)) {
			user = template.getForObject(
			          "http://localhost:8080/tao-manager-web/get/{id}",
			          User.class, "呜呜呜呜");
			//getForEntity与getForObject的区别是可以获取返回值和状态、头等信息
			ResponseEntity<User> re = template.
			          getForEntity("http://localhost:8080/tao-manager-web/get/{id}",
			          User.class, "呜呜呜呜");
			System.out.println(re.getStatusCode());
			System.out.println(re.getBody().getUsername());
			//新增
		} else if ("post".equals(method)) {
			HttpHeaders headers = new HttpHeaders();
			headers.add("X-Auth-Token", UUID.randomUUID().toString());
			MultiValueMap<String, String> postParameters = new LinkedMultiValueMap<String, String>();
			postParameters.add("id", "啊啊啊");
			postParameters.add("name", "部版本");
			HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(
			          postParameters, headers);
			user = template.postForObject(
			          "http://localhost:8080/tao-manager-web/post/aaa", requestEntity,
			          User.class);
			//删除
		} else if ("delete".equals(method)) {
			template.delete("http://localhost:8080/tao-manager-web/delete/{id}","aaa");
			//修改
		} else if ("put".equals(method)) {
			template.put("http://localhost:8080/tao-manager-web/put/{id}",null,"bbb");
		}
		return user;
	}
}

以上就是本文关于浅谈java调用Restful API接口的方式的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他Java相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

您可能感兴趣的文章:

  • 详解Java8 新特性之日期API
  • hbase访问方式之java api
  • 5个Java API使用技巧
  • 浅谈JavaAPI 中 <E> 与 <T> 的含义
  • 详解Spring Boot 中使用 Java API 调用 lucene
  • JavaAPI的使用方法详解
  • ZooKeeper Java API编程实例分析
(0)

相关推荐

  • hbase访问方式之java api

    Hbase的访问方式 1.Native Java API:最常规和高效的访问方式: 2.HBase Shell:HBase的命令行工具,最简单的接口,适合HBase管理使用: 3.Thrift Gateway:利用Thrift序列化技术,支持C++,PHP,Python等多种语言,适合其他异构系统在线访问HBase表数据: 4.REST Gateway:支持REST 风格的Http API访问HBase, 解除了语言限制: 5.MapReduce:直接使用MapReduce作业处理Hbase数据

  • 浅谈JavaAPI 中 <E> 与 <T> 的含义

    今天看集合的代码,发现在泛型的使用时的区别,Collection<E>.List<E>,而Iterator<T>,那么<E>和<T>含义有什么不一样呢? <E>为Element的首字母,一般表示集合中的元素.    <T>为Type的首字母,表示传输参数的类型. 以上这篇浅谈JavaAPI 中 与 的含义就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 5个Java API使用技巧

    本文介绍了一些关于Java API安全和性能方面的简单易用的技巧,其中包括保证API Key安全和开发Web Service方面中在框架方面选择的一些建议. 程序员都喜欢使用API!例如为app应用构建API或作为微服务架构体系的一部分.当然,使用API的前提是能让你的工作变得更轻松.为了简化开发和提高工作效率所作出的努力,有时也意味着需要寻找新的类库或者过程(或者减少过程).对于很多开发团队来说,对于其APP和API进行管理认证和访问控制要耗费很多的时间,因此我们需想分享一些技巧,它们能节约你

  • JavaAPI的使用方法详解

    什么是Java类库 在编写程序的时候,通常有很多功能是通用的,或者是很基础的,可以用这些功能来组成更发杂的功能代码.比如文件操作,不同程序对文件的操作基本都是一样的,打开文件,关闭文件,读取文件里面的数据,往文件中写数据等等.所不同的仅仅是文件路径不相同,文件内容不同.如果把文件相关的操作编写成一个通用的类,不管哪个程序员都可以直接使用,而不必自己重新编写一遍操作文件的所有代码,那么程序员的工作效率就会大大提高.像这样把一些具有通用的功能编写成相应的类代码,就形成了类库. Java 的类库是 J

  • 详解Java8 新特性之日期API

    Java 8 在包java.time下包含了一组全新的时间日期API.下面的例子展示了这组新API里最重要的一些部分: 1.Clock 时钟 Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取当前的微秒数.某一个特定的时间点也可以使用Instant类来表示,Instant类也可以用来创建老的java.util.Date对象. Clock clock = Clock.systemDefaultZone();

  • 详解Spring Boot 中使用 Java API 调用 lucene

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言).Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎 全文检索概述 比如,我们一个文件夹中,或者一个磁盘中有很多的文件,记事本.world.Excel.pdf,我们

  • ZooKeeper Java API编程实例分析

    本实例我们用的是java3.4.6版本,实例方便大家学习完后有不明白的可以在留言区讨论. 开发应用程序的ZooKeeper Java绑定主要由两个Java包组成: org.apache.zookeeper org.apache.zookeeper.data org.apache.zookeeper包由ZooKeeper监视的接口定义和ZooKeeper的各种回调处理程序组成. 它定义了ZooKeeper客户端类库的主要类以及许多ZooKeeper事件类型和状态的静态定义. org.apache.

  • 浅谈java调用Restful API接口的方式

    摘要:最近有一个需求,为客户提供一些RestfulAPI接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试RestfulAPI接口,由于使用的是HTTPS,所以还要考虑到对于HTTPS的处理.由于我也是首次使用Java调用restful接口,所以还要研究一番,自然也是查阅了一些资料. 分析:这个问题与模块之间的调用不同,比如我有两个模块frontend和backend,frontend提供前台展示,backend提供数据支

  • Java 调用Restful API接口的几种方式(HTTPS)

    摘要:最近有一个需求,为客户提供一些Restful API 接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试Restful API接口,由于使用的是HTTPS,所以还要考虑到对于HTTPS的处理.由于我也是首次使用Java调用restful接口,所以还要研究一番,自然也是查阅了一些资料. 分析:这个问题与模块之间的调用不同,比如我有两个模块front end 和back end,front end提供前台展示,back

  • 浅谈Java获得多线程的返回结果方式(3种)

    一:Java创建线程方式 继承Thread类或者实现Runnable接口. 但是Runnable 的 run() 方法是不带返回值的,那如果我们需要一个耗时任务在执行完之后给予返回值,应该怎么做呢? 第一种方法:在 Runnable 的实现类中设置一个变量 V,在 run 方法中将其改变为我们期待的结果,然后通过一个 getV() 方法将这个变量返回. package com.test.thread; import java.util.*; import sun.swing.Accumulati

  • 浅谈Java的两种多线程实现方式

    本文介绍了浅谈Java的两种多线程实现方式,分享给大家.具有如下: 一.创建多线程的两种方式 Java中,有两种方式可以创建多线程: 1 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2 通过实现Runnable接口,实例化Thread类 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. 程序1

  • 浅谈java中HashMap键的比较方式

    先看一个例子 Integer integer=12344; Integer integer1=12344; 在Java中Integer 和Integer1是不相等的,但是如果再执行如下语句 map.put(integer, 1); map.put(integer1, 2); 会发现2会把1覆盖,问题来了,明明是两个不同的对象,为什么,2会把1覆盖呢? 我们看HashMap中添加键的源代码,如下 可以发现我们传进来的键交给了一个hash的成员方法区处理,这里我们看看hash方法的源码 哦,看到这里

  • 浅谈Java中的四种引用方式的区别

    强引用.软引用.弱引用.虚引用的概念 强引用(StrongReference) 强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用: Object object = new Object(); String str = "hello"; 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象. 比如下面这段代码: public class Main { publi

  • 浅谈java对象之间相互转化的多种方式

    第一种:使用org.apache.commons.beanutils.PropertyUtils.copyProperties()拷贝一个bean中的属性到另一个bean中,第一个参数是目标bean,第二个参数是源bean. 特点: 1.它的性能问题相当差 2.PropertyUtils有自动类型转换功能,而java.util.Date恰恰是其不支持的类型 3.PropertyUtils支持为null的场景: public static void copyProperties(Object de

  • 浅谈Java 8 新增函数式接口到底是什么

    从 Java 8 开始便出现了函数式接口(Functional Interface,以下简称FI) 定义为: 如果一个接口只有唯一的一个抽象接口,则称之为函数式接口.为了保证接口符合 FI ,通常会在接口类上添加 @FunctionalInterface 注解.理解了函数式接口可以为 Java 函数式编程打下基础,最终可通过运用函数式编程极大地提高编程效率. 函数式接口 (Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以对

  • SpringMVC Restful api接口实现的代码

    [前言] 面向资源的 Restful 风格的 api 接口本着简洁,资源,便于扩展,便于理解等等各项优势,在如今的系统服务中越来越受欢迎. .net平台有WebAPi项目是专门用来实现Restful api的,其良好的系统封装,简洁优雅的代码实现,深受.net平台开发人员所青睐,在后台服务api接口中,已经逐步取代了辉煌一时MVC Controller,更准确地说,合适的项目使用更加合适的工具,开发效率将会更加高效. python平台有tornado框架,也是原生支持了Restful api,在

  • Java调用第三方http接口的常用方式总结

    目录 1.概述 在Java项目中调用第三方接口的常用方式有 2.Java调用第三方http接口的方式 2.1 通过JDK网络类Java.net.HttpURLConnection 2.2 通过apache common封装好的HttpClient 2.3 通过Apache封装好的CloseableHttpClient 2.4 通过OkHttp 2.5 通过Spring的RestTemplate 2.6通过hutool的HttpUtil 3.总结 1.概述 在实际开发过程中,我们经常需要调用对方提

随机推荐