java-http通信调用与创建
java项目使用HTTP的请求。主要有两种方式:
①使用JDK自带的java.net包下的HttpURLConnection方式。
②使用apache的HttpClient方式。
一、使用JDK自带的java.net包下的HttpURLConnection方式。
方法摘要 | |
---|---|
abstract void |
disconnect() 指示近期服务器不太可能有其他请求。 |
InputStream |
getErrorStream() 如果连接失败但服务器仍然发送了有用数据,则返回错误流。 |
static boolean |
getFollowRedirects() 返回指示是否应该自动执行 HTTP 重定向 (3xx) 的 boolean 值。 |
String |
getHeaderField(int n) 返回 n th 头字段的值。 |
long |
getHeaderFieldDate(String name, 返回解析为日期的指定字段的值。 |
String |
getHeaderFieldKey(int n) 返回 n th 头字段的键。 |
boolean |
getInstanceFollowRedirects() 返回此 HttpURLConnection 的instanceFollowRedirects 字段的值。 |
Permission |
getPermission() 返回一个权限对象,其代表建立此对象表示的连接所需的权限。 |
String |
getRequestMethod() 获取请求方法。 |
int |
getResponseCode() 从 HTTP 响应消息获取状态码。 |
String |
getResponseMessage() 获取与来自服务器的响应代码一起返回的 HTTP 响应消息(如果有)。 |
void |
setChunkedStreamingMode(int chunklen) 此方法用于在预先不知道内容长度时启用没有进行内部缓冲的 HTTP 请求正文的流。 |
void |
setFixedLengthStreamingMode(int contentLength) 此方法用于在预先已知内容长度时启用没有进行内部缓冲的 HTTP 请求正文的流。 |
static void |
setFollowRedirects(boolean set) 设置此类是否应该自动执行 HTTP 重定向(响应代码为 3xx 的请求)。 |
void |
setInstanceFollowRedirects(boolean followRedirects) 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向(响应代码为 3xx的请求)。 |
void |
setRequestMethod(String method) 设置 URL 请求的方法, GET POST HEAD OPTIONS PUT DELETE TRACE 以上方法之一是合法的,具体取决于协议的限制。 |
abstract |
usingProxy() 指示连接是否通过代理。 |
注意:
HttpURLConnection为get请求时,urlConnection.setRequestMethod("GET");,需要注释outputStream = urlConnection.getOutputStream();,进行getOutputStream时,为把get请求自动转换为post请求,导致返回403
客户端:
请求接口
/**
* 请求资源
* @param http
* @param message
* @param type
* @return
*/
public static String httpRequestResources(String http,String message,String type) {
String resultMsg = "";
InputStreamReader iStreamReader = null;
BufferedReader reader = null;
OutputStream oStream = null;
OutputStreamWriter oStreamWriter= null;
InputStream iStream = null;
Lock lock = new ReentrantLock();
lock.lock();
try {
URL url = new URL(http);
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();//创建连接
httpURLConnection.setRequestProperty("Content-Type", "application/json;charset=utf-8");//请求类型
httpURLConnection.setRequestMethod(type);//请求方式
httpURLConnection.setConnectTimeout(1000);//连接超时
httpURLConnection.setReadTimeout(30000);//设置从主机读取数据超时
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
httpURLConnection.setUseCaches(false);
if (StringUtils.isNotEmpty(message)) {
oStream = httpURLConnection.getOutputStream();
oStreamWriter = new OutputStreamWriter(oStream, "UTF-8");//设置输出流
oStreamWriter.write(message);
oStreamWriter.flush();
}
int rCode = httpURLConnection.getResponseCode();
if (rCode == HttpURLConnection.HTTP_OK) {
iStream = httpURLConnection.getInputStream();
}else {
iStream = httpURLConnection.getErrorStream();
}
if (iStream != null) {
iStreamReader = new InputStreamReader(iStream, "UTF-8");
}
if (iStreamReader != null) {
reader = new BufferedReader(iStreamReader);
}
if (reader != null) {
String len;
while ((len = reader.readLine()) != null) {
resultMsg += len;
}
}
} catch (Exception e) {
logger.error("调取接口异常:"+http+"|||"+e.getMessage()); }finally {
try {
if(iStreamReader!=null)
iStreamReader.close();
if(reader!=null)
reader.close();
if(oStreamWriter!=null)
oStreamWriter.close();
if(oStream!=null)
oStream.close();
if (iStream != null) {
iStream.close();
}
} catch (IOException e) {
logger.error("调取接口httpRequestResources异常:"+e.getMessage()+";printStackTrace: "+e.getStackTrace());
} }
return resultMsg;
}
服务端:
private void responseFunction(HttpServletRequest request, HttpServletResponse response) {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String str=request.getParameter("xxx");//获得发送HTTP请求的参数
response.getWriter().write("{\"message\":\"success\"}");//向HTTP发送方返回响应数据
}
例:
服务端创建http接口:
接口controller
package net.nblh.api.controller; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import net.nblh.api.base.ApiBase;
import net.nblh.comm.response.ResponseResult; /**
* 接口
* @author lijd
*
*/
@RequestMapping("api/conferenceApprove")
@RestController
public class ConferenceApproveAPIController extends ApiBase{
@RequestMapping(value="approve",method=RequestMethod.POST)
@ResponseBody//http://172.19.82.47:1002/conf/api/conferenceApprove/approve
public ResponseResult approve(HttpServletRequest request,HttpServletResponse response) throws Exception{
JSONObject jsonObject = new JSONObject();
String data= IOUtils.toString(request.getInputStream());//获取传入的json
jsonObject = JSON.parseObject(data);
//....
ResponseResult responseResult = new ResponseResult(ResponseResult.SUCCESSCODE);
responseResult.setMsg("签批成功");
return responseResult;
}
}
@ControllerAdvice异常拦截
package net.nblh.api.base; import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.fastjson.JSONException; import net.nblh.comm.response.ResponseResult; /**
* 数据验证
* @author lijd
*
*/
@ControllerAdvice
public class ApiBase { @ExceptionHandler(JSONException.class)
@ResponseBody
public ResponseResult handlerJSONException(JSONException e) {
ResponseResult responseResult = new ResponseResult(ResponseResult.FAILURECODE);
responseResult.setMsg("json格式不正确");
responseResult.setData(e.getMessage());
return responseResult;
}
}
shiro配置
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 指定URL拦截规则 -->
<property name="filterChainDefinitions">
<!--authc:代表shiro框架提供的一个过滤器,这个过滤器用于判断当前用户是否已经完成认证,如果当前用户已经认证,就放行,如果当前用户没有认证,跳转到登录页面
anon:代表shiro框架提供的一个过滤器,允许匿名访问-->
<value>
/api/**/** = anon
</value>
</property>
</bean>
java-http通信调用与创建的更多相关文章
- python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样
python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- PHP与Java进行通信
缘起: 最近做了一个电商平台与网银整合的小东西,程序是开源的 Ecmall的,网银的接口也很规范,给出的文档很全,唯一的小问题是,网银使用的签名和验签的lib是只有java和c的,对java还熟悉一些 ...
- Java数据库连接--JDBC调用存储过程,事务管理和高级应用
相关链接:Jdbc调用存储过程 一.JDBC常用的API深入详解及存储过程的调用 1.存储过程的介绍 我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...
- Java进程通信之映像文件共享内存
Java进程通信之映像文件共享内存 1. 共享内存 vs 进程通信 对UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种.但windows实际上只有影像文件共享内存一种. 而说到进程通信 ...
- PHP与Java进行通信的实现方法
缘起: 最近做了一个电商平台与网银整合的小东西,程序是开源的 Ecmall的,网银的接口也很规范,给出的文档很全,唯一的小问题是,网银使用的签名和验签的lib是只有java和c的,对java还熟悉一些 ...
- java web应用调用python深度学习训练的模型
之前参见了中国软件杯大赛,在大赛中用到了深度学习的相关算法,也训练了一些简单的模型.项目线上平台是用java编写的web应用程序,而深度学习使用的是python语言,这就涉及到了在java代码中调用p ...
- 《java多线程——线程简介与其创建(1)》
Java 给多线程编程提供了内置的支持. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开 ...
- Java线程通信
Java线程通信 螣蛇乘雾,终为土灰. 多个线程协同工作完成某个任务时就会涉及到线程间通信问题.如何使各个线程之间同时执行,顺序执行.交叉执行等. 一.线程同时执行 创建两个线程a和b,两个线程内调用 ...
随机推荐
- 查看oracle数据库允许的最大连接数和当前连接数
1.查看当前的数据库连接数 select count(*) from v$process ; --当前的数据库连接数 2.数据库允许的最大连接数 select value from v$pa ...
- 读取文件时,使用file.eof()判断结尾注意事项
今天写一个小功能需要读取文件,在判断文件结尾时使用了以下语句: while(infile.eof() && infile.good()) { infile.read((); encod ...
- 使用generator生成dao、mapping和model
我们在ssm框架开发的时候(不限于此框架),为了开发效率.有时候不得不提高一下代码速度.千篇一律的事情谁都头疼,比如写dao,写model,写mapping等等.不仅慢,而且一不留神,还会出错. 今天 ...
- 对象存储到session中
以前在使用java开发中,通常都是在session里面存放的对象.在使用php开发中,也打算在session中存入对象,确实能把对象放进去,也能把整个对象输出,但就是取不出对象里面的属性. 通过pri ...
- python day10 参数,命名空间
一.函数的参数--动态传参 1.动态接收位置参数 1.1在参数位置编写*表示接收任意多个内容 def chi(*food): print("我要吃", food) chi(&quo ...
- Spring架构-01-微服务架构
一.单体架构 所有功能,所有模块都耦合在一个系统里面,如传统的一MVC. 需要重新编译测试,重新部署. 伸缩性差 可靠性差 系统迭代困难 跨开发语言程序低 团队协作麻烦 二.微服务架构 常见架构风格: ...
- 第七十四课 图的遍历(BFS)
广度优先相当于对顶点进行分层,层次遍历. 在Graph.h中添加BFS函数: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" ...
- Beta周第7次Scrum会议(11/16)【王者荣耀交流协会】
一.小组信息 队名:王者荣耀交流协会 小组成员 队长:高远博 成员:王超,袁玥,任思佳,王磊,王玉玲,冉华 小组照片 二.开会信息 时间:2017/11/16 17:03~17:17,总计14min. ...
- Uva 816 Abbott's Revenge(BFS)
#include<cstdio> #include<cstring> #include<vector> #include<queue> using na ...
- C#中的IDisposable接口
深入理解C#中的IDisposable接口 写在前面 在开始之前,我们需要明确什么是C#(或者说.NET)中的资源,打码的时候我们经常说释放资源,那么到底什么是资源,简单来讲,C#中的每一种类型都是一 ...