JavaEE05 HTTP响应处理编程

合集下载

JAVA基础之HttpServletResponse响应

JAVA基础之HttpServletResponse响应

JAVA基础之HttpServletResponse响应 ⽤户在客户端输⼊⽹址(虚拟路径)时,开始发送⼀个HTTP请求(请求⾏、请求头、请求体)⾄服务器。

服务器内的Tomcat引擎会解析请求的地址,去找XML⽂件,然后根据虚拟路径找Servlet的真实路径,真实的Servlet会将请求的信息封装成request(请求)对象,然后再创建⼀个response(响应)对象,(此时的response内是空的)同时创建servlet对象,并调⽤service⽅法(或doGet和doPost⽅法)。

这样就是把两个对象传给了服务器内的某个servlet的service⽅法,通过这个⽅法,我们可以获得request的所有的信息,并且向response内设置信息。

response.getwriter().write()将内容写到response的缓冲区,这样service⽅法结束了,⽅法返回后,tomcat引擎会将从该response缓冲区中获取的设置信息封装成⼀个HTTP响应(响应⾏、响应头、响应体),发送给客户端。

客户端解析响应回来的东西继⽽进⾏显⽰。

我们可以通过设置修改响应的信息进⾏相应的重定向(⽤户访问的⽹页不存在并跳转到其他⽹页上)、修改响应⽂本(需要修改浏览器和服务器两边的编码,并且还得处理兼容问题)。

⼀、概述: 我们在创建Servlet时会覆盖service()⽅法,或doGet()/doPost(),这些⽅法都有两个参数,⼀个为代表请求的request和代表响应response。

