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)

          返回 nth 头字段的值。
 long getHeaderFieldDate(String name,
long Default)

          返回解析为日期的指定字段的值。
 String getHeaderFieldKey(int n)

          返回 nth 头字段的键。
 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
 boolean
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通信调用与创建的更多相关文章

  1. python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

    python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

  2. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  3. PHP与Java进行通信

    缘起: 最近做了一个电商平台与网银整合的小东西,程序是开源的 Ecmall的,网银的接口也很规范,给出的文档很全,唯一的小问题是,网银使用的签名和验签的lib是只有java和c的,对java还熟悉一些 ...

  4. Java数据库连接--JDBC调用存储过程,事务管理和高级应用

    相关链接:Jdbc调用存储过程 一.JDBC常用的API深入详解及存储过程的调用 1.存储过程的介绍 我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...

  5. Java进程通信之映像文件共享内存

    Java进程通信之映像文件共享内存 1. 共享内存 vs 进程通信 对UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种.但windows实际上只有影像文件共享内存一种. 而说到进程通信 ...

  6. PHP与Java进行通信的实现方法

    缘起: 最近做了一个电商平台与网银整合的小东西,程序是开源的 Ecmall的,网银的接口也很规范,给出的文档很全,唯一的小问题是,网银使用的签名和验签的lib是只有java和c的,对java还熟悉一些 ...

  7. java web应用调用python深度学习训练的模型

    之前参见了中国软件杯大赛,在大赛中用到了深度学习的相关算法,也训练了一些简单的模型.项目线上平台是用java编写的web应用程序,而深度学习使用的是python语言,这就涉及到了在java代码中调用p ...

  8. 《java多线程——线程简介与其创建(1)》

    Java 给多线程编程提供了内置的支持. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开 ...

  9. Java线程通信

    Java线程通信 螣蛇乘雾,终为土灰. 多个线程协同工作完成某个任务时就会涉及到线程间通信问题.如何使各个线程之间同时执行,顺序执行.交叉执行等. 一.线程同时执行 创建两个线程a和b,两个线程内调用 ...

随机推荐

  1. pthread库实现一个简单的任务池

    pthread库实现一个简单的任务池 类关系图: 说明:         1:TaskManager类管理Task类,Task类是一个纯虚类;         2:ThreadManager类管理Th ...

  2. linux各种系统下载地址

    1.Arch Linux Arch Linux在安装过程中提供了强大的可定制选择,支持你下载和安装自己所需的程序包.虽然这个选择对新手来说没有多大的帮助,但是它确实能够帮助那些使用Arch构建系统和存 ...

  3. 微软Power BI 每月功能更新系列——3月Power BI 新功能学习

    本月对Power BI Desktop 来讲是非常令人兴奋的一个月!!!以下是3月份最新的功能,下面马上带领大家看看本月的更新内容. 报表功能 报告页面工具提示(预览)  通过报告页面工具提示功能,可 ...

  4. PHP设计模式之观察者模式(转)

    开篇还是从名字说起,“观察者模式”的观察者三个字信息量很大.玩过很多网络游戏的童鞋们应该知道,即便是斗地主,除了玩家,还有一个角色叫“观察者".在我们今天他谈论的模式设计中,观察者也是如此. ...

  5. php算法面试案例(转)

    有5个人偷了一堆苹果,准备在第二天分赃.晚上,有一人遛出来,把所有菜果分成5份,但是多了一个,顺手把这个扔给树上的猴了,自己先拿1/5藏了.没想到其他四人也都是这么想的,都如第一个人一样分成5份把多的 ...

  6. Django之模板层-自定义过滤器以及标签

    自定义标签与过滤器 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 在app中创建templatetags模块(模块名只能是t ...

  7. 检查是否使用PAM认证模块禁止wheel组之外的用户su为root

    编辑su文件(vi /etc/pam.d/su),在开头添加下面两行: auth sufficient pam_rootok.so 和 auth required pam_wheel.so group ...

  8. pip windows下的引入

    安装了python以后,并且环境变量里引入了python安装路径后, 想使用pip来安装未安装的模块,但是命令模式里不能执行pip, 查看python安装路径,发现pip跟easy_install的执 ...

  9. HBase使用压缩存储(snappy)

    在将mysql数据导入到hbase数据的过程中,发现hbase的数据容量增加很快, 原本在mysql存储30G容量的数据导入到hbase一直增加到快150G(还未完全导入,手动结束), 而采用默认3个 ...

  10. HDU2036:改革春风吹满地

    Problem Description " 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次 ...