在代码中调用第三方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. LaTeX学习资源

    LaTeX入门 Beamer教程文档 数学公式大全

  2. Speech Bandwidth Extension With WaveNet

    利用WAVENET扩展语音带宽 作者:Archit Gupta, Brendan Shillingford, Yannis Assael, Thomas C. Walters 博客地址:https:/ ...

  3. springboot笔记-1.自动化配置的关键

    最近发现看过的东西容易忘,但是写一遍之后印象倒是会深刻的多. 总所周知springboot极大的简化了java开发繁琐性,而其最大的优势应该就是自动化配置了.比如要使用redis,我们直接引入相关的包 ...

  4. rsyslog日志服务部署

    rsyslog简介 rsyslog是CentOS6和CentOS7默认的记录日志的服务 支持特性: UDP, TCP, SSL, TLS, RELP MySQL, PGSQL, Oracle实现日志存 ...

  5. 关注Ionic底部导航按钮tabs在android情况下浮在上面的处理

    Ionic是一款流行的移动端开发框架,但是刚入门的同学会发现,Ionic在IOS和android的底部tabs显示不一样.在安卓情况下底部tabs会浮上去. 如下图展示:  网上也有很多此类的解决方案 ...

  6. 反编译 java

    1.winrar https://www.rarlab.com/ 2.github  jd-gui http://java-decompiler.github.io/ SignNatureTest.j ...

  7. 记C++中发现的隐式转换问题

    #include <iostream> #include <string> using std::cin; using std::cout; using std::endl; ...

  8. buuctf——facebook1

    分为注册和登陆两个页面 据大佬wp登陆页面又盲注,但我没测试 直接注册后登陆 注册后发现,会显示输入的url 根据目录扫描,发现robots.txt和flag.php robots.txt有源码备份 ...

  9. 使用阿里的EasyExcel遇到的一些坑(NoSuchMethodError异常)

    引入eayexcel依赖的时候已经包含了poi依赖

  10. java 事务解释。

    面试的时候,面试人员总喜欢问在spring中, 1. 如果一个主线程上有一个事务,在事务中开启了一个线程.子线程跑出异常,对主线程有没有影响,或者主线程产生异常对子线程有没有影响. 这个时候,你只要记 ...