http接口开发及调用_henryzhang2009的博客-程序员秘密_http接口开发

技术标签: JavaEE  接口-http-https-webservice  

一般用http的post,尽量不用get;

开发中一般都使用org.apache.http的jar包,比较成熟,方便,易用;当然了,直接用java提供的也行

package com.XXXX.XXXX.service;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.entity.ContentType;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

/*
 * Http接口 post
 * 接收下属客户端上传样本,保存样本文件
 * apache官网可以下载最新的jar包和demo
 * http://hc.apache.org/downloads.cgi
 */
public class TestSampleUpload4client {
public static void main(String[] args) throws ClientProtocolException, IOException{
String url = "http://192.168.1.6:8010/xxxxxxxxxxx/sample/fileUpload.action";
// 配置要 POST 的数据  
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
// 设置为浏览器兼容模式   
multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);  
// 设置请求的编码格式
multipartEntityBuilder.setCharset(Charset.forName(HTTP.UTF_8));
ContentType TEXT_PLAIN = ContentType.create("text/plain", Charset.forName(HTTP.UTF_8)); 

//设置一致的编码格式极其重要,否则容易出现乱码,不管客户端是以什么语言什么方式进行调用,必须让其编码格式与接收端一致;
multipartEntityBuilder.addTextBody("userName", "admin",TEXT_PLAIN);
multipartEntityBuilder.addTextBody("psd", "admin",TEXT_PLAIN);
multipartEntityBuilder.addTextBody("mac", "ma2343344f1333",TEXT_PLAIN);
multipartEntityBuilder.addTextBody("md5", "afy67juu8776a",TEXT_PLAIN);
multipartEntityBuilder.addTextBody("type", "sample",TEXT_PLAIN);
//文件路径
File file = new File("D:\\glpt\\abc.txt");
multipartEntityBuilder.addBinaryBody("file", file);

/*
* 以下的参数提交方式也行
StringBody userName = new StringBody("admin", ContentType.create(
                "text/plain", Consts.UTF_8));
StringBody password = new StringBody("admin", ContentType.create(
                "text/plain", Consts.UTF_8));
// 把文件转换成流对象FileBody
FileBody bin = new FileBody(file);
multipartEntityBuilder.addPart("username", userName);
multipartEntityBuilder.addPart("password", password);
multipartEntityBuilder.addPart("file", bin);
*/
post(url,multipartEntityBuilder);
}

public static void post(String url,MultipartEntityBuilder multipartEntityBuilder) throws ClientProtocolException, IOException{
// 建立HttpPost对象 
HttpPost httppost = new HttpPost(url);
HttpClient httpclient = HttpClientBuilder.create().build();
// 生成 HTTP POST 实体
HttpEntity httpEntity = multipartEntityBuilder.build();
httppost.setEntity(httpEntity);
// 发送Post,并返回一个HttpResponse对象
HttpResponse httpResponse = httpclient.execute(httppost);
// 以下两行可以得到指定的Header
// Header header = httpResponse.getFirstHeader("Content-Length");
// String headerVal = header.getValue();
HttpEntity httpEntity2 = httpResponse.getEntity();
System.out.println("httpResponse.getStatusLine().getStatusCode():"+httpResponse.getStatusLine().getStatusCode());
// 如果状态码为200,就是正常返回
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
String result = EntityUtils.toString(httpEntity2);
// 得到返回的字符串
System.out.println(result);
// 如果是下载文件,可以用response.getEntity().getContent()返回InputStream
}else if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY) {
// 如果状态码为302
String locationUrl = httpResponse.getLastHeader("location").getValue();
post(locationUrl,multipartEntityBuilder);
}else {
String result = EntityUtils.toString(httpEntity2);
// 得到返回的字符串
System.out.println(result);
}
}

}









