本文的目的是介绍JAVA-WEB-HttpRequest的详细情况,我们将通过专业的研究、有关数据的分析等多种方式,同时也不会遗漏关于asp.net–HttpRequest,HttpWebReques
本文的目的是介绍JAVA-WEB-HttpRequest的详细情况,我们将通过专业的研究、有关数据的分析等多种方式,同时也不会遗漏关于asp.net – HttpRequest,HttpWebRequest和WebRequest之间的区别、C# httpRequest Soap请求、C# HttpRequest 请求、c# – 通过HttpClient发布文件时,HttpRequest.Files为空的知识。
本文目录一览:- JAVA-WEB-HttpRequest
- asp.net – HttpRequest,HttpWebRequest和WebRequest之间的区别
- C# httpRequest Soap请求
- C# HttpRequest 请求
- c# – 通过HttpClient发布文件时,HttpRequest.Files为空
JAVA-WEB-HttpRequest
HttpServletRequest
HttpServletRequest概述
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。
request的运行流程
通过抓包工具抓取Http请求
因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请 求头和请求体
通过request获得请求行
获得客户端的请求方式:String
getMethod()
获得请求的资源:
String
getRequestURI()
StringBuffer
getRequestURL()
String
getContextPath()
---web
应用的名称
String
getQueryString()
---- get
提交
url
地址后的参数字符串
username=zhangsan&password=123
注意:request获得客户机(客户端)的一些信息
request.getRemoteAddr() --- 获得访问的客户端IP地址
通过request获得请求头
long
getDateHeader(
String name)
String
getHeader(
String name)
Enumeration
getHeaderNames()
Enumeration
getHeaders(
String name)
int
getIntHeader(
String name)
referer头的作用:执行该此访问的的来源
做防盗链
通过request获得请求体
请求体中的内容是通过post提交的请求参数,格式是:
username=zhangsan&password=123&hobby=football&hobby=basketball
key ---------------------- value
username [zhangsan]
password [123]
hobby [football,basketball]
以上面参数为例,通过一下方法获得请求参数:
String
getParameter(
String name)
String[]
getParameterValues(
String name)
Enumeration
getParameterNames()
Map<String,String[]>
getParameterMap()
注意:get请求方式的请求参数 上述的方法一样可以获得
解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");
解决get提交的方式的乱码:
parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
request的其他功能
(1)request是一个域对象
request对象也是一个存储数据的区域对象,所以也具有如下方法:
setAttribute(
String name,
Object o)
getAttribute(
String name)
removeAttribute(
String name)
注意:request域的作用范围:一次请求中
(2)request完成请求转发
获得请求转发器----path
是转发的地址
RequestDispatcher
getRequestDispatcher(
String path)
通过转发器对象转发
requestDispathcer.forward(
ServletRequest request,
ServletResponse response
注意:
ServletContext
域与
Request
域的生命周期比较?
ServletContext
:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个
web
应用
request
:
创建:访问时创建
request
销毁:响应结束
request
销毁
域的作用范围:一次请求中
注意:转发与重定向的区别?
1
)重定向两次请求,转发一次请求
2
)重定向地址栏的地址变化,转发地址不变
3
)重新定向可以访问外部网站
转发只能访问内部资源
4
)转发的性能要优于重定向
注意:客户端地址与服务器端地址的写法?
客户端地址:
是客户端去访问服务器的地址,服务器外部的地址,特点:写上
web
应用名
称
直接输入地址:
重定向
服务器端地址:
服务器内部资源的跳转的地址,特点:不需要写
web
应用的名称
转发
总结:
request
获得行的内容
request.getMethod()
request.getRequestURI()
request.getRequestURL()
request.getContextPath()
request.getRemoteAddr()
request
获得头的内容
request.getHeader(name)
request
获得体(请求参数)
String request.getParameter(name)
Map<String,String[]> request.getParameterMap();
String[] request.getParameterValues(name);
注意:客户端发送的参数
到服务器端都是字符串
获得中文乱码的解决:
post:request.setCharacterEncoding(“UTF-8”);
get:
parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”);
request
转发和域
request.getRequestDispatcher(
转发的地址
).forward(req,resp);
request.setAttribute(name,value)
request.getAttribute(name)
asp.net – HttpRequest,HttpWebRequest和WebRequest之间的区别
解决方法
WebRequest
是HttpWebRequest的抽象基类 – 您不能直接使用它。它是其他*请求类的基类(用于FTP,文件和其他类型的Web请求)。这些类都用于从Web获取资源(文件)。
还有一个WebClient
类 – 可能是使用所有用于从Internet检索资源的BCL类最简单的类。
另一方面,HttpRequest
表示ASP.NET应用程序中资源的请求 – 这是请求的服务器端。
主要的区别是HttpWebRequest是HTTP客户端,HttpRequest是在ASP.NET Web应用程序中使用的服务器端。
C# httpRequest Soap请求
一般添加web服务引用是.NET用代理类模式 创建SOAP请求代理类,代理类是.NET开发工具VS自动给你生成。
下面用一般HTTP的模式有时候可能更合适,原理是构造SOAP请求的XML后POST过去:
下面是HelloWorld的例子
private void button1_Click(object sender, EventArgs e)
{
//创建HttpWebRequest 实例,使用WebRequest.Create
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://localhost:1198/WebSite1/Service.asmx");
//发送请求
webRequest.Method = "POST";
//编码
webRequest.ContentType = "text/xml";
string soap = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
soap += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
soap += " <soap:Header>";
soap += " </soap:Header>";
soap += "<soap:Body>";
soap += " <HelloWorld xmlns=\"http://tempuri.org/\" />";
soap += "</soap:Body>";
soap += "</soap:Envelope>";
// webRequest.Headers["SoapAction"] = "http://localhost:1198/WebSite1/Service.asmx";
//字符转字节
byte[] bytes = Encoding.UTF8.GetBytes(soap);
Stream writer = webRequest.GetRequestStream();
writer.Write(bytes, 0, bytes.Length);
writer.Flush();
writer.Close();
string result = "";
//返回 HttpWebResponse
try
{
HttpWebResponse hwRes = webRequest.GetResponse() as HttpWebResponse;
if (hwRes.StatusCode == System.Net.HttpStatusCode.OK)
{//是否返回成功
Stream rStream = hwRes.GetResponseStream();
//流读取
StreamReader sr = new StreamReader(rStream, Encoding.UTF8);
result = sr.ReadToEnd();
sr.Close();
rStream.Close();
}
else
{
result = "连接错误";
}
//关闭
hwRes.Close();
txtResponse.Text = result;
}
catch (System.Net.WebException ex)
{
String responseFromServer = ex.Message.ToString() + " ";
if (ex.Response != null)
{
using (WebResponse response = ex.Response)
{
Stream data = response.GetResponseStream();
using (StreamReader reader = new StreamReader(data))
{
responseFromServer += reader.ReadToEnd();
}
}
}
txtResponse.Text = responseFromServer;
}
}
不错意外会返回如下:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><HelloWorldResponse xmlns="http://tempuri.org/"><HelloWorldResult>Hello World</HelloWorldResult></HelloWorldResponse></soap:Body></soap:Envelope>
不构造XML结构请求也是可以的:
/*
/*POST /WebSite1/Service.asmx/HelloWorld HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: length
*/
//创建HttpWebRequest 实例,使用WebRequest.Create
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://localhost:1198/WebSite1/Service.asmx/HelloWorld");
//发送请求
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength=0;
string soap = "";//请求参数如 soap = "str=wgscd&num=123";
//字符转字节
byte[] bytes = Encoding.UTF8.GetBytes(soap);
Stream writer = webRequest.GetRequestStream();
writer.Write(bytes, 0, bytes.Length);
writer.Flush();
writer.Close();
string result = "";
//返回 HttpWebResponse
try
{
HttpWebResponse hwRes = webRequest.GetResponse() as HttpWebResponse;
if (hwRes.StatusCode == System.Net.HttpStatusCode.OK)
{//是否返回成功
Stream rStream = hwRes.GetResponseStream();
//流读取
StreamReader sr = new StreamReader(rStream, Encoding.UTF8);
result = sr.ReadToEnd();
sr.Close();
rStream.Close();
}
else
{
result = "连接错误";
}
//关闭
hwRes.Close();
txtResponse.Text = result;
}
catch (Exception ex)
{
txtResponse.Text = ex.Message ;
}
会返回:
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">Hello World</string>
不构造XML请求结构的一个死穴是,那种传人参数是某个对象/类的情况就GG了。
如:
[WebMethod]
public DataRet HelloWorld(DataRequest dt)
{
DataRet d =new DataRet();
return d;
}
C# HttpRequest 请求
public static string Post(string Url,string postDataStr,string cookies) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Method = "POST"; if (cookies != null) request.Headers.Add("Cookie",cookies); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postDataStr.Length; StreamWriter writer = new StreamWriter(request.GetRequestStream(),Encoding.ASCII); writer.Write(postDataStr); writer.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string encoding = response.ContentEncoding; if (encoding == null || encoding.Length < 1) { encoding = "UTF-8"; //默认编码 } StreamReader reader = new StreamReader(response.GetResponseStream(),Encoding.GetEncoding(encoding)); string retString = reader.ReadToEnd(); return retString; } public static string Get(string Url,string cookies) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Method = "GET"; if (cookies != null) request.Headers.Add("Cookie",cookies); request.ContentType = "application/x-www-form-urlencoded"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string encoding = response.ContentEncoding; if (encoding == null || encoding.Length < 1) { encoding = "UTF-8"; //默认编码 } StreamReader reader = new StreamReader(response.GetResponseStream(),Encoding.GetEncoding(encoding)); string retString = reader.ReadToEnd(); return retString; }
c# – 通过HttpClient发布文件时,HttpRequest.Files为空
public HttpResponseMessage Post([FromUri]string machineName) { HttpResponseMessage result = null; var httpRequest = HttpContext.Current.Request; if (httpRequest.Files.Count > 0 && !String.IsNullOrEmpty(machineName)) ...
客户端:
public static void PostFile(string url,string filePath) { if (String.IsNullOrWhiteSpace(url) || String.IsNullOrWhiteSpace(filePath)) throw new ArgumentNullException(); if (!File.Exists(filePath)) throw new FileNotFoundException(); using (var handler = new httpclienthandler { Credentials= new NetworkCredential(AppData.UserName,AppData.Password,AppCore.Domain) }) using (var client = new HttpClient(handler)) using (var content = new MultipartFormDataContent()) using (var ms = new MemoryStream(File.ReadAllBytes(filePath))) { var fileContent = new StreamContent(ms); fileContent.Headers.Contentdisposition = new ContentdispositionHeaderValue("attachment") { FileName = Path.GetFileName(filePath) }; content.Add(fileContent); content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); var result = client.PostAsync(url,content).Result; result.EnsureSuccessstatusCode(); } }
在服务器端,httpRequest.Files集合始终为空.但标题(内容长度等)是正确的.
解决方法
public class UploadController : ApiController { public async Task<HttpResponseMessage> PostFile() { // Check if the request contains multipart/form-data. if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } string root = HttpContext.Current.Server.MapPath("~/App_Data"); var provider = new MultipartFormDataStreamProvider(root); try { StringBuilder sb = new StringBuilder(); // Holds the response body // Read the form data and return an async task. await Request.Content.ReadAsMultipartAsync(provider); // This illustrates how to get the form data. foreach (var key in provider.FormData.AllKeys) { foreach (var val in provider.FormData.GetValues(key)) { sb.Append(string.Format("{0}: {1}\n",key,val)); } } // This illustrates how to get the file names for uploaded files. foreach (var file in provider.FileData) { FileInfo fileInfo = new FileInfo(file.LocalFileName); sb.Append(string.Format("Uploaded file: {0} ({1} bytes)\n",fileInfo.Name,fileInfo.Length)); } return new HttpResponseMessage() { Content = new StringContent(sb.ToString()) }; } catch (System.Exception e) { return Request.CreateErrorResponse(HttpStatusCode.InternalServerError,e); } } }
今天关于JAVA-WEB-HttpRequest的讲解已经结束,谢谢您的阅读,如果想了解更多关于asp.net – HttpRequest,HttpWebRequest和WebRequest之间的区别、C# httpRequest Soap请求、C# HttpRequest 请求、c# – 通过HttpClient发布文件时,HttpRequest.Files为空的相关知识,请在本站搜索。
本文标签: