项目要实现这么一个功能,用户通过点击按钮,通过axios来访问python的API(算法,java不好做)得到一个结果存储到数据库并且返回到页面。

但是python不是在tomcat上面运行的,所以不在一个域内session不能共享,考虑到安全问题,决定从java当作客户端来调用python的API获取数据。

开始考虑用netty,但是感觉没必要,不如利用java的io和net来做,然后写了一个工具类,用于JAVA访问任意服务端的API。

代码如下,注释写好了,可以直接用。

package com.sdnuode.nuofe.util;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject; import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.*; public class RequestUtils { //GET请求时可以只传递一个API地址参数
public static ArrayList<HashMap> runRequest(String requestUrl){
return runRequest(requestUrl, "GET", new HashMap<>());
} //访问服务端API,三个参数,分别是API地址,请求方式,数据/参数
//Params请求传递Map,Data请求传递JSON字符串
public static ArrayList<HashMap> runRequest(String requestUrl, String method, Object info){
StringBuffer buffer = new StringBuffer();//用于存储返回数据
try {
URL url = new URL(requestUrl);//创建URL对象
//对请求方式为GET和空值进行处理
if (method == "GET"){
url = new URL(requestUrl+"?"+urlencode(info));//拼接URL
}
if (method != "GET" && method != "POST") {
return new ArrayList<HashMap>();//只处理GET和POST请求,其他请求不做处理
}
//配置连接属性
HttpURLConnection httpUrlConn = (HttpURLConnection)url.openConnection();//创建连接对象
httpUrlConn.setDoInput(true);// 从HttpUrlConntion读入,默认true
httpUrlConn.setDoOutput(true);// post求情向httpUrlConntion读出,默认flase
httpUrlConn.setUseCaches(false);// post请求不使用缓存
httpUrlConn.setRequestMethod(method);// 请求方式,默认GET
httpUrlConn.setRequestProperty("Connection", "Keep-Alive");//建议Http为长链接,提高响应速度
httpUrlConn.setRequestProperty("Charset", "UTF-8");//字符编码
httpUrlConn.setRequestProperty("Content-Type","application/json; charset=UTF-8");// 传输json格式
httpUrlConn.setRequestProperty("accept","application/json");// 接收类型json
//httpUrlConn.setRequestProperty("accept","*/*")//暴力方法设置接受所有类型,防止出现415
if(method == "POST") {
byte[] writebytes = "".getBytes();
if (info != null){
writebytes = info.toString().getBytes();//字符流转字节流
}
httpUrlConn.setRequestProperty("Content-Length", String.valueOf(writebytes.length));//设置文件长度
OutputStream outwritestream = httpUrlConn.getOutputStream();//创建输出流对象
outwritestream.write(info.toString().getBytes());//输出流的内容,可以传3个参数,默认从0到len
outwritestream.flush();//清空数据(读完未必写完,缓冲区有遗留的可能)
outwritestream.close();//关闭输出流
}
httpUrlConn.connect();//开始连接,配置信息必须在连接前设置完毕
int statusCode = httpUrlConn.getResponseCode();//获取状态码
if(statusCode == 200){
InputStream inputStream = httpUrlConn.getInputStream();//获取输入流
//字节流转字符流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);//读取字符流
String str = null;
//将读取到的字符流赋值给buffer,readLine为读取一行,当前行为null时,表示已经读完
while((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
//关闭bufferReader和输入流
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;//清空输入流
httpUrlConn.disconnect();//断开连接
}
} catch (Exception e) {
e.printStackTrace();
}
//将buffer转换成ArrayList格式
if(buffer.length() != 0){
JSONArray jsonArray = JSONArray.fromObject(buffer.toString());
ArrayList<HashMap> arrayList = JSONArrayObjectToArrayListHashMap(jsonArray);
return JSONArrayObjectToArrayListHashMap(jsonArray);
}else {
return new ArrayList<HashMap>();
}
} //GET请求URL处理
public static String urlencode(Object params){
if(params == null){
return "";
}
StringBuilder sb = new StringBuilder();
Map<String,Object> map = (Map)params;
for (Map.Entry i : map.entrySet()) {
try {sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
String str = sb.toString();
if(str.length() != 0){
str = str.substring(0,str.length()-1);
}
return str;
} //JSONArray<Object>转换ArrayList<HashMap>
public static ArrayList<HashMap> JSONArrayObjectToArrayListHashMap(JSONArray jsonArray){
ArrayList<HashMap> arrayList = new ArrayList();
for (int i = 0;i<jsonArray.size();i++){
JSONObject jsonObject = JSONObject.fromObject(jsonArray.get(i));
Iterator it = jsonObject.keys();
while (it.hasNext())
{
HashMap hashMap = new HashMap();
String key = String.valueOf(it.next());
String value = (String)jsonObject.get(key);
hashMap.put(key,value);
arrayList.add(hashMap);
}
}
return arrayList;
}
}

JAVA通过http访问其他服务端API的更多相关文章

  1. C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken

    系列目录     [已更新最新开发文章,点击查看详细] BIMFACE 平台为开发者提供了大量的服务器端 API 与 JavaScript API,用于二次开发 BIM 的相关应用. BIMFACE ...

  2. 安卓推送——个推服务端api使用误区

    首先你需要在个推开放着平台上注册你的应用,以及获得以下几个必要的值APPID |APPKEY | MASTERSECRET,本文假设你已经完成上述步骤以及完成客户端SDK的集成. 原理 个推服务端ap ...

  3. CAS 5.1.x 的搭建和使用(四)—— 配置使用HTTP协议访问的服务端

    CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端 CAS5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明 CAS5.1.x ...

  4. C#开发BIMFACE系列15 服务端API之获取模型的View token

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken>中详细介绍了应用程序访问API的令牌凭证.我 ...

  5. C#开发BIMFACE系列31 服务端API之模型对比2:获取模型对比状态

    系列目录     [已更新最新开发文章,点击查看详细] 在上一篇<C#开发BIMFACE系列30 服务端API之模型对比1:发起模型对比>中发起了2个模型对比,由于模型对比是在BIMFAC ...

  6. Java 实现Redis客户端,服务端

    Java 实现Redis客户端,服务端 1.Java实现Redis发布订阅 1.1实例 2.[Redis]Java实现redis消息订阅/发布(PubSub) 3.java实现 redis的发布订阅 ...

  7. C#开发BIMFACE系列46 服务端API之离线数据包下载及结构详解

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列45 服务端API之创建离线数据包>中通过调用接口成功的创建一个离线数 ...

  8. .Net分布式异常报警系统-客户端及服务端API

    客户端 客户端的作用就是捕获未处理异常, 发送异常到服务端. 关于捕获未处理异常的方法参考 http://www.cnblogs.com/youring2/archive/2012/04/25/246 ...

  9. Identity4实现服务端+api资源控制+客户端请求

    准备写一些关于Identity4相关的东西,最近也比较对这方面感兴趣.所有做个开篇笔记记录一下,以便督促自己下一个技术方案方向 已经写好的入门级别Identity4的服务+api资源访问控制和简单的客 ...

随机推荐

  1. 查看Eclipse版本号及各个版本区别

    1. 找到eclipse安装目录 2. 进入readme文件夹,打开readme_eclipse.html 3. readme_eclipse.html呈现的第二行即数字版本号,如: Eclipse ...

  2. com.netflix.zuul.exception.ZuulException: Hystrix Readed time out

    通过API网关路由来访问用户服务,zuul默认路由规则 :http://zuul的Host地址:zuul端口/要调用的服务名/服务方法地址 浏览器中打开http://127.0.0.1:8000/wa ...

  3. 第二课android中activity启动模式

    一.标准启动模式可以用函数gettaskid得到任务的idtostring得到地址用textallcaps来设置是否全部大写应用启动自己是在任务栈里创建不同实例可以用返回来返回上一个任务栈在andro ...

  4. 【vue】iView-admin2.0动态菜单路由

    vue项目实现动态路由有俩种方式 一.前端在routers中写好--所有--路由表 <前端控制路由>,登录时根据用户的角色权限来动态的显示菜单路由 二.前端通过调用接口请求拿到当前用户-- ...

  5. JS 设计模式八 -- 发布订阅者模式

    概念 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多(一个发布,多个观察)的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 优点 1 ...

  6. css基本介绍

    目录 CSS初识 构造规则 注意 样式表的定义和使用 行内式(内联样式) 内部样式表 外部样式表(外链式) 选择器 标签选择器(元素选择器) 类选择器 id选择器 通配符选择器 伪类选择器 链接伪类选 ...

  7. Java队列学习

    队列是Java集合中的重要组成部分,具有先进先出的特性,使其具有广泛的应用场景,比如排队等.因此今天就来学习一下Java中的队列.本文的例子使用的Java8环境. 继承类图 学习队列,首先要知道它的类 ...

  8. 使用vue全家桶制作博客网站

    前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue.vue-router.vuex.v ...

  9. [ffmpeg] 解码API

    版本迭代 ffmpeg解码API经过了好几个版本的迭代,上一个版本的API是 解码视频:avcodec_decode_video2 解码音频:avcodec_decode_audio4 我们现在能看到 ...

  10. gulp 入门使用

      gulp 入门使用 使用场景 相信大家在传统的开发模式下 都是 html + css + js 然后静态文件不经过任何处理 部署到服务器,这样会有很多漏洞例如: 1.在网站上查看F12 就可以看到 ...