在代码中调用第三方API 获取数据

package com.example.demo.utils;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; /**
* 提供调用第三方API 的 get与 post 接口
* Created by baizhuang on 2019/9/12 11:37.
*/ @Slf4j
public class HttpClient {
/**
* 表单格式传输
*/
private static final String FORM_CONTEXT_TYPE ="application/x-www-form-urlencoded"; /**
* json 默认的编码类型
*/
private static final String JSON_CONTENT_TYPE = "application/json"; /**
* 默认的编码格式
*/
private static final String DEFAULT_CHARSET = "UTF-8"; /**
* 请求配置对象
*/
private static RequestConfig requestConfig; /**
* get 请求,将参数包含在 url 路径中
* url : 路径
* return: json 对象
*/
public static JSONObject doGet(String url){
JSONObject jsonObject = null;
try(CloseableHttpClient client = HttpClients.createDefault();){
HttpGet request = new HttpGet(url);
request.setConfig(requestConfig);
try(CloseableHttpResponse response = client.execute(request);){
int statusCode = response.getStatusLine().getStatusCode();
if(statusCode == HttpStatus.SC_OK){
HttpEntity entity = response.getEntity();
String responseContent = EntityUtils.toString(entity);
jsonObject = JSONObject.parseObject(responseContent);
}else{
log.info("Get请求失败:{},状态码:{}",url,statusCode);
}
}
}catch (IOException e){
log.info("Get 请求异常:{},状态码:{}",url,e.getMessage());
e.printStackTrace();
}
return jsonObject;
} /**
* get 请求,将参数以Map 的形式传入
* path : 包括 协议、主机、端口、资源路径
* param: 请求参数
*
* @param
*/
public static JSONObject doGet(String path,Map<String,String> params){
List<NameValuePair> queryParans = convertParamsMapToList(params);
URI uri = null;
try{
uri = new URIBuilder()
.setPath(path)
.setParameters(queryParans)
.build();
}catch (URISyntaxException e){
e.printStackTrace();
}
return doGet(uri.toString());
} /**
* 将Map<String,String> 类型的请求参数转换为 List<NameValuePair>
* @param
*
*/
private static List<NameValuePair> convertParamsMapToList(Map<String,String> params){
List<NameValuePair> queryParams = new ArrayList<>();
for(String s : params.keySet()){
queryParams.add(new BasicNameValuePair(s,params.get(s)));
}
return queryParams;
} /**
* 将请求拆分开传入
*
* scheme 请求协议
* host 主机地址
* port 端口
* path 路径
* params 请求参数
* @param
*/
public static JSONObject doGet(String scheme,String host,Integer port,String path,Map<String,String> params){
List<NameValuePair> queryParams = convertParamsMapToList(params);
URI uri = null;
try {
uri = new URIBuilder().setScheme(scheme)
.setHost(host)
.setPort(port)
.setPath(path)
.setParameters(queryParams)
.build();
}catch (URISyntaxException e){
e.printStackTrace();
}
return doGet(uri.toString());
} /**
* post 请求,请求参数被封装在 JSONObject
* url : 请求地址
* jsonParam :请求参数
*
*/
public static JSONObject doPost(String url,JSONObject jsonParam){
return doPost(url,jsonParam,null);
} /**
* doPost ,以表单提交
*/
public static JSONObject doPost(String url,String params){
return doPost(url,params,FORM_CONTEXT_TYPE,null);
} /**
* post 请求,请求参数被封装在 JSONObject 中,可以设置字符编码
* url: 请求地址
* jsonParam : 请求参数
* charset 字符编码方法
*/
public static JSONObject doPost(String url,JSONObject jsonParam,String charset){
return doPost(url,jsonParam.toJSONString(),JSON_CONTENT_TYPE,charset);
} public static JSONObject doPost(String url,JSONObject jsonParam,boolean isJsonParam,String charset){
return doPost(url,jsonParam.toJSONString(),JSON_CONTENT_TYPE,charset);
} /**
* post 请求,参数为字符串,可以为 JSON ,可以为普通格式,可以设置字符编码
* 如果为 json 格式, isJsonStringParam = true
* 如果是普通格式: name =Jack&age =10 ,则 isJsonStringParam = false
*
* url : 请求地址
* stringParam 请求参数字符串
* isJsonStringParam : 请求是否为 json 格式
* charset 字符编码格式
*/
public static JSONObject doPost(String url,String stringParam,boolean isJsonStringParam,String charset){
JSONObject jsonResult = null;
if(isJsonStringParam){
jsonResult = doPost(url,stringParam,JSON_CONTENT_TYPE,charset);
}else{
jsonResult = doPost(url,stringParam,FORM_CONTEXT_TYPE,charset);
}
return jsonResult;
} /**
* Post 请求
* url: 请求地址
* requestParam 请求参数,字符串格式
* contentType 内容编码格式
* charset 字符编码格式
*
*/
public static JSONObject doPost(String url,String requestParam,String contentType,String charset){
charset = charset==null?DEFAULT_CHARSET:charset;
JSONObject jsonResult = null;
try(CloseableHttpClient httpClient = HttpClients.createDefault();){
HttpPost httpPost = new HttpPost(url);
//构造实体请求
StringEntity requestEntity = new StringEntity(requestParam,charset);
requestEntity.setContentEncoding(charset);
requestEntity.setContentType(contentType);
httpPost.setEntity(requestEntity);
httpPost.setConfig(requestConfig);
try(CloseableHttpResponse response = httpClient.execute(httpPost);){
int statusCode = response.getStatusLine().getStatusCode();
if(statusCode == HttpStatus.SC_OK){
HttpEntity responseEntity = response.getEntity();
String responseContent = EntityUtils.toString(responseEntity,charset);
jsonResult = JSONObject.parseObject(responseContent);
}else{
log.error("post 请求失败:{},状态码:{}",url,statusCode);
}
}
}catch (IOException e){
e.printStackTrace();
}
return jsonResult;
} }

