使用JAVA实现http通信详解

合集下载

java协议解析插件实现方式

java协议解析插件实现方式

java协议解析插件实现方式全文共四篇示例,供读者参考第一篇示例:Java协议解析插件是一种在Java开发中常用的工具,它能够帮助开发人员解析和处理各种不同的网络协议数据。

在网络通信中,不同的协议有不同的数据格式和规则,使用协议解析插件可以帮助开发人员快速准确地解析和处理这些数据,提高开发效率和准确性。

一般来说,实现一个Java协议解析插件主要包括以下几个方面的工作:定义协议数据结构、解析数据、处理数据和输出结果。

下面我们将分别介绍这几个方面的实现方式。

首先是定义协议数据结构。

在解析协议数据之前,我们需要先确定协议的数据结构,即协议中包含哪些字段,各个字段的数据类型是什么,字段之间有何种关联。

一般来说,我们可以使用Java类或者数据结构来表示协议数据结构,定义各个字段对应的属性和方法。

接着是解析数据。

解析数据是协议解析插件的核心功能之一,它需要根据协议的数据结构,将网络传输的原始数据按照协议规则进行解析,提取出各个字段的数值,转换为Java对象或者数据结构。

我们可以使用正则表达式、分割字符串、字节流解析等方法来实现数据解析。

然后是处理数据。

处理数据是指对解析出来的数据进行加工处理,例如数据变换、计算、存储等操作。

在处理数据的过程中,开发人员可以根据具体的业务需求编写相应的代码逻辑,实现数据处理功能。

最后是输出结果。

输出结果是指将处理完毕的数据输出到指定的位置,可以是内存、文件、数据库等。

通常我们可以将处理完毕的数据封装为Java对象或者数据结构,然后通过适当的方式输出到目标位置,以供其他系统或者模块使用。

实现一个Java协议解析插件需要开发人员熟悉协议数据结构,具备数据解析和处理的能力,同时需要考虑插件的性能和可扩展性。

通过不断的实践和优化,可以打造一个高效准确的协议解析插件,为Java开发人员提供更好的开发体验和帮助。

第二篇示例:Java协议解析插件实现方式随着互联网的飞速发展,各种通信协议不断涌现,例如HTTP协议、TCP协议、UDP协议等等。

JAVA实现简单的HTTP服务器端