/**

*另一种处理方式
* @param args
* @throws UnsupportedEncodingException
* @throws IOException 
* @throws ClientProtocolException 
 
public static void main(String[] args) throws ClientProtocolException, IOException{
// TODO Auto-generated method stub
// POST的URL
String url = "http://192.168.10.203:8010/manageplatform/sample/sampleUpload.action";
// 建立HttpPost对象 
HttpPost httppost = new HttpPost(url);
// 建立一个NameValuePair数组,用于存储欲传送的参数
List<NameValuePair> params = new ArrayList<NameValuePair>();

// 添加参数
params.add(new BasicNameValuePair("userName", "admin"));
params.add(new BasicNameValuePair("psd", "admin"));
params.add(new BasicNameValuePair("mac", "mac3333333333"));
params.add(new BasicNameValuePair("md5", "md5555555555"));
params.add(new BasicNameValuePair("type", "sample"));



HttpClient httpclient = new DefaultHttpClient();
// 设置编码
httppost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

// 发送Post,并返回一个HttpResponse对象
HttpResponse httpResponse = httpclient.execute(httppost);
// 以下两行可以得到指定的Header
Header header = httpResponse.getFirstHeader("Content-Length");
String headerVal = header.getValue();


HttpEntity httpEntity = httpResponse.getEntity();


if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 如果状态码为200,就是正常返回
String result = EntityUtils.toString(httpEntity);
// 得到返回的字符串
System.out.println(result);
// 打印输出
// 如果是下载文件,可以用response.getEntity().getContent()返回InputStream
}else {
String result = EntityUtils.toString(httpEntity);
// 得到返回的字符串
System.out.println(result);
}
}
*/

}


以上例子中http请求了一个url:http://192.168.10.xxx:8010/xxxxxxxx/sample/sampleUpload.action

其中sampleUpload.action是用struts配置的;sampleUpload.action对应的action方法如下:

/**
* HTTP接口,
* 接收下属客户端及子管理中心上传样本,保存样本文件

* @return
*/
public void sampleUpload() {
OutputStream out = null;
try {
out = sResponse.getOutputStream();
String result = "Response=101;";
String path = sRequest.getSession().getServletContext().getRealPath("/");
System.out.println(path);
//用户认证
String userName = sRequest.getParameter("userName");
String psd = sRequest.getParameter("psd");
//此处省略了用户权限认证的操作;
String md5 = sRequest.getParameter("md5");
String mac = sRequest.getParameter("mac");
String type = sRequest.getParameter("type");
String ip = sRequest.getRemoteAddr();

if (StringUtils.isEmpty(md5) || StringUtils.isEmpty(mac) || StringUtils.isEmpty(type)) {
result = "Response=011;";
} else {
for (int i = 0; i < fileFileName.size(); i++) {
try {
String filename = fileFileName.get(i);
String savePath = StringUtils.isEmpty(UrlAddress.getUrl(type)) ? path + "WEB-INF/uploadPath/" + type : UrlAddress.getUrl(type);
if (!new File(savePath).exists()) {
new File(savePath).mkdirs();
}


filename = savePath + "/" + filename;
// sampleName = fileFileName.get(i);
FileOutputStream fos = new FileOutputStream(filename);
InputStream is = new FileInputStream(file.get(i));
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
filename = filename.replace('\\', '/');
result = "Response=000;";

result = sampleService.sampleUpload(type, md5, mac, filename, ip);
} catch (Exception e) {
result = "Response=101;";
e.printStackTrace();
}
}
}
//记录接口日志
sampleService.interfaceLogSave("1", mac, md5, ip, result);
//返回操作结果
out.write(result.getBytes());
out.flush();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
try {
if (out != null)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}





}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/henryzhang2009/article/details/38083933

智能推荐

Elasticsearch安装后x-pack插件后使用CRUL_elasticsearch x-pack漏洞_「已注销」的博客-程序员秘密

Elasticsearch-5.2.1安装x-pack插件后,无法正常按照之前的参数来进行CRUL操作,因为安装的x-pack的插件中新增了Shield的安全机制。 比如我们使用:curl -XPUT ‘localhost:9200/idx’ 会出现如下类似的错误信息{ "error": "AuthenticationException[Missing authentication toke

计算机网络考试 循环冗余检验,CRC(循环冗余校验)_百度百科_永动机兔的博客-程序员秘密

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。中文名循环冗余校验外文名Cyclic Redundancy Check简称CRC原理除法及余数的原理来作错误侦测目的确保传输的数据准...

BP神经网络对水质问题进行预测(Matlab代码实现)_wlz249的博客-程序员秘密

在大数据、人工智能的背景下,神经网络算法被广泛的应用和普及,风险预测问题成为人们关注的热点,BP神经网络算法是用于解决预测问题效果最好的算法之一,但传统的BP神经网络算法在隐含层权值选择过程具有一定的局限性,会影响算法预测的效率和精度。针对这种情况,提出了改进的BP神经网络算法,利用遗传算法和BP神经网络算法相结合,提升算法的预测效率和预测精度。首先,分析传统BP神经网络算法流程及不足;通过实验分析结果可知,相对于传统的BP神经网络算法,该方法在预测过程中可以提高预测效率、提升预测精度。

后端架构师技术图谱_java后端架构师技术图谱_爱学习Java的靓女的博客-程序员秘密

数据结构 队列 集合 链表、数组 字典、关联数组 栈 树 二叉树 完全二叉树 平衡二叉树 二叉查找树(BST) 红黑树 B-,B+,B*树 LSM 树 BitSet 常用算法 排序、查找算法 选择排序 冒泡排序 插入排序 快速排序 归并排序 希尔排序 堆排序 计数排序 桶排序 基数排序 二分查找 Java 中的排序工具 布隆过滤器 字符串比较

水晶报表安装配置-VS2010_独立级IT民工的博客-程序员秘密

1、安装1)CRforVS_13_0_1.exe 是安装到开发电脑上,为VS2010配套的,当然也可以安装CRforVS_13_0,注意:要用管理员权限来运行安装程序,否则可能报错:错误2753。文件“agent.exe.6ed28686”没有为安装作标记   2)安装CRforVS_13_0_1.exe之后,VS2010工具箱中自动出现“报表设计”水晶报表工具安装之后,VS中会自动增加r...