service⽅法中的response的类型是ServletResponse,⽽doGet/doPost⽅法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的⼦接⼝,功能和⽅法更加强⼤⼆、运⾏流程:三、内容:响应⾏、响应头、响应体;四、通过response 设置响应⾏: 设置响应⾏的状态码:setStatus( int sc)五、通过response 设置响应头: setHeader(String name,String value) 设置public class RefreshServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置定时刷新的头response.setHeader("refresh","5;url=https://");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script type="text/javascript">window.onload=function(){//获取span元素var second=document.getElementById("second");//定义秒数var time =5;//设置定时器var timer=setInterval(function(){second.innerHTML=time;time--;if(time < 0){clearInterval(timer);location.href="https://";}},1000);}</script></head><body>恭喜您,注册成功!<span id="second" style="color:red">5</span>秒后跳转,如没跳转,请点击<a href="https://">这⾥</a></body></html>1、重定向:(请求服务器两次,地址栏变化)①、状态码:302;②、响应头:location 代表重定向地址;public class Servlet01 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*// 设置响应状态码response.setStatus(302);//设置响应头中的Locationresponse.setHeader("Location","/WEB0/Servlet02");*///重定向response.sendRedirect("/WEB0/Servlet02");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}public class Servlet02 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().write("Servlet02");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}六、通过response 设置响应体:1、响应体设置⽂本:PrintWriter getWriter() 获得字符流,通过字符流的write(String s)⽅法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

Java中实现Http请求并获取响应数据

Java中实现Http请求并获取响应数据

Java中实现Http请求并获取响应数据⽬录前⾔接⼝说明:获取指定年份或年⽉份的所有节假⽇信息。

默认返回当前年份的所有信息。

跳转链接:以上功能代码仅在使⽤GET请求⽅式时测试通过,POST等其他请求时请⾃⾏尝试。

因未设置请求头时也成功获取了响应数据,所以未在演⽰代码中添加请求头信息,请求失败时可⾃⾏添加请求头信息后重试⽅式⼀:功能实现类.HttpURLConnection请求实现代码:package com.zhiyin.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import .HttpURLConnection;import .URL;public class MyTest {public static void main(String[] args) {test();}// HttpURLConnection⽅式public static void test() {String SUBMIT_METHOD_GET = "GET"; // ⼀定要是⼤写,否则请求⽆效String urlStr = "http://timor.tech/api/holiday/year/"; // 请求http地址String param = "2020"; // 请求参数HttpURLConnection connection = null;InputStream is = null;BufferedReader br = null;String result = null; // 返回结果字符串try {// 创建远程url连接对象URL url = new URL(urlStr);// 通过远程url连接对象打开⼀个连接,强转成httpURLConnection类connection = (HttpURLConnection) url.openConnection();// 设置连接⽅式:GETconnection.setRequestMethod(SUBMIT_METHOD_GET);// 设置连接主机服务器的超时时间:15000毫秒connection.setConnectTimeout(15000);// 设置读取远程返回的数据时间:60000毫秒connection.setReadTimeout(60000);// 发送请求connection.connect();// 通过connection连接,请求成功后获取输⼊流if (connection.getResponseCode() == 200) {is = connection.getInputStream();// 封装输⼊流is,并指定字符集br = new BufferedReader(new InputStreamReader(is, "UTF-8"));// 存放数据StringBuffer sbf = new StringBuffer();String temp = null;while ((temp = br.readLine()) != null) {sbf.append(temp);}result = sbf.toString();}} catch (IOException e) {e.printStackTrace();} finally {// 释放资源if (null != br) {try {br.close();} catch (IOException e) {e.printStackTrace();}}if (null != is) {try {is.close();} catch (IOException e) {e.printStackTrace();}}connection.disconnect(); // 关闭远程连接}System.out.println("Successfully:" + result);}}⽅式⼆:功能实现类org.apache.http.client.methods.HttpGet maven项⽬中pom.xml⽂件⾥引⼊依赖:<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version></dependency>请求实现代码:package com.zhiyin.test;import org.apache.http.HttpEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import java.io.InputStream;public class MyTest {public static void main(String[] args) {test();}// HttpGet⽅式public static void test() {try {String urlStr = "http://timor.tech/api/holiday/year/"; // 请求http地址String param = "2020"; // 请求参数// 模拟(创建)⼀个浏览器⽤户CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet(urlStr + param);// httpclient进⾏连接CloseableHttpResponse response = client.execute(httpGet); // 获取内容HttpEntity entity = response.getEntity();// 将内容转化成IO流InputStream content = entity.getContent();// 输⼊流转换成字符串byte[] byteArr = new byte[content.available()];content.read(byteArr); // 将输⼊流写⼊到字节数组中String result = new String(byteArr);System.out.println("Successfully:" + result);} catch (Exception e) {e.printStackTrace();}}}。

Java Web_第3章使用Servlet处理Http响应

Java Web_第3章使用Servlet处理Http响应
PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>”);
调用print()、println()或 write()方法
何时设置状态码
注意:在使用PrintWriter向客户端输出信息之前,设置状态码
设置状态码
使用HttpServletResponse的setStatus()方法 setStatus方法的参数是一个整数 使用HttpServletResponse中的常量
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //使用 使用response.setStatus()进行重定向 使用 进行重定向 response.setStatus(response.SC_MOVED_TEMPORARILY); response.addHeader("location", "dynamicimage"); }
设置响应状态行
状态行分为HTTP协议版本、状态码和状态描述三个部分 HTTP/1.1 200 OK HTTP状态码: 状态描述与状态码直接相关 100-199:表示信息性代码,标示客户端应该采取 的其他动作,请求正在进行。 HTTP响应内容由服务器确定 200-299:表示客户请求成功。 300-399:表示用于已经移走的资源文件,指示新 利用状态码可以把用户重定向 的地址。 到另一个网站,可以指示附加 400-499:表示由客户端引发的错误。 的文档是图片、PDF或 HTML…… 500-599:表示由服务器端引发的错误。

JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码

JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码

JAVA发送HTTP请求,返回HTTP响应内容,应⽤及实例代码JDK 中提供了⼀些对⽆状态协议请求(HTTP )的⽀持,下⾯我就将我所写的⼀个⼩例⼦(组件)进⾏描述:⾸先让我们先构建⼀个请求类(HttpRequester )。

该类封装了 JAVA 实现简单请求的代码,如下:复制代码代码如下:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import .HttpURLConnection;import .URL;import java.nio.charset.Charset;import java.util.Map;import java.util.Vector;/*** HTTP请求对象** @author YYmmiinngg*/public class HttpRequester {private String defaultContentEncoding;public HttpRequester() {this.defaultContentEncoding = Charset.defaultCharset().name();}/*** 发送GET请求** @param urlString* URL地址* @return 响应对象* @throws IOException*/public HttpRespons sendGet(String urlString) throws IOException {return this.send(urlString, "GET", null, null);}/*** 发送GET请求** @param urlString* URL地址* @param params* 参数集合* @return 响应对象* @throws IOException*/public HttpRespons sendGet(String urlString, Map<String, String> params)throws IOException {return this.send(urlString, "GET", params, null);}/*** 发送GET请求** @param urlString* URL地址* @param params* 参数集合* @param propertys* 请求属性* @return 响应对象* @throws IOException*/public HttpRespons sendGet(String urlString, Map<String, String> params, Map<String, String> propertys) throws IOException {return this.send(urlString, "GET", params, propertys);}/*** 发送POST请求** @param urlString* URL地址* @return 响应对象* @throws IOException*/public HttpRespons sendPost(String urlString) throws IOException {return this.send(urlString, "POST", null, null);}/*** 发送POST请求** @param urlString* URL地址* @param params* 参数集合* @return 响应对象* @throws IOException*/public HttpRespons sendPost(String urlString, Map<String, String> params) throws IOException {return this.send(urlString, "POST", params, null);}/*** 发送POST请求** @param urlString* URL地址* @param params* 参数集合* @param propertys* 请求属性* @return 响应对象* @throws IOException*/public HttpRespons sendPost(String urlString, Map<String, String> params, Map<String, String> propertys) throws IOException {return this.send(urlString, "POST", params, propertys);}/*** 发送HTTP请求** @param urlString* @return 响映对象* @throws IOException*/private HttpRespons send(String urlString, String method,Map<String, String> parameters, Map<String, String> propertys)throws IOException {HttpURLConnection urlConnection = null;if (method.equalsIgnoreCase("GET") && parameters != null) {StringBuffer param = new StringBuffer();int i = 0;for (String key : parameters.keySet()) {if (i == 0)param.append("?");elseparam.append("&");param.append(key).append("=").append(parameters.get(key)); i++;}urlString += param;}URL url = new URL(urlString);urlConnection = (HttpURLConnection) url.openConnection();urlConnection.setRequestMethod(method);urlConnection.setDoOutput(true);urlConnection.setDoInput(true);urlConnection.setUseCaches(false);if (propertys != null)for (String key : propertys.keySet()) {urlConnection.addRequestProperty(key, propertys.get(key));}if (method.equalsIgnoreCase("POST") && parameters != null) {StringBuffer param = new StringBuffer();for (String key : parameters.keySet()) {param.append("&");param.append(key).append("=").append(parameters.get(key)); }urlConnection.getOutputStream().write(param.toString().getBytes()); urlConnection.getOutputStream().flush();urlConnection.getOutputStream().close();}return this.makeContent(urlString, urlConnection);}/*** 得到响应对象** @param urlConnection* @return 响应对象* @throws IOException*/private HttpRespons makeContent(String urlString,HttpURLConnection urlConnection) throws IOException {HttpRespons httpResponser = new HttpRespons();try {InputStream in = urlConnection.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));httpResponser.contentCollection = new Vector<String>();StringBuffer temp = new StringBuffer();String line = bufferedReader.readLine();while (line != null) {httpResponser.contentCollection.add(line);temp.append(line).append("\r\n");line = bufferedReader.readLine();}bufferedReader.close();String ecod = urlConnection.getContentEncoding();if (ecod == null)ecod = this.defaultContentEncoding;httpResponser.urlString = urlString;httpResponser.defaultPort = urlConnection.getURL().getDefaultPort();httpResponser.file = urlConnection.getURL().getFile();httpResponser.host = urlConnection.getURL().getHost();httpResponser.path = urlConnection.getURL().getPath();httpResponser.port = urlConnection.getURL().getPort();httpResponser.protocol = urlConnection.getURL().getProtocol();httpResponser.query = urlConnection.getURL().getQuery();httpResponser.ref = urlConnection.getURL().getRef();erInfo = urlConnection.getURL().getUserInfo();httpResponser.content = new String(temp.toString().getBytes(), ecod);httpResponser.contentEncoding = ecod;httpResponser.code = urlConnection.getResponseCode();httpResponser.message = urlConnection.getResponseMessage();httpResponser.contentType = urlConnection.getContentType();httpResponser.method = urlConnection.getRequestMethod();httpResponser.connectTimeout = urlConnection.getConnectTimeout();httpResponser.readTimeout = urlConnection.getReadTimeout();return httpResponser;} catch (IOException e) {throw e;} finally {if (urlConnection != null)urlConnection.disconnect();}}/*** 默认的响应字符集*/public String getDefaultContentEncoding() {return this.defaultContentEncoding;}/*** 设置默认的响应字符集*/public void setDefaultContentEncoding(String defaultContentEncoding) {this.defaultContentEncoding = defaultContentEncoding;}}其次我们来看看响应对象(HttpRespons )。

