在代码中调用第三方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. 作业2:go实现一个压测工具,具备upload功能

    作业:go实现压测工具,具备upload功能. upload内容是.tar.gz,使用http协议上传. 要求:upload的文件名,http目的地址灵活可配. deadline:2019.4.30

  2. 作业1:使用go搭建一个web-server

    todo1:搭建web-server的原理 todo2:go实现web-server

  3. 【Angular】关于angular引用第三方组件库无法改变其组件样式 :host ::ng-deep

    [Angular]关于angular引用第三方组件库无法改变其组件样式 :host ::ng-deep css修改:无效 .ant-input-affix-wrapper .ant-input:not ...

  4. toString()和toLocaleString()方法有什么区别和联系

    toString()和toLocaleString()有什么区别 偶然之间用到这两个方法 然后在数字转换成字符串的时候,并没有感觉这两个方法有什么区别,如下: 1 2 3 4 5 6 7 8 var  ...

  5. 喵星之旅-狂奔的兔子-rabbitmq的java客户端使用入门

    一.简介 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件). 消息队列都涉及的生产者消费者模型,不做详解,本文只作为快速使用的参考文档. 消息队列主要有点 ...

  6. Markdown Learning Notes

    Markdown 教程 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档. Markdown 语言在 2004 由约翰·格鲁伯(英语:John Gruber)创建. ...

  7. Git创建合并和删除分支

    创建并切换分支 git checkout命令加上-b参数表示创建并切换分支,以下为创建并切换到dev分支: 相当于先通过 $ git branch dev 命令创建dev分支,然后 $ git che ...

  8. Android学习04

    Toast Toast是Android系统提供的一种非常好的提示方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何的屏幕空间. 1.默认Toast 在 ...

  9. 本地缓存Caffeine

    Caffeine 说起Guava Cache,很多人都不会陌生,它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略.由于Guava的大量使 ...

  10. C语言:将ss所指字符串中所有下标为奇数位置的字母转换为大写-将该字符串中的所有字符按ASCII码值升序排序后输出。-将a所指的4*3矩阵第k行的元素与第0行元素交换。

    //函数fun:将ss所指字符串中所有下标为奇数位置的字母转换为大写,若不是字母,则不转换. #include<conio.h> #include<stdio.h> #incl ...