随便推点

db2数据库连接数 linux_DB2 数据库 linux基本操作【转】_weixin_39524741的博客-程序员秘密

1.改变列的长度db2 "alter table [tablename] alter column [columnname] set data type varchar(length)"2.在表中加列db2 "alter table [tablename] add [columnname] varchar(256)"3.修改列名a.添加新列db2 "alter table [tablename]...

【心无旁骛】vue-ts-daily_weixin_30869099的博客-程序员秘密

这是一个非常有意思的项目,我们先来看看效果这个项目所用的技术也比较有意思,它的技术栈为vue2.5 + Typescript + vuex + vue-router放下博主的项目地址吧,https://github.com/xiaomuzhu/vue-ts-daily接下来我们一起看项目代码吧,也一起研究ts怎么在vue中进行使用首先是入口文件main.ts//main.ts...

Kali Linux渗透测试:第二章 安装Kali Linux系统_Mr.Q1024的博客-程序员秘密

文章目录2.1 下载镜像2.2 安装VMware Workstation Pro15.5虚拟机2.3 系统安装2.1 下载镜像获取镜像:(1)登录Kali Linux官网(2)点击DOWNLOAD(3)选择Bare Metal,在物理机安装。(4)选择与自己电脑相适配的版本,建议选择稳定版,即Installer。点击下载。注意:如果下载速度过慢,可使用第三方下载工具进行下载。如迅雷。镜像种类:(1)稳定版:经过完整测试,使用更稳定。(2)周更新版:包含的工具为最新版本,但测试不充

airtest之Android真机连接_airtest判断adb状态_公子清羽的博客-程序员秘密

使用AirtestIDE连接安卓设备之前,需要确保ADB已经连接上了设备。① 我们可以使用adb devices来查看设备情况,如果仅仅提示List of devicesattached,则表明ADB未连接上任何设备;此时需要检查手机上的USB调试功能是否已开启,或者换一根USB数据线;② 如果ADB已连接上设备,那么执行adb devices后,会显示已连接设备的列表:List of devices attachedSJE5T17B17001648 deviceSJE5T1...

推荐文章

热门文章

相关标签