HTTP头部详解及使用Java套接字处理HTTP请求

HTTP头部详解及使用Java套接字处理HTTP请求

HTTP头部详解及使用Java套接字处理HTTP请求进行Web开发关键是要了解超文本传输协议(HTTP),该协议用来传输网页图像以及因特网上在浏览器与服务器间传输的其他类型文件只要你在浏览器上输入一个URL,最前面的http://就表示使用HTTP来访问指定位置的信息(大部分浏览器还支持其他一些不同的协议,其中FTP就是一个典型例子)本文从HTTP协议的结构上初步探讨HTTP协议的工作原理和请求响应格式,并最后通过一个使用Java编写的小HTTP服务器验证了如何处理和响应HTTP请求HTTP由两部分组成:请求和响应当你在Web浏览器中输入一个URL时,浏览器将根据你的要求创建并发送请求,该请求包含所输入的URL以及一些与浏览器本身相关的信息当服务器收到这个请求时将返回一个响应,该响应包括与该请求相关的信息以及位于指定URL(如果有的话)的数据直到浏览器解析该响应并显示出网页(或其他资源)为止HTTP请求HTTP请求的格式如下所示:<request-line><headers><blank line>[<request-body>]在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型要访问的资源以及使用的HTTP版本紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]在HTTP中,定义了大量的请求类型,不过Ajax开发人员关心的只有GET请求和POST请求只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源对于 的GET请求如下所示:GET / HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)Gecko/20050225 Firefox/1.0.1Connection: Keep-Alive请求行的第一部分说明了该请求是GET请求该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录该行的最后一部分说明使用的是HTTP 1.1版本(另一个可选项是1.0)那么请求发到哪里去呢?这就是第二行的内容第2行是请求的第一个首部,HOST首部HOST将指出请求的目的地结合HOST 和上一行中的斜杠(/),可以通知服务器请求的是/(HTTP 1.1才需要使用首部HOST,而原来的1.0版本则不需要使用)第三行中包含的是首部User-Agent,服务器端和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础该信息由你使用的浏览器来定义(在本例中是Firefox 1.0.1),并且在每个请求中将自动发送最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他值,但这已经超出了本书讨论的范围)注意,在最后一个首部之后有一个空行即使不存在请求主体,这个空行也是必需的如果要获取一个诸如/books的域内的页面,那么该请求可能类似于:GET /books/ HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)Gecko/20050225 Firefox/1.0.1Connection: Keep-Alive注意只有第一行的内容发生了变化,它只包含URL中后面的部分要发送GET请求的参数,则必须将这些额外的信息附在URL本身的后面其格式类似于:URL ? name1=value1&name2=value2&..&nameN=valueN该信息称之为查询字符串(query string),它将会复制在HTTP请求的请求行中,如下所示:GET /books/?name=Professional%20Ajax HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1Connection: Keep-Alive注意,为了将文本Professional Ajax作为URL的参数,需要编码处理其内容,将空格替换成%20,这称为URL编码(URL encoding),常用于HTTP的许多地方(JavaScript提供了内建的函数来处理URL编码和解码,这些将在本章中的后续部分中说明)名称值(namevalue)对用 & 隔开绝大部分的服务器端技术能够自动对请求主体进行解码,并为这些值的访问提供一些逻辑方式当然,如何使用这些数据还是由服务器决定的浏览器发送的首部,通常比本文中所讨论的要多得多为了简单起见,这里的例子尽可能简短另一方面,POST请求在请求主体中为服务器提供了一些附加的信息通常,当填写一个在线表单并提交它时,这些填入的数据将以POST请求的方式发送给服务器以下就是一个典型的POST请求:POST / HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1Content-Type: application/x-www-form-urlencodedContent-Length: 40Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley从上面可以发现, POST请求和GET请求之间有一些区别首先,请求行开始处的GET改为了POST,以表示不同的请求类型你会发现首部Host和User-Agent 仍然存在,在后面有两个新行其中首部Content-Type说明了请求主体的内容是如何编码的浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型首部Content-Length说明了请求主体的字节数在首部 Connection后是一个空行,再后面就是请求主体与大多数浏览器的POST请求一样,这是以简单的名称值对的形式给出的,其中name是Professional Ajax,publisher是Wiley你可以以同样的格式来组织URL的查询字符串参数正如前面所提到的,还有其他的HTTP请求类型,它们遵从的基本格式与GET 请求和POST请求相同下一步我们来看看服务器将对HTTP请求发送什么响应HTTP响应如下所示,HTTP响应的格式与请求的格式十分类似:<status-line><headers><blank line>[<response-body>]正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息状态行(status line)通过提供一个状态码来说明所请求的资源情况以下就是一个HTTP响应的例子:HTTP/1.1 200 OKDate: Sat, 31 Dec 2005 23:59:59 GMTContent-Type: text/html;charset=ISO-8859-1Content-Length: 122<html><head><title>Wrox Homepage</title></head><body><!-- body goes here --></body></html>在本例中,状态行给出的HTTP状态代码是200,以及消息OK状态行始终包含的是状态码和相应的简短消息,以避免混乱最常用的状态码有:200 (OK): 找到了该资源,并且一切正常304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改这通常用于浏览器的缓存机制401 (UNAUTHORIZED):客户端无权访问该资源这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器403 (FORBIDDEN):客户端未能获得授权这通常是在401之后输入了不正确的用户名或密码404 (NOT FOUND):在指定的位置不存在所申请的资源在状态行之后是一些首部通常,服务器会返回一个名为Data的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)接下来的两个首部大家应该熟悉,就是与POST请求中一样的Content-Type和Content-Length在本例中,首部 Content-Type指定了MIME 类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)响应主体所包含的就是所请求资源的HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)浏览器将把这些数据显示给用户注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据Java代码1./** *//**2. * SimpleHttpServer.java3. */4.5.import java.io.*;6.import .*;7.import java.util.StringTokenizer;8.9./** *//**10. * 一个简单的用 Java Socket 编写的 HTTP 服务器应用, 演示了请求和应答的协议通信内容以及11. * 给客户端返回 HTML 文本和二进制数据文件(一个图片), 同时展示了 404, 200 等状态码.12. * 首先运行这个程序,然后打开Web浏览器,键入http://localhost,则这个程序能够显示出浏览器发送了那些信息13. * 并且向浏览器返回一个网页和一副图片, 并测试同浏览器对话.14. * 当浏览器看到 HTML 中带有图片地址时, 则会发出第二次连接来请求图片等资源.15. * 这个例子可以帮您理解 Java 的 HTTP 服务器软件是基于 J2SE 的 Socket 等软件编写的概念, 并熟悉16. * HTTP 协议.17. * 相反的用 Telnet 连接到已有的服务器则可以帮忙理解浏览器的运行过程和服务器端的返回内容.18. *19. * <pre>20. * 当用户在Web浏览器地址栏中输入一个带有http://前缀的URL并按下Enter后,或者在Web页面中某个以http://开头的超链接上单击鼠标,HTTP事务处理的第一个阶段--建立连接阶段就开始了.HTTP的默认端口是80.21. * 随着连接的建立,HTTP就进入了客户向服务器发送请求的阶段.客户向服务器发送的请求是一个有特定格式的ASCII消息,其语法规则为:22. * < Method > < URL > < HTTP Version > < >23. * { <Header>:<Value> < >}*24. * < >25. * { Entity Body }26. * 请求消息的顶端是请求行,用于指定方法,URL和HTTP协议的版本,请求行的最后是回车换行.方法有GET,POST,HEAD,PUT,DELETE等. 27. * 在请求行之后是若干个报头(Header)行.每个报头行都是由一个报头和一个取值构成的二元对,报头和取值之间以":"分隔;报头行的最后是回车换行.常见的报头有Accept(指定MIME媒体类型),Accept_Charset(响应消息的编码方式),Accept_Encoding(响应消息的字符集),User_Agent(用户的浏览器信息)等.28. * 在请求消息的报头行之后是一个回车换行,表明请求消息的报头部分结束.在这个之后是请求消息的消息实体(Entity Body).具体的例子参看httpRequest.txt.29. * Web服务器在收到客户请求并作出处理之后,要向客户发送应答消息.与请求消息一样,应答消息的语法规则为:30. * < HTTP Version> <Status Code> [<Message>]< >31. * { <Header>:<Value> < > } *32. * < >33. * { Entity Body }34. * 应答消息的第一行为状态行,其中包括了HTTP版本号,状态码和对状态码进行简短解释的消息;状态行的最后是回车换行.状态码由3位数字组成,有5类:35. * 参看:HTTP应答码及其意义36. *37. * 1XX 保留38. * 2XX 表示成功39. * 3XX 表示URL已经被移走40. * 4XX 表示客户错误41. * 5XX 表示服务器错误42. * 例如:415,表示不支持改媒体类型;503,表示服务器不能访问.最常见的是200,表示成功.常见的报头有:Last_Modified(最后修改时间),Content_Type(消息内容的MIME类型),Content_Length(内容长度)等.43. * 在报头行之后也是一个回车换行,用以表示应答消息的报头部分的结束,以及应答消息实体的开始.44. * 下面是一个应答消息的例子:45. * HTTP/1.0 200 OK46. * Date: Moday,07-Apr-97 21:13:02 GMT47. * Server:NCSA/1.148. * MIME_Version:1.049. * Content_Type:text/html50. * Last_Modified:Thu Dec 5 09:28:01 199651. * Coentent_Length:310752. *53. * <HTML><HEAD><TITLE></HTML>54. *55. * 在用Java语言实现HTTP服务器时,首先启动一个.ServerSocket在提供服务的端口上监听连接.向客户返回文本时,可以用 PrintWriter,但是如果返回二进制数据,则必须使用OutputStream.write(byte[])方法,返回的应答消息字符串可以使用 String.getBytes()方法转换为字节数组返回,或者使用PrintStream 的print()方法写入文本,用 write(byte[])方法写入二进制数据.56. *57. * </pre>58. * @author 刘长炯59. * @version 1.0 2007-07-24 Sunday60. */61.public class SimpleHttpServer implements Runnable ...{62. /** *//**63. *64. */65. ServerSocket serverSocket;//服务器Socket66.67. /** *//**68. * 服务器监听端口, 默认为 80.69. */70. public static int PORT=80;//标准HTTP端口71.72. /** *//**73. * 开始服务器 Socket 线程.74. */75. public SimpleHttpServer() ...{76. try ...{77. serverSocket=new ServerSocket(PORT);78. } catch(Exception e) ...{79. System.out.println("无法启动HTTP服务器:"+e.getLocalizedMessage());80. }81. if(serverSocket==null) System.exit(1);//无法开始服务器82. new Thread(this).start();83. System.out.println("HTTP服务器正在运行,端口:"+PORT);84. }85.86. /** *//**87. * 运行服务器主线程, 监听客户端请求并返回响应.88. */89. public void run() ...{90. while(true) ...{91. try ...{92. Socket client=null;//客户Socket93. client=serverSocket.accept();//客户机(这里是 IE 等浏览器)已经连接到当前服务器94. if(client!=null) ...{95. System.out.println("连接到服务器的用户:"+client);96. try ...{97. // 第一阶段: 打开输入流98. BufferedReader in=new BufferedReader(new InputStreamReader(99. client.getInputStream())); 100.101. System.out.println("客户端发送的请求信息: ***************");102. // 读取第一行, 请求地址103. String line=in.readLine(); 104. System.out.println(line); 105. String resource=line.substring(line.indexOf('/'),stIndexOf('/')-5);106. //获得请求的资源的地址107. resource=URLDecoder.decode(resourc e, "UTF-8");//反编码 URL 地址108. String method = new StringTokenize r(line).nextElement().toString();// 获取请求方法, GET 或者 POST109.110. // 读取所有浏览器发送过来的请求参数头部信息111. while( (line = in.readLine()) != n ull) ...{112. System.out.println(line); 113.114. if(line.equals("")) break; 115. }116.117. // 显示 POST 表单提交的内容, 这个内容位于请求的主体部分118. if("POST".equalsIgnoreCase(method) ) ...{119. System.out.println(in.readLine ());120. }121.122. System.out.println("请求信息结束 ***************");123. System.out.println("用户请求的资源是:"+resource);124. System.out.println("请求的类型是: " + method);125.126. // GIF 图片就读取一个真实的图片数据并返回给客户端127. if(resource.endsWith(".gif")) ...{128. fileService("images/test.gif", client);129. closeSocket(client);130. continue;131. }132.133. // 请求 JPG 格式就报错 404 134. if(resource.endsWith(".jpg")) ...{135. PrintW riter out=new PrintWriter(client.getOutputStream(),true); 136. out.println("HTTP/1.0 404 Not foun d");//返回应答消息,并结束应答137. out.println();// 根据 HTTP 协议, 空行将结束头信息138. out.close();139. closeSocket(client);140. continue;141. } else ...{142. // 用 writer 对客户端 socket 输出一段 HTML 代码143. PrintWriter out=new PrintWrite r(client.getOutputStream(),true);144. out.println("HTTP/1.0 200 OK") ;//返回应答消息,并结束应答145. out.println("Content-Type:text /html;charset=GBK");146. out.println();// 根据 HTTP 协议, 空行将结束头信息147.148. out.println("<h1> Hello Http S erver</h1>");149. out.println("你好, 这是一个 Java HTTP 服务器 demo 应用.<br>");150. out.println("您请求的路径是: " + resource + "<br>");151. out.println("这是一个支持虚拟路径的图片:<img src='abc.gif'><br>" +152. "<a href='abc.gif'>点击打开abc.gif, 是个服务器虚拟路径的图片文件.</a>");153. out.println("<br>这是个会反馈 404 错误的的图片:<img src='test.jpg'><br><a href='test.jpg'>点击打开test.jpg</a><br>");154. out.println("<form method=post action='/'& gt;POST 表单 <input name=username value='用户'> < input name=submit type=submit value=submit></form>"); 155. out.close();156.157. closeSocket(client);158. }159. } catch(Exception e) ...{160. System.out.println("HTTP服务器错误:"+e.getLocalizedMessage());161. }162. }163. //System.out.println(client+"连接到HTTP服务器");//如果加入这一句,服务器响应速度会很慢164. } catch(Exception e) ...{165. System.out.println("HTTP服务器错误:"+e.getLocalizedMessage());166. }167. }168. }169.170. /** *//**171. * 关闭客户端 socket 并打印一条调试信息.172. * @param socket 客户端 socket.173. */174. void closeSocket(Socket socket) ...{175. try ...{176. socket.close();177. } catch (IOException ex) ...{178. ex.printStackTrace();179. }180. System.out.println(socket + "离开了HTTP服务器");181. }182.183. /** *//**184. * 读取一个文件的内容并返回给浏览器端.185. * @param fileName 文件名186. * @param socket 客户端 socket.187. */188. void fileService(String fileName, Socket socket)189. ...{190.191. try192. ...{193. PrintStream out = new PrintStream(socket.getOu tputStream(), true);194. File fileToSend = new File(fileName); 195. if(fileToSend.exists() && !fileToSend.isDirect ory())196. ...{197. out.println("HTTP/1.0 200 OK");//返回应答消息,并结束应答198. out.println("Content-Type:application/bina ry");199. out.println("Content-Length:" + fileToSend .length());// 返回内容字节数200. out.println();// 根据 HTTP 协议, 空行将结束头信息201.202. FileInputStream fis = new FileInputStream( fileToSend);203. byte data[] = new byte[fis.available()];204. fis.read(data);205. out.write(data);206. out.close();207. fis.close();208. }209. }210. catch(Exception e)211. ...{212. System.out.println("传送文件时出错:" + e.getLocalizedMessage());213. }214. }215.216. /** *//**217. * 打印用途说明.218. */219. private static void usage() ...{220. System.out.println("Usage: java HTTPServer <port> Default port is 80.");221. }222.223.224. /** *//**225. * 启动简易 HTTP 服务器226. * @param args227. */228. public static void main(String[] args) ...{229. try ...{230. if(args.length != 1) ...{231. usage();232. } else if(args.length == 1) ...{233. PORT = Integer.parseInt(args[0]); 234. }235. } catch (Exception ex) ...{236. System.err.println("Invalid port arguments. It must be a integer that greater than 0");237. }238.239. new SimpleHttpServer();240. }241.242.}。

