Java调用第三方http接口的方式
1. 概述
在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。
在Java项目中调用第三方接口的方式有:
①通过JDK网络类Java.net.HttpURLConnection;
②通过common封装好的HttpClient;
③通过Apache封装好的CloseableHttpClient;
④通过SpringBoot-RestTemplate;
2. Java调用第三方http接口的方式
2.1 通过JDK网络类Java.net.HttpURLConnection
比较原始的一种调用做法,这里把get请求和post请求都统一放在一个方法里面,直接上代码:
- import java.io.*;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- /**
- * @Author: Yang JianQiu
- * @Date: 2019/4/26 11:34
- * jdk类HttpURLConnection调用第三方http接口
- *
- * 通常分get和post两种方式
- *
- * 参考资料:
- * http://www.cnblogs.com/angusbao/p/7727649.html
- */
- public class HttpUrlConnectionToInterface {
- /**
- * 以post或get方式调用对方接口方法,
- * @param pathUrl
- */
- public static void doPostOrGet(String pathUrl, String data){
- OutputStreamWriter out = null;
- BufferedReader br = null;
- String result = "";
- try {
- URL url = new URL(pathUrl);
- //打开和url之间的连接
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- //请求方式
- conn.setRequestMethod("POST");
- //conn.setRequestMethod("GET");
- //设置通用的请求属性
- 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");
- //DoOutput设置是否向httpUrlConnection输出,DoInput设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
- conn.setDoOutput(true);
- conn.setDoInput(true);
- /**
- * 下面的三句代码,就是调用第三方http接口
- */
- //获取URLConnection对象对应的输出流
- out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
- //发送请求参数即数据
- out.write(data);
- //flush输出流的缓冲
- out.flush();
- /**
- * 下面的代码相当于,获取调用第三方http接口后返回的结果
- */
- //获取URLConnection对象对应的输入流
- InputStream is = conn.getInputStream();
- //构造一个字符流缓存
- br = new BufferedReader(new InputStreamReader(is));
- String str = "";
- while ((str = br.readLine()) != null){
- result += str;
- }
- System.out.println(result);
- //关闭流
- is.close();
- //断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。
- conn.disconnect();
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- try {
- if (out != null){
- out.close();
- }
- if (br != null){
- br.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- public static void main(String[] args) {
- /**
- *手机信息查询接口:http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=手机号
- * http://api.showji.com/Locating/www.showji.com.aspx?m=手机号&output=json&callback=querycallback
- */
- doPostOrGet("https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", "");
- }
- }
2.2 通过apache common封装好的HttpClient
httpClient的get或post请求方式步骤:
- 生成一个HttpClient对象并设置相应的参数;
- 生成一个GetMethod对象或PostMethod并设置响应的参数;
- 用HttpClient生成的对象来执行GetMethod生成的Get方法;
- 处理响应状态码;
- 若响应正常,处理HTTP响应内容;
- 释放连接。
导入如下jar包:
- <!--HttpClient-->
- <dependency>
- <groupId>commons-httpclient</groupId>
- <artifactId>commons-httpclient</artifactId>
- <version>3.1</version>
- </dependency>
代码如下:
- import com.alibaba.fastjson.JSONObject;
- import org.apache.commons.httpclient.*;
- import org.apache.commons.httpclient.methods.GetMethod;
- import org.apache.commons.httpclient.methods.PostMethod;
- import org.apache.commons.httpclient.params.HttpMethodParams;
- import java.io.IOException;
- import java.io.InputStream;
- /**
- * @Author: Yang JianQiu
- * @Date: 2019/4/28 11:07
- *
- * HttpClient模拟get、post请求并发送请求参数(json等)
- * 【参考资料】
- * https://javasam.iteye.com/blog/2117845
- * https://blog.csdn.net/qq_28379809/article/details/82898792
- */
- public class HttpClientToInterface {
- /**
- * httpClient的get请求方式
- * 使用GetMethod来访问一个URL对应的网页实现步骤:
- * 1.生成一个HttpClient对象并设置相应的参数;
- * 2.生成一个GetMethod对象并设置响应的参数;
- * 3.用HttpClient生成的对象来执行GetMethod生成的Get方法;
- * 4.处理响应状态码;
- * 5.若响应正常,处理HTTP响应内容;
- * 6.释放连接。
- * @param url
- * @param charset
- * @return
- */
- public static String doGet(String url, String charset){
- /**
- * 1.生成HttpClient对象并设置参数
- */
- HttpClient httpClient = new HttpClient();
- //设置Http连接超时为5秒
- httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
- /**
- * 2.生成GetMethod对象并设置参数
- */
- GetMethod getMethod = new GetMethod(url);
- //设置get请求超时为5秒
- getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);
- //设置请求重试处理,用的是默认的重试处理:请求三次
- getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
- String response = "";
- /**
- * 3.执行HTTP GET 请求
- */
- try {
- int statusCode = httpClient.executeMethod(getMethod);
- /**
- * 4.判断访问的状态码
- */
- if (statusCode != HttpStatus.SC_OK){
- System.err.println("请求出错:" + getMethod.getStatusLine());
- }
- /**
- * 5.处理HTTP响应内容
- */
- //HTTP响应头部信息,这里简单打印
- Header[] headers = getMethod.getResponseHeaders();
- for (Header h: headers){
- System.out.println(h.getName() + "---------------" + h.getValue());
- }
- //读取HTTP响应内容,这里简单打印网页内容
- //读取为字节数组
- byte[] responseBody = getMethod.getResponseBody();
- response = new String(responseBody, charset);
- System.out.println("-----------response:" + response);
- //读取为InputStream,在网页内容数据量大时候推荐使用
- //InputStream response = getMethod.getResponseBodyAsStream();
- } catch (HttpException e) {
- //发生致命的异常,可能是协议不对或者返回的内容有问题
- System.out.println("请检查输入的URL!");
- e.printStackTrace();
- } catch (IOException e){
- //发生网络异常
- System.out.println("发生网络异常!");
- }finally {
- /**
- * 6.释放连接
- */
- getMethod.releaseConnection();
- }
- return response;
- }
- /**
- * post请求
- * @param url
- * @param json
- * @return
- */
- public static String doPost(String url, JSONObject json){
- HttpClient httpClient = new HttpClient();
- PostMethod postMethod = new PostMethod(url);
- postMethod.addRequestHeader("accept", "*/*");
- postMethod.addRequestHeader("connection", "Keep-Alive");
- //设置json格式传送
- postMethod.addRequestHeader("Content-Type", "application/json;charset=utf-8");
- //必须设置下面这个Header
- postMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
- //添加请求参数
- postMethod.addParameter("commentId", json.getString("commentId"));
- String res = "";
- try {
- int code = httpClient.executeMethod(postMethod);
- if (code == 200){
- res = postMethod.getResponseBodyAsString();
- System.out.println(res);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return res;
- }
- public static void main(String[] args) {
- doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", "UTF-8");
- System.out.println("-----------分割线------------");
- System.out.println("-----------分割线------------");
- System.out.println("-----------分割线------------");
- JSONObject jsonObject = new JSONObject();
- jsonObject.put("commentId", "13026194071");
- doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", jsonObject);
- }
- }
2.3 通过Apache封装好的CloseableHttpClient
CloseableHttpClient是在HttpClient的基础上修改更新而来的,这里还涉及到请求头token的设置(请求验证),利用fastjson转换请求或返回结果字符串为json格式,当然上面两种方式也是可以设置请求头token、json的,这里只在下面说明。
导入如下jar包:
- <!--CloseableHttpClient-->
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.5.2</version>
- </dependency>
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.2.28</version>
- </dependency>
代码如下:
- import com.alibaba.fastjson.JSONObject;
- import org.apache.http.HttpResponse;
- import org.apache.http.HttpStatus;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.entity.StringEntity;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.HttpClientBuilder;
- import org.apache.http.util.EntityUtils;
- import java.io.IOException;
- /**
- * @Author: Yang JianQiu
- * @Date: 2019/4/26 11:41
- * Apache封装好的CloseableHttpClient
- * 【参考资料】
- * https://www.cnblogs.com/siv8/p/6222709.html
- * https://blog.csdn.net/qq_35860138/article/details/82967727
- */
- public class CloseableHttpClientToInterface {
- private static String tokenString = "";
- private static String AUTH_TOKEN_EXPIRED = "AUTH_TOKEN_EXPIRED";
- private static CloseableHttpClient httpClient = null;
- /**
- * 以get方式调用第三方接口
- * @param url
- * @return
- */
- public static String doGet(String url, String token){
- //创建HttpClient对象
- CloseableHttpClient httpClient = HttpClientBuilder.create().build();
- HttpGet get = new HttpGet(url);
- try {
- if (tokenString != null && !tokenString.equals("")){
- tokenString = getToken();
- }
- //api_gateway_auth_token自定义header头,用于token验证使用
- get.addHeader("api_gateway_auth_token", tokenString);
- get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
- HttpResponse response = httpClient.execute(get);
- if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
- //返回json格式
- String res = EntityUtils.toString(response.getEntity());
- return res;
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 以post方式调用第三方接口
- * @param url
- * @param json
- * @return
- */
- public static String doPost(String url, JSONObject json){
- try {
- if (httpClient == null){
- httpClient = HttpClientBuilder.create().build();
- }
- HttpPost post = new HttpPost(url);
- if (tokenString != null && !tokenString.equals("")){
- tokenString = getToken();
- }
- //api_gateway_auth_token自定义header头,用于token验证使用
- post.addHeader("api_gateway_auth_token", tokenString);
- post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
- StringEntity s = new StringEntity(json.toString());
- s.setContentEncoding("UTF-8");
- //发送json数据需要设置contentType
- s.setContentType("application/x-www-form-urlencoded");
- //设置请求参数
- post.setEntity(s);
- HttpResponse response = httpClient.execute(post);
- if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
- //返回json格式
- String res = EntityUtils.toString(response.getEntity());
- return res;
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- if (httpClient != null){
- try {
- httpClient.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return null;
- }
- /**
- * 获取第三方接口的token
- */
- public static String getToken(){
- String token = "";
- JSONObject object = new JSONObject();
- object.put("appid", "appid");
- object.put("secretkey", "secretkey");
- try {
- if (httpClient == null){
- httpClient = HttpClientBuilder.create().build();
- }
- HttpPost post = new HttpPost("http://localhost/login");
- post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
- StringEntity s = new StringEntity(object.toString());
- s.setContentEncoding("UTF-8");
- //发送json数据需要设置contentType
- s.setContentType("application/x-www-form-urlencoded");
- //设置请求参数
- post.setEntity(s);
- HttpResponse response = httpClient.execute(post);
- //这里可以把返回的结果按照自定义的返回数据结果,把string转换成自定义类
- //ResultTokenBO result = JSONObject.parseObject(response, ResultTokenBO.class);
- //把response转为jsonObject
- JSONObject result = JSONObject.parseObject(response);
- if (result.containsKey("token")){
- token = result.getString("token");
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return token;
- }
- /**
- * 测试
- */
- public static void test(String telephone){
- JSONObject object = new JSONObject();
- object.put("telephone", telephone);
- try {
- //首先获取token
- tokenString = getToken();
- String response = doPost("http://localhost/searchUrl", object);
- //如果返回的结果是list形式的,需要使用JSONObject.parseArray转换
- //List<Result> list = JSONObject.parseArray(response, Result.class);
- System.out.println(response);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- test("12345678910");
- }
- }
2.4 通过SpringBoot-RestTemplate
springBoot-RestTemple是上面三种方式的集大成者,代码编写更加简单,目前可以采用的调用第三方接口有:
- delete() 在特定的URL上对资源执行HTTP DELETE操作
- exchange() 在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的
- execute() 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象
- getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象
- getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象
- postForEntity() POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的
- postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象
- headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头
- optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息
- postForLocation() POST 数据到一个URL,返回新创建资源的URL
- put() PUT 资源到特定的URL
注意:目前标红的为常用的
首先导入springboot的web包
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.4.RELEASE</version>
- </parent>
- <dependencies>
- <!--CloseableHttpClient-->
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.5.2</version>
- </dependency>
- <!--spring restTemplate-->
- <!-- @ConfigurationProperties annotation processing (metadata for IDEs)
- 生成spring-configuration-metadata.json类,需要引入此类-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-configuration-processor</artifactId>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-aop</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-tomcat</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jetty</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
在启动类同包下创建RestTemplateConfig.java类
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.http.client.ClientHttpRequestFactory;
- import org.springframework.http.client.SimpleClientHttpRequestFactory;
- import org.springframework.web.client.RestTemplate;
- /**
- * @Author: Yang JianQiu
- * @Date: 2019/4/28 14:01
- */
- @Configuration
- public class RestTemplateConfig {
- @Bean
- public RestTemplate restTemplate(ClientHttpRequestFactory factory){
- return new RestTemplate(factory);
- }
- @Bean
- public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
- SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
- factory.setConnectTimeout(15000);
- factory.setReadTimeout(5000);
- return factory;
- }
- }
然后在Service类(RestTemplateToInterface )中注入使用
具体代码如下:
- import com.alibaba.fastjson.JSONObject;
- import com.swordfall.model.User;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.http.*;
- import org.springframework.stereotype.Service;
- import org.springframework.web.client.RestTemplate;
- /**
- * @Author: Yang JianQiu
- * @Date: 2019/4/28 14:13
- *
- * 【参考资料】
- * https://blog.csdn.net/qq_15452971/article/details/79416469
- * https://blog.csdn.net/weixin_40461281/article/details/83540604
- */
- @Service
- public class RestTemplateToInterface {
- @Autowired
- private RestTemplate restTemplate;
- /**
- * 以get方式请求第三方http接口 getForEntity
- * @param url
- * @return
- */
- public User doGetWith1(String url){
- ResponseEntity<User> responseEntity = restTemplate.getForEntity(url, User.class);
- User user = responseEntity.getBody();
- return user;
- }
- /**
- * 以get方式请求第三方http接口 getForObject
- * 返回值返回的是响应体,省去了我们再去getBody()
- * @param url
- * @return
- */
- public User doGetWith2(String url){
- User user = restTemplate.getForObject(url, User.class);
- return user;
- }
- /**
- * 以post方式请求第三方http接口 postForEntity
- * @param url
- * @return
- */
- public String doPostWith1(String url){
- User user = new User("小白", 20);
- ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, user, String.class);
- String body = responseEntity.getBody();
- return body;
- }
- /**
- * 以post方式请求第三方http接口 postForEntity
- * @param url
- * @return
- */
- public String doPostWith2(String url){
- User user = new User("小白", 20);
- String body = restTemplate.postForObject(url, user, String.class);
- return body;
- }
- /**
- * exchange
- * @return
- */
- public String doExchange(String url, Integer age, String name){
- //header参数
- HttpHeaders headers = new HttpHeaders();
- String token = "asdfaf2322";
- headers.add("authorization", token);
- headers.setContentType(MediaType.APPLICATION_JSON);
- //放入body中的json参数
- JSONObject obj = new JSONObject();
- obj.put("age", age);
- obj.put("name", name);
- //组装
- HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers);
- ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
- String body = responseEntity.getBody();
- return body;
- }
- }
总结
【github地址】
https://github.com/SwordfallYeung/JavaInvokingHttpInterface.git
【参考资料】
http://www.cnblogs.com/angusbao/p/7727649.html 纯Java api HttpURLConnection
https://blog.csdn.net/chijiandi/article/details/81388240 纯Java api HttpURLConnection
https://www.cnblogs.com/xuegu/p/8490815.html 封装api HttpClient
https://www.cnblogs.com/unknows/p/8534713.html
https://blog.csdn.net/qq_35860138/article/details/82967727 封装api HttpClient
https://blog.csdn.net/a1032818891/article/details/81172478 SpringBoot-RestTemplate
Java调用第三方http接口的方式的更多相关文章
- Java调用Http/Https接口(6)--RestTemplate调用Http/Https接口
RestTemplate是Spring提供的用于访问Http接口的客户端,提供同步的API:在将来的Spring版本中可能会过时,将逐渐被WebClient替代.文中所使用到的软件版本:Java 1. ...
- Java调用Http/Https接口(5)--HttpAsyncClient调用Http/Https接口
HttpAsyncClient是HttpClient的异步版本,提供异步调用的api.文中所使用到的软件版本:Java 1.8.0_191.HttpClient 4.1.4. 1.服务端 参见Java ...
- Java调用Http/Https接口(4)--HttpClient调用Http/Https接口
HttpClient是Apache HttpComponents项目下的一个组件,是Commons-HttpClient的升级版,两者api调用写法也很类似.文中所使用到的软件版本:Java 1.8. ...
- Java调用Http/Https接口(3)--Commons-HttpClient调用Http/Https接口
Commons-HttpClient原来是Apache Commons项目下的一个组件,现已被HttpComponents项目下的HttpClient组件所取代:作为调用Http接口的一种选择,本文介 ...
- Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()
Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...
- Java调用Http/Https接口(1)--编写服务端
Http接口输入的数据一般是键值对或json数据,返回的一般是json数据.本系列文章主要介绍Java调用Http接口的各种方法,本文主要介绍服务端的编写,方便后续文章里的客户端的调用.文中所使用到的 ...
- Java调用第三方接口示范
在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 使用流程[1]准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的res ...
- Java 调用Restful API接口的几种方式--HTTPS
摘要:最近有一个需求,为客户提供一些Restful API 接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试Restful ...
- java调用CXF WebService接口的两种方式
通过http://localhost:7002/card/services/HelloWorld?wsdl访问到xml如下,说明接口写对了. 2.静态调用 // 创建WebService客户端代理工厂 ...
随机推荐
- 海思uboot启动流程详细分析(一)
第一阶段 start.S 首先我们可以在u-boot.lds中看到ENTRY(_start),即指定了入口_start,_start也就是整个start.S的最开始: 1. reset 在arch\a ...
- Step by Step Recipe for Securing Kafka with Kerberos
Short Description: Step by Step Recipe for Securing Kafka with Kerberos. Article I found it is a lit ...
- P1177 【模板】快速排序 题解
本质为sort,这里我们用优先队列(堆)解决. 什么是堆? 堆 堆是一个完全二叉树,而且是每层都有规律的二叉树 规律大概是: 小根堆:最上层数的大小最小,往下每层结点都比父亲结点大,比两个儿子结点小 ...
- windows环境中JDK环境变量配置
一.环境准备 Windows10 jdk-9.0.1 二.下载并安装JDK 到Java的官网下载JDK安装包,地址:http://www.oracle.com/technetwork/java/jav ...
- Ubuntu16 搭建Git 服务器
刚入职一个月左右,昨晚公司给培训了SVN和Git的使用.之前在研究生期间,和导师做项目就一直使用git做版本管理.想起研究生有一段时间,git总出错(秘钥都不好使了,只有某个机器生成的rsa key ...
- 网络流学习(转载自ssw 的博客)
众所周知,网络流是探究网络上运输的一种图论分支.但是大多数人在第一次接触这个题时都有些畏惧感(比如说我),大佬可以自信跳过.. 本文包括: 1.网络流的概念及基本性质 2.略谈 Edmonds-Kar ...
- cocos creator入门
前面的话 Cocos Creator 是一个完整的游戏开发解决方案,包括了 cocos2d-x 引擎的 JavaScript 实现,以及快速开发游戏所需要的各种图形界面工具.Cocos Creator ...
- codeforces581D
Three Logos CodeForces - 581D Three companies decided to order a billboard with pictures of their lo ...
- ajax基本原理与案例
一.什么是Ajax AJAX即“Asynchronous Javascript And XML”( 异步 JavaScript和XML),AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互 ...
- 单元测试之Fixture
声明: 作者:zhaojun 创建日期:2017-08-04 更新日期:2017-08-07 一.什么是Fixture,Fixture有什么作用,为什么需要使用Fixture # 下载 pip i ...