JAVA实现简单的HTTP服务器端
writer.println("Accept-Language: en-us,zh-cn;q=0.5");
writer.println("Accept-Encoding: gzip, deflate");
writer.println("Host: ");
writer.println("Connection: Keep-Alive");
writer.println();
writer.flush();
String line = reader.readLine();
writer.println("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
writer.println("GET /home.html HTTP/1.1&ln("Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*");

java服务器间http通讯,同时传输文件流和数据,并接收返回的文件流或数据

java服务器间http通讯,同时传输文件流和数据,并接收返回的文件流或数据

java服务器间http通讯,同时传输⽂件流和数据,并接收返回的⽂件流或数据废话:这⾥使⽤的是HttpUrlConnection,httpclient没有试过,这篇⽂章也是收集了很多⼤佬的成果,但是由于太久远了找不到原⽂了,如果有⼤佬看到提醒⼀下,愿意贴上原⽂链接的哈,抱歉抱歉,现在实现了同时传输⽂件和数据,但是response返回的⽂件和数据只能接收⼀个,如果⼤家有同时接收的⽅法,望告知,谢谢⼤家了。

需求:其实就是服务器间通过http进⾏通讯,不⾛前端的那种,公司需求给某个⽹址主动发⽂件流,并且接收response中的反馈⽂件流或者错误信息。

连接⼯具类HttpUrlConnection.java,现在⽀持传多个数据,⼀个⽂件,如果需要多个⽂件,照着改改应该没问题的@Componentpublic class HttpUrlConnection {//头部格式private static final String nextLine = "\r\n";private static final String twoHyphens = "--";//随便写⼀个private static final String boundary = java.util.UUID.randomUUID().toString();/*** @Description:java项⽬的服务端之间的通信* @Param: [requestUrl,请求url* jsessionId, 浏览器的访问的Cookie,即被访问的服务端的session。

若被访问的服务器没有做url过滤器,则该参数可以为null。

* file, 发送出去的⽂件* feedbackFile, 收到的反馈⽂件存放位置* name,对⽅⽤来接收⽂件的名字* params,要传的参数* @Return: java.util.Map* @Author: Liting* @Date: 2019-11-26 08:54*/public static Map httpUrlConnection(String requestUrl, String jsessionId, File file, String feedbackFile, String name, Map<String,String> params) throws IOException { HttpURLConnection con = (HttpURLConnection) new URL(requestUrl).openConnection();if (!Utils.isEmpty(jsessionId)) {con.setRequestProperty("Cookie", "JSESSIONID=" + jsessionId);}// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在// http正⽂内,因此需要设为true, 默认情况下是false;con.setDoOutput(true);// 设置是否从httpUrlConnection读⼊,默认情况下是true;con.setDoInput(true);// 设定请求的⽅法为"POST",默认是GETcon.setRequestMethod("POST");// Post 请求不能使⽤缓存con.setUseCaches(false);//设置接收返回值的格式con.setRequestProperty("Accept", "text/plain, */*");//设置接收编码con.setRequestProperty("Accept-Language", "zh-cn");con.setRequestProperty("Host","127.0.0.1");//设置请求参数格式以及boundary分割线con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);con.setRequestProperty("User-Agent"," WinHttpClient");//开启长连接可以持续传输con.setRequestProperty("Connection", "Keep-Alive"); //连接超时时间20秒con.setConnectTimeout(20000); //读取超时时间20秒con.setReadTimeout(20000);OutputStream out = con.getOutputStream();//分隔符头部//拼接参数if (!Utils.isEmpty(params)){int i = 0;for (String paramName : params.keySet()){StringBuffer strBufparam = new StringBuffer();strBufparam.append(twoHyphens);strBufparam.append(boundary);strBufparam.append(nextLine);strBufparam.append("Content-Disposition: form-data;name=\""+paramName+"\"");strBufparam.append(nextLine);strBufparam.append("Content-Type: " + "text/plain");strBufparam.append(nextLine);strBufparam.append("Content-Length: " + params.get(paramName).getBytes().length);strBufparam.append(nextLine);strBufparam.append(nextLine);strBufparam.append(params.get(paramName));i++;if (i!=params.size()){strBufparam.append(nextLine);}out.write(strBufparam.toString().getBytes());}}//拼接⽂件if (!Utils.isEmpty(file)){StringBuffer strBufFile = new StringBuffer();strBufFile.append(nextLine);strBufFile.append(twoHyphens);strBufFile.append(boundary);strBufFile.append(nextLine);strBufFile.append("Content-Disposition: form-data; name=\""+name+"\"; filename=\"" + file.getName() + "\""); strBufFile.append(nextLine);strBufFile.append("Content-Type: " + "application/x-tar");strBufFile.append(nextLine);strBufFile.append("Content-Length: " + file.length());strBufFile.append(nextLine);strBufFile.append(nextLine);//写⼊输出流out.write(strBufFile.toString().getBytes());//读取本地⽂件流FileInputStream inputStream = new FileInputStream(file);byte[] data = new byte[2048];int len = 0;int sum = 0;while ((len = inputStream.read(data)) != -1) {//将读取到的本地⽂件流读取到HttpsURLConnection,进⾏上传out.write(data, 0, len);sum = len + sum;}//⽂件写⼊完成后加回车out.write(nextLine.getBytes());inputStream.close();}//写⼊结束分隔符String footer = nextLine + twoHyphens + boundary + twoHyphens + nextLine;out.write(footer.getBytes());out.flush();out.close();con.connect();int responseCode = con.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {if (!Utils.isEmpty(feedbackFile)) {//有返回⽂件的时候String fileName = "";try {fileName = con.getHeaderField(1).substring(21, con.getHeaderField(1).length() - 1);fileName = "EBDT"+fileName.split("_")[1];System.out.println(fileName);}catch (Exception e){return null;}BufferedInputStream in = new BufferedInputStream(con.getInputStream());File f = new File(feedbackFile);if (!f.exists()) {f.mkdirs();}File res = new File(feedbackFile+"/"+fileName);FileOutputStream fos = new FileOutputStream(res);byte[] by = new byte[1024];int length = 0;while ((length = in.read(by)) != -1) {fos.write(by, 0, length);}fos.close();in.close();con.disconnect();if (Utils.isEmpty(fos)) {return null;}//处理接收到的⽂件//保存到本地Map map = new HashMap();map.put("fileName",fileName);return map;}else{//接收到的return中的值BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));String s = br.readLine();br.close();con.disconnect();try{if (!Utils.isEmpty(s)){Object m = JSONObject.parse(s);Map map = (Map) m;return map;}}catch (Exception e){Map map = new HashMap();map.put("feedback",s);return map;}}return new HashMap();} else {con.disconnect();return null;}}}main⽅法测试public static void main(String[] args) throws IOException {Map<String,String> map = new HashMap<>();map.put("name","张三");map.put("age","23");File file = new File("D:\\1.xml");Map map1 = HttpUrlConnection.httpUrlConnection("http://127.0.0.1/user/addUser", "69e4baee-ff22-4cdf-a73b-6156c5d6d2c1", file, "", "files", map);System.out.println(map1);}结果到这就是全部了,如有问题欢迎留⾔。

java 数据对接方法

java 数据对接方法

java 数据对接方法Java 数据对接方法1. 数据对接介绍数据对接是指不同系统之间进行数据传输和共享的过程。

在Java 中,我们可以使用多种方法实现数据对接,包括但不限于以下方法:•Java Socket:基于TCP/IP协议的套接字通信方式,可以实现实时数据传输和双向通信。

•Java URL:提供了一种简单的访问网页和资源的方法,可以处理HTTP请求和响应。

•Java HttpURLConnection:是Java中处理HTTP网络请求的基础类,提供了丰富的方法用于发送和接收HTTP请求和响应。

•Java Sockets与Java Server Sockets:分别用于实现客户端和服务器端的套接字通信,在局域网中可用于数据传输和通信。

•Java RMI(Remote Method Invocation):是一种支持在远程服务器上调用方法的Java API,可以实现分布式应用程序之间的数据传输。

•Java JMS(Java Message Service):Java消息服务,是一种用于在分布式系统中发送、接收消息的API,常用于异步通信。

2. Java SocketJava Socket是Java程序进行网络通信的基础类,它提供了一种简单而底层的方式来进行数据对接。

使用Java Socket可以实现客户端和服务器之间的双向通信,具体步骤如下:1.创建一个Socket对象,指定服务器的IP地址和端口号。

2.调用Socket对象的getOutputStream()方法获取输出流,用于向服务器发送数据。

3.调用Socket对象的getInputStream()方法获取输入流,用于从服务器接收数据。

4.使用输入流和输出流进行数据的读写操作。

5.使用完毕后,调用Socket对象的close()方法关闭连接。

3. Java URLJava URL类是Java提供的用于处理URL(Uniform Resource Locator)的类,可以用于访问网页和其他资源。

Java调用HttpHttps接口(1)--编写服务端

Java调用HttpHttps接口(1)--编写服务端

Java调⽤HttpHttps接⼝(1)--编写服务端 Http接⼝输⼊的数据⼀般是键值对或json数据,返回的⼀般是json数据。

本系列⽂章主要介绍Java调⽤Http接⼝的各种⽅法,本⽂主要介绍服务端的编写,⽅便后续⽂章⾥的客户端的调⽤。

⽂中所使⽤到的软件版本:Java 1.8.0_191、SpringBoot 2.2.1.RELEASE。

1、服务端Controllerpackage com.inspur.demo.http.server;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.multipart.MultipartFile;import mon.entity.CallResult;import mon.util.FileUtil;import er;@Controller@RequestMapping(value="/httptest/", method = {RequestMethod.GET, RequestMethod.POST})public class HttpTestController {private static Logger logger = LoggerFactory.getLogger(HttpTestController.class);@RequestMapping(value = "getUser", produces = "application/json;charset=UTF-8")@ResponseBodypublic CallResult<User> getUser(String userId, String userName) {("userId={},userName={}", userId, userName);User user = new User();user.setUserId(userId);user.setUserName(userName);CallResult<User> result = new CallResult<User>(0, "OK", user);return result;}/*** 传⼊json* @param user* @return*/@RequestMapping("addUser")@ResponseBodypublic CallResult<User> addUser(@RequestBody User user) {(user.toString());CallResult<User> result = new CallResult<User>(0, "OK", user);return result;}/*** 上传⽂件* 这种⽅式不适合页⾯form表单上传⽂件,适合客户端调⽤* @param request* @return*/@RequestMapping(value = "upload", produces = "application/json;charset=UTF-8")@ResponseBodypublic CallResult<String> upload(HttpServletRequest request) {InputStream in = null;OutputStream out = null;CallResult<String> result = new CallResult<String>(0, "OK", "上传成功");try {in = new BufferedInputStream(request.getInputStream(), 16 * 1024);//假设上传的就是jpg⽂件String fileName = "d:/temp/upload_" + System.currentTimeMillis() + ".jpg";out = new BufferedOutputStream(new FileOutputStream(fileName), 16 * 1024);byte[] buffer = new byte[16 * 1024];int len = 0;while ((len = in.read(buffer)) != -1) {out.write(buffer, 0, len);}} catch (Exception e) {result = new CallResult<String>(-1, "发⽣异常", "");e.printStackTrace();} finally {FileUtil.close(in);FileUtil.close(out);}("upload返回结果:{}", result);return result;}/*** 上传⽂件及发送键值对数据* @param file* @param param1* @param param2* @return*/@RequestMapping("multi")@ResponseBodypublic CallResult<String> multi(@RequestParam("file") MultipartFile file, String param1, String param2) { ("file={},param1={},param2={}", file.getOriginalFilename(), param1, param2);InputStream in = null;OutputStream out = null;CallResult<String> result = new CallResult<String>(0, "OK", "上传成功");try {in = new BufferedInputStream(file.getInputStream(), 16 * 1024);String originalFilename = file.getOriginalFilename();//ie上传⽂件该值是全路径,处理下if (originalFilename.indexOf("\\") > -1) {originalFilename = originalFilename.substring(originalFilename.indexOf("\\") + 1);}String fileName = "d:/temp/multi_" + System.currentTimeMillis() + "_" + originalFilename;out = new BufferedOutputStream(new FileOutputStream(fileName), 16 * 1024);byte[] buffer = new byte[16 * 1024];int len = 0;while ((len = in.read(buffer)) != -1) {out.write(buffer, 0, len);}} catch (Exception e) {result = new CallResult<String>(-1, "发⽣异常", "");e.printStackTrace();} finally {FileUtil.close(in);FileUtil.close(out);}("multi返回结果:{}", result);return result;}/*** 下载⽂件* @param request* @param response*/@RequestMapping("download")public void download(HttpServletRequest request, HttpServletResponse response) {int BUFFER_SIZE = 16 * 1024;BufferedInputStream bis = null;OutputStream out = null;try {String fileName = "a.jpg";String urlFileName = "";if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {urlFileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");} else {urlFileName = .URLEncoder.encode(fileName, "UTF-8");}response.reset();response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment; filename=\"" + urlFileName + "\"");response.setHeader("Connection", "close");bis = new BufferedInputStream(new FileInputStream("d:/" + fileName), BUFFER_SIZE);out = new BufferedOutputStream(response.getOutputStream(), BUFFER_SIZE);byte buf[] = new byte[BUFFER_SIZE];int len;while ((len = bis.read(buf)) != -1) {out.write(buf, 0, len);}} catch (Exception e) {e.printStackTrace();} finally {FileUtil.close(bis);FileUtil.close(out);}}}2、其他辅助类2.1、CallResult类package mon.entity;import java.io.Serializable;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;/*** @param <T>*/public class CallResult<T> implements Serializable {private static final long serialVersionUID = 1L;/*** 返回码* 0 正常,其他异常*/private int returnCode = 0;/*** 描述*/private String description = "OK";/*** 结果数据*/private T result;public CallResult(){}public CallResult(int returnCode, String description) {this.returnCode = returnCode;this.description = description;}public CallResult(int returnCode, String description, T result) {this.returnCode = returnCode;this.description = description;this.result = result;}public int getReturnCode() {return returnCode;}public void setReturnCode(int returnCode) {this.returnCode = returnCode;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public T getResult() {return result;}public void setResult(T result) {this.result = result;}@Overridepublic String toString() {//return JSON.toJSONString(this, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty);try {return new ObjectMapper().writeValueAsString(this);} catch (JsonProcessingException e) {e.printStackTrace();}return "";}}View Code2.2、User类package com.inspur.demo.http.entity;public class User {private String userId;private String userName;public String getUserId() {return userId;}public void setUserId(String userId) {erId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}@Overridepublic String toString() {return "User [userId=" + userId + ", userName=" + userName + "]"; }}View Code2.2、FileUtil类package mon.util;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;/*** ⽂件操作⼯具*/public class FileUtil {private FileUtil() {}public static void close(InputStream in) {try {if (in != null) {in.close();}} catch (IOException e) {e.printStackTrace();}}public static void close(OutputStream out) {try {if (out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}}}View Code3、接⼝地址在本地部署后,访问地址为:4、Https接⼝Https接⼝可以通过openssl⽣成证书、nginx设置⽅向代理来实现;由于这不是本系列⽂章的重点,这⾥就不详细介绍了,感兴趣的可以搜索研究。

JAVA代码实现HTTP请求的常用方法

JAVA代码实现HTTP请求的常用方法

JAVA代码实现HTTP请求的常用方法在Java中,有多种方法可以实现HTTP请求。

下面将介绍几种常用的方法。

1. 使用Java内置的URL类和HttpURLConnection类:```javaimport java.io.BufferedReader;import java.io.InputStreamReader;public class HTTPRequestExamplepublic static void main(String[] args) throws ExceptionURL obj = new URL(url);HttpURLConnection con = (HttpURLConnection)obj.openConnection(;//设置请求方法con.setRequestMethod("GET");//添加请求头con.setRequestProperty("User-Agent", "Mozilla/5.0");//获取响应码int responseCode = con.getResponseCode(;System.out.println("Response Code: " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream());String inputLine;StringBuffer response = new StringBuffer(;while ((inputLine = in.readLine() != null)response.append(inputLine);}in.close(;//打印响应内容System.out.println(response.toString();}```2. 使用第三方库HttpClient:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception //创建GET请求//发送请求并获取响应//解析响应实体内容//打印响应内容System.out.println(response);// 关闭HttpClient连接}```3. 使用第三方库OkHttp:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception// 创建OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient(;// 创建Request对象Request request = new Request.Builder.url(url).build(;//发送请求并获取响应Response response = okHttpClient.newCall(request).execute(;String responseBody = response.body(.string(;//打印响应内容System.out.println(responseBody);}```4. 使用第三方库RestTemplate(Spring框架的一部分):```javaimport org.springframework.web.client.RestTemplate;public class HTTPRequestExamplepublic static void main(String[] args)// 创建RestTemplate对象RestTemplate restTemplate = new RestTemplate(;//发送GET请求,并获取响应ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);//获取响应内容String response = responseEntity.getBody(;//打印响应内容System.out.println(response);}```这些方法提供了不同的方式来实现HTTP请求,使用Java内置的URL 类和HttpURLConnection类相对简单,但是需要自己处理底层连接和数据读取。

解决java请求带headers的具体操作步骤-概述说明以及解释

解决java请求带headers的具体操作步骤-概述说明以及解释1.引言1.1 概述在进行Java网络编程时,我们经常需要向服务器发送HTTP请求,并在请求中附带一些自定义的头部信息(headers)。

HTTP请求头部可以包含诸如身份验证、请求类型、数据格式等重要信息,因此了解如何解决Java 请求带头部的问题是非常重要的。

本文将介绍如何在Java中进行HTTP请求时携带头部信息的具体操作步骤。

我们将探讨使用Java的标准库以及一些常用的第三方库来实现此功能。

无论是发送GET请求还是POST请求,我们都将讨论如何设置请求头部以满足我们的需求。

首先,我们将介绍Java标准库中的方法,这些方法提供了基本的HTTP 请求功能。

我们将学习如何创建HTTP连接、设置请求方法、添加头部信息等。

然后,我们将深入研究一些流行的第三方库,如Apache HttpClient 和OkHttp。

这些库提供了更简洁、更灵活的方式来发送HTTP请求并附带头部信息。

通过本文的学习,读者将能够掌握在Java中发送带头部信息的HTTP 请求的技巧和方法。

无论是向RESTful API发送请求还是与其他服务器进行交互,掌握如何设置请求头部信息是非常关键的。

接下来,我们将详细介绍如何进行这些操作,以便读者在实际开发中能够灵活运用。

1.2 文章结构文章结构部分应该包括对整篇文章结构的描述和各个章节的简要介绍。

以下是一个例子:2. 正文在本节中,我们将详细介绍解决Java请求带headers的具体操作步骤。

为了清晰地呈现该主题的内容,我们将文章分为以下几个要点:2.1 第一个要点在这一部分,我们将介绍如何设置请求头(headers)以及它们的作用。

我们将通过示例代码展示如何使用Java代码来添加不同类型的headers。

此外,我们还会讨论一些常见的header字段以及它们的用途和示例。

2.2 第二个要点第二个要点将更进一步探讨如何通过Java发送带headers的请求。

java 请求参数解析过程 -回复

java 请求参数解析过程-回复Java 请求参数解析过程在Java的Web开发中,参数解析是非常重要的一个环节。

当浏览器发送一个HTTP请求到服务器时,通常会携带一些参数,这些参数需要被服务器解析和处理。

本文将详细描述Java中请求参数解析的过程,该过程通常包括以下几个步骤:URL解析、表单数据解析、文件上传解析和参数封装。

1. URL解析URL解析是请求参数解析的第一步。

当浏览器发送一个HTTP请求时,通常会在URL中携带参数。

例如,对于类似于"2. 表单数据解析除了URL参数外,浏览器还可以通过表单提交数据给服务器。

在Java 中,可以使用HttpServletRequest的getParameter()方法来获取表单中的参数值。

对于单个值的参数,可以直接使用getParameter()方法来获取其值;对于多个值的参数,可以使用getParameterValues()方法来获取一个包含所有值的数组。

在内部,Java服务器通常会使用请求流(Stream)来解析表单数据,并根据Content-Type头部信息来判断请求的数据类型,例如application/x-www-form-urlencoded或multipart/form-data。

3. 文件上传解析在一些场景下,浏览器可能会将文件上传到服务器。

在Java中,可以使用Apache Commons FileUpload等第三方库来解析文件上传的请求。

这些库通常会提供一些方便的类和方法来解析二进制文件并获取其数据。

具体步骤包括创建一个文件上传解析器,配置参数,解析文件并将其保存到磁盘或内存中。

4. 参数封装请求参数解析的最后一步是将解析出的参数封装成合适的数据类型。

在Java中,可以将参数封装成JavaBean对象或使用Map等数据结构。

对于简单的参数,可以直接将其存储在Map中;对于复杂的参数,可以定义一个JavaBean类来封装参数,并使用反射来设置对象的属性值。

JavaWebSocket技术简介

JavaWebSocket技术简介WebSocket是一种协议,它允许客户端和服务器进行双向通信。

在传统的HTTP协议中,浏览器向服务器发出请求,服务器响应请求并发送数据。

但是,当需要不断地更新数据时,这种方式就显得有些不太可行了。

WebSocket则具有实时、低延迟、高效等特点,逐渐成为了Web应用程序中热门的技术。

Java作为一种流行的编程语言,提供了许多工具和框架来支持WebSocket,JavaWebSocket是其中之一。

JavaWebSocket是一个基于Java的WebSocket API,它使得Java应用程序能够轻松地处理WebSocket通信。

在本文中,我们将深入了解JavaWebSocket技术,并学习如何在Java应用程序中使用它。

JavaWebSocket的优点JavaWebSocket拥有几个特征和优点,使得它成为许多Java应用程序的首选:1.简单易用:JavaWebSocket API简单易用,旨在简化WebSocket通信的处理和管理,因此它对开发人员而言非常直观。

2.兼容性强:JavaWebSocket API不依赖于任何特定的Web容器或HTTP服务器,因此它在所有Java平台上都可以使用,包括Java SE、Java EE和Android等。

3.高效性:JavaWebSocket利用了非阻塞I/O模型,在数据传输效率上优于传统的Servlet API。

4.稳定性:JavaWebSocket被广泛使用,而且由于其良好的设计和文档,获得了稳定性和可靠性方面的好评。

JavaWebSocket的基本架构JavaWebSocket的基本架构包括三个主要组成部分:1. WebSocketServer:WebSocketServer是WebSocket服务器的主要组成部分,它相当于HTTP服务器。

WebSocketServer的主要任务是监听客户端的连接请求,并向客户端提供WebSocket连接。

Java发送http请求(get、post)的示例

Java发送http请求(get、post)的⽰例1.情景展⽰ java发送get请求、post请求(form表单、json数据)⾄另⼀服务器; 可设置HTTP请求头部信息,可以接收服务器返回cookie信息,可以上传⽂件等;2.代码实现所需jar包:httpcore-4.4.1.jar;httpclient-4.4.1.jar;httpmime-4.4.1.jar;epoint-utils-9.3.3.jarimport java.io.File;import java.io.IOException;import java.io.InputStream;import java.nio.charset.Charset;import java.security.GeneralSecurityException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import .ssl.HostnameVerifier;import .ssl.SSLContext;import .ssl.SSLSession;import org.apache.http.Header;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import ValuePair;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpDelete;import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPatch;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.methods.HttpRequestBase;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.conn.ssl.TrustStrategy;import org.apache.http.entity.ContentType;import org.apache.http.entity.StringEntity;import org.apache.http.entity.mime.MultipartEntityBuilder;import org.apache.http.entity.mime.content.StringBody;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;import org.apache.http.message.BasicNameValuePair;import org.apache.http.ssl.SSLContextBuilder;import org.apache.http.util.EntityUtils;import com.epoint.core.utils.string.StringUtil;/*** HttpClient⼯具类,使⽤http-client包实现,原先的common-httpclient已经淘汰** @作者 ko* @version [版本号, 2017年10⽉18⽇]*/public class HttpUtil{private static PoolingHttpClientConnectionManager connMgr;private static RequestConfig requestConfig;private static final int MAX_TIMEOUT = 7000;/*** 直接以流返回*/public static final int RTN_TYPE_1 = 1;/*** 直接以string返回*/public static final int RTN_TYPE_2 = 2;/*** 以map返回,reslut:接⼝结果string;statusCode:http状态码*/public static final int RTN_TYPE_3 = 3;/*** 以map返回,reslut:接⼝结果string;statusCode:http状态码;cookie:response的cookie * cookie值键值对,格式 key1=value1;key2=value2;...*/public static final int RTN_TYPE_4 = 4;/*** 默认上传⽂件的⽂件流或file 的key Name*/private static final String DEFAULT_BINARYBODY_KEYNAME = "file";static {// 设置连接池connMgr = new PoolingHttpClientConnectionManager();// 设置连接池⼤⼩connMgr.setMaxTotal(100);connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());// 在提交请求之前测试连接是否可⽤connMgr.setValidateAfterInactivity(1);RequestConfig.Builder configBuilder = RequestConfig.custom();// 设置连接超时configBuilder.setConnectTimeout(MAX_TIMEOUT);// 设置读取超时configBuilder.setSocketTimeout(MAX_TIMEOUT);// 设置从连接池获取连接实例的超时configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);requestConfig = configBuilder.build();}/*** 发送 GET请求** @param apiUrl* API接⼝URL* @return String 响应内容*/public static String doGet(String apiUrl) {return doHttp(apiUrl, null, "get", RTN_TYPE_2);}/*** 发送POST请求** @param apiUrl* API接⼝URL* @param params* K-V参数* @return String 响应内容*/public static String doPost(String apiUrl, Map<String, Object> params) {return doHttp(apiUrl, params, "post", RTN_TYPE_2);}/*** 发送POST请求** @param apiUrl* API接⼝URL* @param json* json参数* @return String 响应内容*/public static String doPostJson(String apiUrl, String json) {return doHttp(apiUrl, json, "post", RTN_TYPE_2);}/*** 发送 http 请求** @param apiUrl* API接⼝URL* @param params* {Map<String, Object> K-V形式、json字符串}* @param method* {null、或者post:POST请求、patch:PATCH请求、delete:DELETE请求、get:GET请求}* @param type* {HttpUtil.RTN_TYPE_1:请求返回stream(此时流需要在外部⼿动关闭);HttpUtil.* RTN_TYPE_2:string;HttpUtil.RTN_TYPE_3:返回⼀个map,map包含结果(* 结果是string形式)以及http状态码;HttpUtil.RTN_TYPE_4:返回⼀个map,map包含结果(* 结果是string形式), http状态码和cookie;其他情况返回string}* 如果结果是个map,key为:result,statusCode,cookie,分别返回结果* string,http状态码,cookie; cookie值键值对,格式* key1=value1;key2=value2;...* @return stream或 string 或 map*/public static <T> T doHttp(String apiUrl, Object params, String method, int type) {return doHttp(apiUrl, null, params, method, type);}/*** 发送 http 请求** @param apiUrl* API接⼝URL* @param headerMap* header信息Map<String, String>,可设置cookie* @param params* {Map<String, Object> K-V形式、json字符串}* @param method* {null、或者post:POST请求、patch:PATCH请求、delete:DELETE请求、get:GET请求}* @param type* {HttpUtil.RTN_TYPE_1:请求返回stream(此时流需要在外部⼿动关闭);HttpUtil.* RTN_TYPE_2:string;HttpUtil.RTN_TYPE_3:返回⼀个map,map包含结果(* 结果是string形式)以及http状态码;HttpUtil.RTN_TYPE_4:返回⼀个map,map包含结果(* 结果是string形式), http状态码和cookie;其他情况返回string}* 如果结果是个map,key为:result,statusCode,cookie,分别返回结果* string,http状态码,cookie; cookie值键值对,格式* key1=value1;key2=value2;...* @return stream或 string 或 map*/public static <T> T doHttp(String apiUrl, Map<String, String> headerMap, Object params, String method, int type) { CloseableHttpClient httpClient = null;if (isSSL(apiUrl)) {httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();}else {httpClient = HttpClients.createDefault();}return doHttp(httpClient, apiUrl, headerMap, params, method, type);}/*** 发送 http 请求** @param httpClient* httpclient对象由外部传⼊,⽤户需要保持登录状态等情况此时如果要ssl,那么要在外部加⼊ssl特性* httpClient =* HttpClients.custom().setSSLSocketFactory(HttpUtil.* createSSLConnSocketFactory())* .setConnectionManager(HttpUtil.getConnMgr()).* setDefaultRequestConfig(HttpUtil..getRequestConfig()).build();* @param apiUrl* API接⼝URL* @param headerMap* header信息Map<String, String>,可设置cookie** @param params* {Map<String, Object> K-V形式、json字符串}* @param method* {null、或者post:POST请求、patch:PATCH请求、delete:DELETE请求、get:GET请求}* @param type* {HttpUtil.RTN_TYPE_1:请求返回stream(此时流需要在外部⼿动关闭);HttpUtil.* RTN_TYPE_2:string;HttpUtil.RTN_TYPE_3:返回⼀个map,map包含结果(* 结果是string形式)以及http状态码;HttpUtil.RTN_TYPE_4:返回⼀个map,map包含结果(* 结果是string形式), http状态码和cookie;其他情况返回string}* 如果结果是个map,key为:result,statusCode,cookie,分别返回结果* string,http状态码,cookie; cookie值键值对,格式* key1=value1;key2=value2;...* @return stream或 string 或 map*/@SuppressWarnings("unchecked")public static <T> T doHttp(CloseableHttpClient httpClient, String apiUrl, Map<String, String> headerMap, Object params, String method, int type) {HttpRequestBase httpPost = null;if (StringUtil.isNotBlank(method)) {if ("patch".equalsIgnoreCase(method)) {httpPost = new HttpPatch(apiUrl);}else if ("delete".equalsIgnoreCase(method)) {httpPost = new HttpDelete(apiUrl);}else if ("get".equalsIgnoreCase(method)) {httpPost = new HttpGet(apiUrl);}else if ("post".equalsIgnoreCase(method)) {httpPost = new HttpPost(apiUrl);}}else {httpPost = new HttpPost(apiUrl);}CloseableHttpResponse response = null;try {// 设置header信息if (headerMap != null && !headerMap.isEmpty()) {for (Map.Entry<String, String> entry : headerMap.entrySet()) {httpPost.addHeader(entry.getKey(), entry.getValue());}}if (isSSL(apiUrl)) {httpPost.setConfig(requestConfig);}// 参数不为null、要处理参数if (params != null) {// get请求拼接在url后⾯if (httpPost instanceof HttpGet) {StringBuffer param = new StringBuffer();if (params instanceof Map) {Map<String, Object> paramsConvert = (Map<String, Object>) params;int i = 0;for (String key : paramsConvert.keySet()) {if (i == 0)param.append("?");elseparam.append("&");param.append(key).append("=").append(paramsConvert.get(key));i++;}}else {param.append("?" + params.toString());}apiUrl += param;}// delete请求暂不处理else if (!(httpPost instanceof HttpDelete)) {// K-V形式if (params instanceof Map) {Map<String, Object> paramsConvert = (Map<String, Object>) params;List<NameValuePair> pairList = new ArrayList<>(paramsConvert.size());for (Map.Entry<String, Object> entry : paramsConvert.entrySet()) {NameValuePair pair = new BasicNameValuePair(entry.getKey(),entry.getValue() == null ? "" : entry.getValue().toString());pairList.add(pair);}((HttpEntityEnclosingRequestBase) httpPost).setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));}// json格式else {StringEntity stringEntity = new StringEntity(params.toString(), "UTF-8");stringEntity.setContentEncoding("UTF-8");stringEntity.setContentType("application/json");((HttpEntityEnclosingRequestBase) httpPost).setEntity(stringEntity);}}}response = httpClient.execute(httpPost);// int statusCode = response.getStatusLine().getStatusCode();// if (statusCode != HttpStatus.SC_OK) {// return null;// }HttpEntity entity = response.getEntity();if (entity != null) {if (type == RTN_TYPE_1) {return (T) entity.getContent();}else if (RTN_TYPE_2 == type) {return (T) EntityUtils.toString(entity, "UTF-8");}else if (RTN_TYPE_3 == type || RTN_TYPE_4 == type) {Map<String, String> rtnMap = new HashMap<String, String>();rtnMap.put("result", EntityUtils.toString(entity, "UTF-8"));rtnMap.put("statusCode", response.getStatusLine().getStatusCode() + "");if (RTN_TYPE_4 == type) {rtnMap.put("cookie", getCookie(response));}return (T) rtnMap;}else {return (T) EntityUtils.toString(entity, "UTF-8");}}}catch (Exception e) {e.printStackTrace();}finally {if (response != null && type != RTN_TYPE_1) {try {EntityUtils.consume(response.getEntity());}catch (IOException e) {e.printStackTrace();}}}return null;}/*** 上传附件(post形式)** @param url* 请求地址* @param headerMap* header参数map Map<String, String>* @param paramMap* 额外的参数map,Map<String, String>* @param file* 可以选择本地⽂件上传;如果传了file,⼜传了fileName,那么⽂件名以fileName为准,否则是file的⽂件名 * @param fileName* 以流传输时,必须指定⽂件名* @param ssl* 是否需要ssl* @return result,返回上传结果,如果接⼝没有返回值,则为状态码*/public static String upload(String url, Map<String, String> headerMap, Map<String, String> paramMap, File file,String fileName, boolean ssl) {return upload(url, headerMap, paramMap, file, null, fileName, ssl);}/*** 上传附件(post形式)** @param url* 请求地址* @param headerMap* header参数map Map<String, String>* @param paramMap* 额外的参数map,Map<String, String>* @param in* ⽂件流* @param fileName* 以流传输时,必须指定⽂件名* @param ssl* 是否需要ssl* @return result,返回上传结果,如果接⼝没有返回值,则为状态码*/public static String upload(String url, Map<String, String> headerMap, Map<String, String> paramMap, InputStream in, String fileName, boolean ssl) {return upload(url, headerMap, paramMap, null, in, fileName, ssl);}/*** 上传附件(post形式)** @param httpClient* 外部传⼊httpClient* @param url* 请求地址* @param headerMap* header参数map Map<String, String>* @param paramMap* 额外的参数map,Map<String, String>* @param file* 可以选择本地⽂件上传;如果传了file,⼜传了fileName,那么⽂件名以fileName为准,否则是file的⽂件名* @param fileName* 以流传输时,必须指定⽂件名* @param ssl* 是否需要ssl* @return result,返回上传结果,如果接⼝没有返回值,则为状态码*/public static String upload(CloseableHttpClient httpClient, String url, Map<String, String> headerMap,Map<String, String> paramMap, File file, String fileName, boolean ssl) {return upload(httpClient, url, headerMap, paramMap, file, null, fileName, ssl);}/*** 上传附件(post形式)** @param httpClient* 外部传⼊httpClient* @param url* 请求地址* @param headerMap* header参数map Map<String, String>* @param paramMap* 额外的参数map,Map<String, String>* @param in* ⽂件流* @param fileName* 以流传输时,必须指定⽂件名* @param ssl* 是否需要ssl* @return result,返回上传结果,如果接⼝没有返回值,则为状态码*/public static String upload(CloseableHttpClient httpClient, String url, Map<String, String> headerMap,Map<String, String> paramMap, InputStream in, String fileName, boolean ssl) {return upload(httpClient, url, headerMap, paramMap, null, in, fileName, ssl);}/*** 上传附件(post形式)** @param url* 请求地址* @param headerMap* header参数map Map<String, String>* @param paramMap* 额外的参数map,Map<String, String>* @param file* 可以选择本地⽂件上传,file,in互斥;如果传了file,⼜传了fileName,那么⽂件名以fileName为准,否则* 是file的⽂件名* @param in* ⽂件流* @param fileName* 以流传输时,必须指定⽂件名* @param ssl* 是否需要ssl* @return result,返回上传结果,如果接⼝没有返回值,则为状态码*/private static String upload(String url, Map<String, String> headerMap, Map<String, String> paramMap, File file,InputStream in, String fileName, boolean ssl) {CloseableHttpClient httpClient = null;if (ssl) {httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();}else {httpClient = HttpClients.createDefault();}return upload(httpClient, url, headerMap, paramMap, file, in, fileName, ssl);}/*** 上传附件(post形式)** @param httpClient* 外部传⼊httpClient* @param url* 请求地址* @param headerMap* header参数map Map<String, String>* @param paramMap* 额外的参数map,Map<String, String>* @param file* 可以选择本地⽂件上传,file,in互斥;如果传了file,⼜传了fileName,那么⽂件名以fileName为准,否则* 是file的⽂件名* @param in* ⽂件流* @param fileName* 以流传输时,必须指定⽂件名* @param ssl* 是否需要ssl* @return result,返回上传结果,如果接⼝没有返回值,则为状态码*/private static String upload(CloseableHttpClient httpClient, String url, Map<String, String> headerMap,Map<String, String> paramMap, File file, InputStream in, String fileName, boolean ssl) {String result = "";CloseableHttpResponse response = null;try {HttpPost httpPost = new HttpPost(url);// 设置header信息if (headerMap != null && !headerMap.isEmpty()) {for (Map.Entry<String, String> entry : headerMap.entrySet()) {httpPost.addHeader(entry.getKey(), entry.getValue());}}if (ssl) {httpPost.setConfig(requestConfig);}MultipartEntityBuilder builder = MultipartEntityBuilder.create();// 选择以file形式上传if (file != null && file.exists()) {if (StringUtil.isNotBlank(fileName)) {builder.addBinaryBody(DEFAULT_BINARYBODY_KEYNAME, file, ContentType.DEFAULT_BINARY, fileName); }else {builder.addBinaryBody(DEFAULT_BINARYBODY_KEYNAME, file);}}// 以流上传else if (in != null && StringUtil.isNotBlank(fileName)) {builder.addBinaryBody(DEFAULT_BINARYBODY_KEYNAME, in, ContentType.DEFAULT_BINARY, fileName);}if (paramMap != null && !paramMap.isEmpty()) {for (Map.Entry<String, String> entry : paramMap.entrySet()) {builder.addPart(entry.getKey(), new StringBody(entry.getValue(), ContentType.TEXT_PLAIN));}}HttpEntity reqEntity = builder.build();httpPost.setEntity(reqEntity);response = httpClient.execute(httpPost);HttpEntity entity = response.getEntity();if (entity != null) {result = EntityUtils.toString(entity, "UTF-8");}else {result = response.getStatusLine().getStatusCode() + "";}}catch (Exception e) {e.printStackTrace();}finally {if (response != null) {try {EntityUtils.consume(response.getEntity());}catch (IOException e) {e.printStackTrace();}}}return result;}private static String getCookie(HttpResponse httpResponse) {Map<String, String> cookieMap = new HashMap<String, String>(64);Header headers[] = httpResponse.getHeaders("Set-Cookie");if (headers == null || headers.length == 0) {return null;}String cookie = "";for (int i = 0; i < headers.length; i++) {cookie += headers[i].getValue();if (i != headers.length - 1) {cookie += ";";}}String cookies[] = cookie.split(";");for (String c : cookies) {c = c.trim();if (cookieMap.containsKey(c.split("=")[0])) {cookieMap.remove(c.split("=")[0]);}cookieMap.put(c.split("=")[0],c.split("=").length == 1 ? "" : (c.split("=").length == 2 ? c.split("=")[1] : c.split("=", 2)[1]));}String cookiesTmp = "";for (String key : cookieMap.keySet()) {cookiesTmp += key + "=" + cookieMap.get(key) + ";";}return cookiesTmp.substring(0, cookiesTmp.length() - 2);}/*** 创建SSL安全连接** @return*/public static SSLConnectionSocketFactory createSSLConnSocketFactory() {SSLConnectionSocketFactory sslsf = null;try {SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy(){public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true;}}).build();sslsf = new SSLConnectionSocketFactory(sslContext, new HostnameVerifier(){@Overridepublic boolean verify(String arg0, SSLSession arg1) {return true;}});}catch (GeneralSecurityException e) {e.printStackTrace();}return sslsf;}public static PoolingHttpClientConnectionManager getConnMgr() {return connMgr;}public static RequestConfig getRequestConfig() {return requestConfig;}private static boolean isSSL(String apiUrl) {if (apiUrl.indexOf("https") != -1 ) {return true;}else {return false;}}}以上就是Java 发送http请求(get、post)的⽰例的详细内容,更多关于Java 发送http请求的资料请关注其它相关⽂章!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用JAVA实现http通信详解
Http通信概述
Http通信主要有两种方式POST方式和GET方式。

前者通过Http消息实体发送数据给服务器,安全性高,数据传输大小没有限制,后者通过URL的查询字符串传递给服务器参数,以明文显示在浏览器地址栏,保密性差,最多传输2048个字符。

但是GET请求并不是一无是处——GET请求大多用于查询(读取资源),效率高。

POST请求用于注册、登录等安全性较高且向数据库中写入数据的操作。

除了POST和GET,http通信还有其他方式!请参见http请求的方法
Java爱好者学习裙:4229+124最后是89
编码前的准备
在进行编码之前,我们先创建一个Servlet,该Servlet接收客户端的参数(name和age),并响应客户端。

使用JDK实现http通信
使用URLConnection实现GET请求
实例化一个.URL对象;
通过URL对象的openConnection()方法得到一个.URLConnection;
通过URLConnection对象的getInputStream()方法获得输入流;
读取输入流;
关闭资源。

使用HttpURLConnection实现POST请求
.HttpURLConnection是.URL的子类,提供了更多的关于http的操作(getXXX 和setXXX方法)。

该类中定义了一系列的HTTP状态码:
使用httpclient进行http通信
httpclient大大简化了JDK中http通信的实现。

maven依赖:
GET请求
POST请求
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。

HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目
Cactus和HTMLUnit都使用了HttpClient。

相关文档
最新文档