解决Java处理HTTP请求超时的问题

解决Java处理HTTP请求超时的问题

解决Java处理HTTP请求超时的问题在发送POST或GET请求时,返回超时异常处理办法:捕获 SocketTimeoutException | ConnectTimeoutException | ConnectionPoolTimeout 异常三种异常说明:SocketTimeoutException:是Java包下抛出的异常,这定义了Socket读数据的超时时间,即从server获取响应数据须要等待的时间;当读取或者接收Socket超时会抛出SocketTimeoutException。

ConnectTimeoutException:是Apache的HttpClient包抛出的超时异常,定义了通过⽹络与server建⽴连接的超时时间,Httpclient 包中通过⼀个异步线程去创建与server的socket连接,这就是该socket连接的超时时;当连接HTTPserver或者等待HttpConnectionManager管理的⼀个有效连接超时出错会抛出ConnectionTimeoutException。

ConnectionPoolTimeout:也是Apache的HttpClient包抛出的超时异常,定义了从 ConnectionManager 管理的连接池中取出连接的超时时间;出错会抛出 ConnectionPoolTimeoutException。

总结:SocketTimeoutException异常是⼀个通⽤的异常,⽆论是⽤原⽣的HTTP请求,还是⽤Apache下的HttpClient包,在抛出的异常中都需要捕获 SocketTimeoutException 异常。