Java 代码中如何调用 第三方Api的更多相关文章

  1. 如何在java代码中调用一个web项目jsp或者servlet

    有时候需要调用一个web项目的jsp或者servlet,但是执行内部的代码,并不是打开jsp,例如需要在一段java代码中清除一个web项目中的缓存,那么可以把清除缓存的代码放在该web项目的一个se ...

  2. Unity在Android和iOS中如何调用Native API

    本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...

  3. MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...

  4. Android如何在java代码中设置margin

    习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:s ...

  5. Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)

    <bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil& ...

  6. 转--Android如何在java代码中设置margin

    ========  3 在Java代码里设置button的margin(外边距)? 1.获取按钮的LayoutParams LinearLayout.LayoutParams layoutParams ...

  7. 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果

            今天在公司项目中,发现一个计算运费的妙招.由于运费规则各种各样,因此写一个公式存到数据库.下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了. 一 ...

  8. java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法

    1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...

  9. vue 服务代理 调用第三方api

    项目中前期需要调用第三方API来获取汇率.因为直接调用会有跨域的问题,所以使用来服务代理. 在config配置代理可以这样写: 而调用接口就可以这样写: 坑:配置完成后一直报500,开始怀疑人生.最后 ...

随机推荐

  1. ARM架构安装Anaconda3出现错误:cannot execute binary file: Exec format error

    ARM架构安装Anaconda3出现错误:cannot execute binary file: Exec format error 原因是:安装包格式不对. 在Anaconda官网上只有x86(32 ...

  2. Requests库网络爬虫实战

    实例一:页面的爬取 >>> import requests>>> r= requests.get("https://item.jd.com/1000037 ...

  3. 01-书城http状态405-此url不支持http方法get

    错误: http状态405-此url不支持http方法get 原因:

  4. Bugku-CTF加密篇之这不是md5(666c61677b616537333538376261353662616566357d)

    这不是md5 666c61677b616537333538376261353662616566357d  

  5. Navicat连接两个不同机子上的mysql数据库,端口用换吗?--不用

    经过了上一篇的努力,成功的连上了远程的mysql数据库 dos 命令行下的成功连接 在用Navicat连接的时候要注意: 端口仍然是3306,而不用去更改,并不会和上面的本机的Mysql连接使用的端口 ...

  6. utf-8无bom格式编码

    BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在U ...

  7. jsp用equals判断两个字符串变量是否相等

    使用即可: s1.equals(s2) 如果使用场景: if(s1==s2){} 这样使用可能会出现判断无效的情况. 使用if(s1.equals(s2)){}就可以了.

  8. 4_1 古老的密码(UVa1339)<排序>

    古罗马帝国与各部门有一个强有力的政府系统,包括一个秘密服务部门.重要的文件以加密的形式发送防止窃听.在那个时代最流行的密码被称为替代密码和置换密码.例如,应用替代密码,改变所有字母“A”到“Y”字母表 ...

  9. Plastic Bottle Manufacturer - Different Cosmetic Plastic Bottle Materials, Different Characteristics

    Plastic bottles are usually made of PP, PE, K, AS, abs, acrylic, PET, and the like. Dust caps for th ...

  10. 【渗透测试】NSA Windows 0day漏洞+修复方案

    这个漏洞是前段时间爆出来的,几乎影响了全球70%的电脑,不少高校.政府和企业都还在用Windows服务器,这次时间的影响力堪称网络大地震. ------------------------------ ...