例:public static String doGet(String url, Object params, String contentType) {try {return HttpUtils.doGetSend(url, params, contentType);} catch (SocketTimeoutException | ConnectTimeoutException e) {e.printStackTrace();System.out.println("请求连接超时:" + e.getMessage());} catch (IOException e) {e.printStackTrace();System.out.println("请求异常,异常信息:" + e.getMessage());} catch (Exception e) {e.printStackTrace();}return null;}补充:java 发送http请求(连接超时处理)业务背景:某项⽬跟第三⽅公司对接。

前端开发中常见的HTTP请求处理

前端开发中常见的HTTP请求处理

前端开发中常见的HTTP请求处理在前端开发中,处理HTTP请求是非常常见的任务。

无论是从服务器获取数据、提交表单数据或者进行其他各种交互,HTTP请求处理都是不可或缺的一环。

在本文中,我们将讨论一些常见的HTTP请求处理方式,帮助前端开发者更好地处理各种情况。

1. AJAX请求AJAX(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下,通过异步请求数据的技术。

通过使用XMLHttpRequest对象或者更现代化的fetch API,前端开发者可以向服务器发送HTTP请求,并在获取到响应后更新页面的部分内容。

AJAX请求可以是GET请求或者POST请求,可以携带各种参数和头部信息。

开发者可以注册请求的回调函数,在获取到响应后进行处理。

2. REST API请求在现代的Web开发中,使用RESTful API进行数据交互已经成为一种非常常见的方式。

REST(Representational State Transfer)是一种软件架构风格,通过使用HTTP协议进行通信,实现了不同客户端和服务器之间的解耦。

前端开发者通过发送HTTP请求,使用不同的HTTP方法(如GET、POST、PUT、DELETE等)来对资源进行操作。

比如,可以使用GET请求获取资源,使用POST请求创建资源,使用PUT请求更新资源,使用DELETE请求删除资源等。

REST API请求通常返回JSON格式的数据,前端开发者可以解析并使用这些数据。

3. 表单提交表单提交是另一种常见的HTTP请求处理方式。

当用户填写表单并点击提交按钮时,浏览器会自动发送一个HTTP请求到服务器。

在前端开发中,可以通过使用HTML的form元素配合不同的HTTP方法来实现表单提交,如GET、POST、PUT 等。

在表单提交时,可以通过JavaScript代码捕获表单的提交事件,进行一些额外的处理。

比如,可以使用JavaScript代码对表单数据进行验证,再将表单数据以合适的方式发送到服务器进行处理。

第01章 Java EE 5.0 概述

第01章 Java EE 5.0 概述

六、 统一资源定位器(URL) Internet的信息资源可能是用户磁盘中的一个文件, 也可能是地球的另一边某个连接在Internet上的计算 机的文件。 连接在Internet上的服务器数以亿计,同一个服务器 上可能还具有多种服务,如何定位Internet上的服务 器以及它的某种服务呢?解决这个问题的办法是使 用URL(Uniform Resource Locator,统一资源定位 符)
1.1 Internet基础知识
2. IP地址的表示法 IPv4地址是一个32位的二进制编码,其标准写法是4个 十进制数,即将32位的IP地址按8位一组分成4组,每组数值 用十进制数表示,每组的范围为0~255,组与组之间用小数 点分隔,称为点分十进制表示法。例如:202.117.64.5。 目前正处于试运行阶段的IPv6地址具有128位的二进制 编码,其表示法是用冒号分隔的十六进制。例如: 3FFE:0B00:0000:0000:0000:1234:AB26:0003,也可用压缩 表示法表示为:3FFE:0B00:0:0:0:1234:AB26:0003。如果前 导有若干个连续的0时,可用 :: 压缩表示,例 如,::CA75:4005是IPv4地址202.117.64.5的IPv6表示。

1.1 Internet基础知识
4. URL中的路径和文件名 URL的第3部分是主机资源的全路径和文件名,用 “/”作为分隔符。 路径和文件名指出所需资源(文件)的名称及其在计 算机(服务器)中的地址。 服务器经常将主页设置为默认路径下的默认文件。 当申请默认的文件时,文件的路径和名称可以省略。 例如,在这个URL中就 省略了文件的相关指定。
1.1 Internet基础知识
4. 域名的命名规则 一个主机的IP地址可以对应于多个域名, 一个域名只能对应—个IP地址。 域名的层次结构为: 主机名.组织机构名.网络名(机构的类别).最高层
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HTTP响应体
• 类型由响应头确定。 • 可以使任何类型。 • 常用类型: 1)纯文本:text/plain 2)HTML:text/html 3)图片:image/gif, image/jpeg等
常见响应MIME类型
doc application/msword
dot
gif
application/msword
文本类型响应的编程
(1)设置响应类型ContentType response.setContentType(“text/html”); //响应类型为 HTML文档 (2)设置响应字符编码 response.setCharacterEncoding(“GBK”); //字符编码使 用GBK (3)取得字符输出流对象 PrintWriter out=response.getWriter(); (4)向流对象中发送文本数据 out.println(“<html><body></body></html>”); //输出 文本字符 (5)清空流中缓存的字符 out.flush(); (6)关闭流 out.close();
响应对象方法-向客户端传送Cooke
• public void addCookie(Cookie cookie); 此方法功能将Cookie对象放置在响应头 中,随响应内容到浏览器客户端,并保 存到客户端的PC的本地目录中。
发送Cookie案例代码
Cookie cookie01=new Cookie(“userid”,”9001”); response.addCookie(cookie01);
二进制类型响应编程
(1)设置响应类型ContentType response.setContentType(“image/jpeg”); //响应类 型为JPEG图片 (2)取得字节输出流对象 OutputStream out=response.getOutputStream(); // 取得字节输出流 (3)向流对象中发送字节数据 out.println(200); //输出字节数据 (4)清空流中缓存的字节 out.flush(); (5)关闭流 out.close();
Java EE 第5章
HTTP响应处理编程
授课大纲
• • • • • • • • HTTP响应基本知识 HTTP响应内容 响应状态行 响应头 HTML响应 文本HTML响应 二进制响应 HTTP响应响应案例
HTTP响应内容类型
• 在Web服务器接收请求处理后,向客户 端发送HTTP响应(Response). • 响应的内容: 1) 响应状态(Status Code) 2) 响应头(Response Header) 3) 响应体(Response Body) • JavaWeb中响应由响应对象Response完 成。
image/gif
htm
html jpe
text/html
text/html image/jpeg
jpeg
jpg moviห้องสมุดไป่ตู้ mp2
image/jpeg
image/jpeg video/x-sgi-movie video/mpeg
mp3 mpeg
mpg pdf
audio/mpeg video/mpeg
文本HTML响应案例
response.setContentType(“text/html;charset=gb2312”); PrintWriter out=response.getWriter(); out.println(“<html><head>”); out.println(“</head><body>”); out.println(“hello”); out.println(“</body></html>”); out.close();
video/mpeg application/pdf
Servlet-响应对象
• 响应对象类型: javax.servlet.http.HttpServeletResponse • 响应对象职责: (1)设置状态行 (3)发送响应头 (2)向Web浏览器发送HTTP响应体。 (3) 控制页面的重定向。即将告诉浏览器 再发送一次请求。
JavaEE响应对象生命周期
• Web容器自动为每次Web组件的请求生 成一个响应对象。 • Web容器创建响应对象后,传入到doGet 或doPost方法。 • 通过响应对象向浏览器发响应。 • 响应结束后,Web容器销毁响应对象, 释放所占的内存。
响应对象主要方法
• PrintWriter getWriter() //取得字符输出流 • ServletOutputStream getOutputStream() //取得字 节输出流 • void setContentType(String type) //设置响应类型 • void setContentLength(int length) //设置响应长度 • String getContentType() //取得响应类型 • void sendRecirect(String url) //重定向到URL • void setStatus(int statusCode) //设置状态码 • void setHeader(String name,String value) //设置响 应头
HTTP响应状态行(Status)
• • • • • 表明响应的状态信息,如成功,失败,错误。 状态行组成:版本/状态代码/状态信息 状态行例子:HTTP/1.1 200 ok 版本:使用的HTTP协议版本,如HTTP/1.1 状态代码:3位数字。 1xx: 收到请求,没有处理完。 2xx: 成功,响应完毕。 3xx:重定向,到另一个请求中去。 4xx:失败,没有请求的文档等。 5xx:内部错误,代码出现异常。 • 状态描述:
设置响应头便捷方法
• public void setContentType(String type) 直接设置相应内容类型MIME响应头 • public void setContentLength(int len) 设置响应体长度,以字节为单位。 • void setCharacterEncoding(String charset) 设置响应字符集,包括响应状态,响应头和 响应体。 • public void setBufferSize(int size) 设定响应体的缓存字节数。
响应头(Response Header)
• 功能:指示响应的类型信息,如响应类 型,大小等。 • 常见响应头内容: 1)响应类型:content-type 2)响应大小:content-length 3)到期时间:Expires 4)缓存情况:Cache-Control 5)刷新时间:Refresh 6)自动跳转:Refresh, "5; URL="
响应对象方法-请求重定向
• public void sendRedirect(String url) 将对客户的响应重定向到新的URL上,让 客户端浏览器对此URL进行请求。
重定向导航案例
• 通过响应对象的sendRedirect()方法实现动态 导航。 String url=“../admin/login.jsp”; response.sendRedirect(url); //重定向到登录页面,相当于在IE地址栏上 再输入一次URL地址,进行一次HTTP请求。 public void sendRedirect(String url) 执行到URL的自动重定向。
响应对象的方法-设置响应头
• public void setHeader(String name, String value) 将指定名称和值的响应头发送到客户端 • public void setIntHeader(String name,int value) 设置整数类型的响应头的名和值。 • public void setDateHeader(String name,long date) 设定日期类型的响应头。
二进制响应案例示意代码
//设置响应内容类型 response.setContentType(fileType); //取得响应输出流 OutputStream out=response.getOutputStream(); //取得图片的输入流 InputStream in=rs.getBinaryStream("PHOTO") while((len=in.read(data))!=-1) { out.write(data, 0, len); } in.close(); out.close();
相关文档
最新文档