如果java post请求 xml方式是http+post+xml,有没有办法映射为java post请求 xml对象

规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式。
我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:
&method& &request-url& &version&
&entity-body&&/entity-body&&/headers&&/version&&/request-url&&/method&
协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分。下面就正式开始介绍它们。
application/x-www-form-urlencoded
这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):
POST http:// HTTP/1.1
Content-Type: application/x-www-form-charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。例如 PHP 中,$_POST['title'] 可以获取到 title 的值,$_POST['sub'] 可以得到 sub 数组。
很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如
的 Ajax,Content-Type 默认值都是「application/x-www-form-charset=utf-8」。
multipart/form-data
这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值。直接来看一个请求示例:
POST http://www. HTTP/1.1
Content-Type:multipart/form- boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form- name=&text&
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form- name=&file&; filename=&chrome.png&
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
这个例子稍微复杂点。首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。关于 mutipart/form-data 的详细定义,请前往
这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。
上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段原生 form 表单也。但是随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。
application/json
application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。
JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。记得我几年前做一个项目时,需要提交的数据层次非常深,我就是把数据 JSON 序列化之后来提交的。不过当时我是把 JSON 字符串作为 val,仍然放在键值对里,以 x-www-form-urlencoded 方式提交。
中的 Ajax 功能,默认就是提交 JSON 字符串。例如下面这段代码:
var data = {'title':'test', 'sub' : [1,2,3]};
$http.post(url, data).success(function(result) {
最终发送的请求是:
POST http:// HTTP/1.1
Content-Type: application/charset=utf-8
{&title&:&test&,&sub&:[1,2,3]}
这种方案,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。各大抓包工具如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好。但也有些服务端语言还没有支持这种方式,例如 php 就无法通过 $_POST 对象从上面的请求中获得内容。这时候,需要自己动手处理下:在请求头中 Content-Type 为 application/json 时,从 php://input 里获得原始输入流,再 json_decode 成对象。一些 php 框架已经开始这么做了。
当然 AngularJS 也可以配置为使用 x-www-form-urlencoded 方式提交数据。如有需要,可以参考。
我的博客之前(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:
POST http:// HTTP/1.1
Content-Type: text/xml
&!--?xml version=&1.0&?--&
&methodcall&
&methodname&examples.getStateName&/methodname&
&value&&i4&41&/i4&&/value&
&/methodcall&
XML-RPC 协议简单、功能够用,各种语言的实现都有。它的使用也很广泛,如 WordPress 的 ,搜索引擎的 等等。JavaScript 中,也有支持以这种方式进行数据交互,能很好的支持已有的 XML-RPC 服务。不过,我个人觉得 XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。
本文链接:
阅读(...) 评论()12705人阅读
package&warelab.&&
&&import&java.io.BufferedInputS&&import&java.io.BufferedR&&import&java.io.ByteArrayOutputS&&import&java.io.IOE&&import&java.io.InputS&&import&java.io.InputStreamR&&import&java.io.OutputStreamW&&import&java.net.URI;&&import&java.net.URL;&&import&java.net.URLC&&&&import&mons.httpclient.HttpC&&import&mons.httpclient.HttpS&&import&mons.httpclient.methods.PostM&&&&&&&&&public&class&TestMeetingInterface&{&&&&&&&&&&&&&&&&public&static&void&main(String[]&args)&{&&&&&&&&&&&&&&&&&&&&String&url&=&&http://192.168.0.68/integration/xml&;&&&&&&&&&&TestMeetingInterface&tmi&=&new&TestMeetingInterface();&&&&&&&&&&System.out.println(tmi.post(url,&listSummaryMeeting.xml&));&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&public&String&post(String&url,String&xmlFileName){&&&&&&&&&&&&
&&&&&&&&&&System.setProperty(&mons.logging.Log&,&&mons.logging.impl.SimpleLog&);&&&&&&&&&&&&&System.setProperty(&mons.logging.simplelog.showdatetime&,&&true&);&&&&&&&&&&&&&System.setProperty(&mons.logging.simplelog.log.mons.httpclient&,&&stdout&);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&HttpClient&client&=&new&HttpClient();&&&&&&&&&&&&&&&&&&&&&&PostMethod&myPost&=&new&PostMethod(url);&&&&&&&&&&&&&&&&&&&&&&client.setConnectionTimeout(300*1000);&&&&&&&&&&String&responseString&=&null;&&&&&&&&&&&&try{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&myPost.setRequestHeader(&Content-Type&,&text/xml&);&&&&&&&&&&&&&&myPost.setRequestHeader(&charset&,&utf-8&);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&InputStream&body=this.getClass().getResourceAsStream(&/&+xmlFileName);&&&&&&&&&&&&&&myPost.setRequestBody(body);&&&&&&&&&&&&&&&&int&statusCode&=&client.executeMethod(myPost);&&&&&&&&&&&&&&&&if(statusCode&==&HttpStatus.SC_OK){&&&&&&&&&&&&&&&&&&&&BufferedInputStream&bis&=&new&BufferedInputStream(myPost.getResponseBodyAsStream());&&&&&&&&&&&&&&&&&&&&byte[]&bytes&=&new&byte[1024];&&&&&&&&&&&&&&&&&&&&ByteArrayOutputStream&bos&=&new&ByteArrayOutputStream();&&&&&&&&&&&&&&&&&&&&int&count&=&0;&&&&&&&&&&&&&&&&&&&&while((count&=&bis.read(bytes))!=&-1){&&&&&&&&&&&&&&&&&&&&&&&&bos.write(bytes,&0,&count);&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&byte[]&strByte&=&bos.toByteArray();&&&&&&&&&&&&&&&&&&&&responseString&=&new&String(strByte,0,strByte.length,&utf-8&);&&&&&&&&&&&&&&&&&&&&bos.close();&&&&&&&&&&&&&&&&&&&&bis.close();&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}catch&(Exception&e)&{&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&&}&&&&&&&&&&&&myPost.releaseConnection();&&&&&&&&&&&&return&responseS&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&public&void&testPost(String&urlStr)&{&&&&&&&&&&try&{&&&&&&&&&&&&&&URL&url&=&new&URL(urlStr);&&&&&&&&&&&&&&URLConnection&con&=&url.openConnection();&&&&&&&&&&&&&&con.setDoOutput(true);&&&&&&&&&&&&&&con.setRequestProperty(&Pragma:&,&&no-cache&);&&&&&&&&&&&&&&con.setRequestProperty(&Cache-Control&,&&no-cache&);&&&&&&&&&&&&&&con.setRequestProperty(&Content-Type&,&&text/xml&);&&&&&&&&&&&&&&&&OutputStreamWriter&out&=&new&OutputStreamWriter(con.getOutputStream());&&&&&&&&&&&&&&&&&&String&xmlInfo&=&getXmlInfo();&&&&&&&&&&&&&&System.out.println(&urlStr=&&+&urlStr);&&&&&&&&&&&&&&&&out.write(new&String(xmlInfo.getBytes(&UTF-8&)));&&&&&&&&&&&&&&out.flush();&&&&&&&&&&&&&&out.close();&&&&&&&&&&&&&&BufferedReader&br&=&new&BufferedReader(new&InputStreamReader(con&&&&&&&&&&&&&&&&&&&&&&.getInputStream()));&&&&&&&&&&&&&&String&line&=&&&;&&&&&&&&&&&&&&for&(line&=&br.readLine();&line&!=&null;&line&=&br.readLine())&{&&&&&&&&&&&&&&&&&&System.out.println(line);&&&&&&&&&&&&&&}&&&&&&&&&&}&catch&(Exception&e)&{&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&}&&&&&&}&&&&&&&&private&String&getXmlInfo()&{&&&&&&&&&&StringBuilder&sb&=&new&StringBuilder();&&&&&&&&&&sb.append(&&?xml&version='1.0'&encoding='UTF-8'?&&);&&&&&&&&&&sb.append(&&Message&&);&&&&&&&&&&sb.append(&&&header&&);&&&&&&&&&&sb.append(&&&&&&&action&readMeetingStatus&/action&&);&&&&&&&&&&sb.append(&&&&&&&service&meeting&/service&&);&&&&&&&&&&sb.append(&&&&&&&type&xml&/type&&);&&&&&&&&&&sb.append(&&&&&&&userName&admin&/userName&&);&&&&&&&&&&sb.append(&&&&&&&password&admin&/password&&);&&&&&&&&&&sb.append(&&&&&&&siteName&box&/siteName&&);&&&&&&&&&&sb.append(&&&/header&&);&&&&&&&&&&sb.append(&&&body&&);&&&&&&&&&&sb.append(&&&&&&&confKey&&/confKey&&);&&&&&&&&&&sb.append(&&&/body&&);&&&&&&&&&&sb.append(&&/Message&&);&&&&&&&&&&&&&&&&&&&&return&sb.toString();&&&&&&}&&}&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:403131次
积分:3751
积分:3751
排名:第5968名
原创:114篇
评论:21条
(1)(2)(2)(11)(2)(2)(1)(2)(4)(1)(1)(1)(1)(2)(2)(1)(1)(3)(1)(2)(2)(3)(2)(21)(4)(1)(23)(8)(9)Android(20)
1.HttpURLConnection的介绍
答:一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。继承至URLConnection,抽象类,无法直接实例化对象。通过调用openCollection()方法获得对象实例,默认是带gzip压缩的;
2.HttpURLConnection的使用步骤
使用HttpURLConnection的步骤如下:
创建一个URL对象:URL url = new URL();调用URL对象的openConnection( )来获取HttpURLConnection对象实例:HttpURLConnection conn = (HttpURLConnection) url.openConnection();设置HTTP请求使用的方法:GET或者POST,或者其他请求方式比如:PUTconn.setRequestMethod(&GET&);设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头conn.setConnectTimeout(6*1000);conn.setReadTimeout(6 * 1000);调用getInputStream()方法获得服务器返回的输入流,然后输入流进行读取了InputStream in = conn.getInputStream();最后调用disconnect()方法将HTTP连接关掉conn.disconnect();
PS:除了上面这些外,有时我们还可能需要对响应码进行判断,比如200:if(conn.getResponseCode() != 200)然后一些处理 还有,可能有时我们并不需要传递什么参数,而是直接去访问一个页面,我们可以直接用:final InputStream in = new URL(&url&).openStream();然后直接读流,不过这个方法适合于直接访问页面的情况,底层实现其实也是return openConnection().getInputStream(),而且我们还不能设置一些请求头的东东,所以要不要这样写,你自己要掂量掂量!
3.HttpURLConnection使用示例
这里我们主要针对GET和POST请求写两个不同的使用示例,我们可以conn.getInputStream()获取到的是一个流,所以我们需要写一个类将流转化为二进制数组!工具类如下:
StreamTool.java:
* Created by Jay on
public class StreamTool {
//从流中读取数据
public static byte[] read(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while((len = inStream.read(buffer)) != -1)
outStream.write(buffer,0,len);
inStream.close();
return outStream.toByteArray();
接下来就可以开始撸我们的示例了!
1)HttpURLConnection发送GET请求代码示例
运行效果图:
核心部分代码:
布局:activity_main.xml
xmlns:android=&/apk/res/android&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical&
android:id=&@+id/txtMenu&
android:layout_width=&match_parent&
android:layout_height=&48dp&
android:background=&#4EA9E9&
android:clickable=&true&
android:gravity=&center&
android:text=&长按我,加载菜单&
android:textSize=&20sp&
android:id=&@+id/imgPic&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:visibility=&gone&
android:id=&@+id/scroll&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:visibility=&gone&
android:id=&@+id/txtshow&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:id=&@+id/webView&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
获取数据类:GetData.java:
* Created by Jay on
public class GetData {
// 定义一个获取网络图片数据的方法:
public static byte[] getImage(String path) throws Exception {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置连接超时为5秒
conn.setConnectTimeout(5000);
// 设置请求类型为Get类型
conn.setRequestMethod(&GET&);
// 判断请求Url是否成功
if (conn.getResponseCode() != 200) {
throw new RuntimeException(&请求url失败&);
InputStream inStream = conn.getInputStream();
byte[] bt = StreamTool.read(inStream);
inStream.close();
return bt;
// 获取网页的html源代码
public static String getHtml(String path) throws Exception {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod(&GET&);
if (conn.getResponseCode() == 200) {
InputStream in = conn.getInputStream();
byte[] data = StreamTool.read(in);
String html = new String(data, &UTF-8&);
return html;
return null;
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private TextView txtMenu, txtshow;
private ImageView imgPic;
private WebView webView;
private ScrollView scroll;
private Bitmap bitmap;
private String detail = &&;
private boolean flag = false;
private final static String PIC_URL = &/large/7a8aed7bgw1evshgr5z3oj20hs0qo0vq.jpg&;
private final static String HTML_URL = &&;
// 用于刷新界面
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0x001:
hideAllWidget();
imgPic.setVisibility(View.VISIBLE);
imgPic.setImageBitmap(bitmap);
Toast.makeText(MainActivity.this, &图片加载完毕&, Toast.LENGTH_SHORT).show();
case 0x002:
hideAllWidget();
scroll.setVisibility(View.VISIBLE);
txtshow.setText(detail);
Toast.makeText(MainActivity.this, &HTML代码加载完毕&, Toast.LENGTH_SHORT).show();
case 0x003:
hideAllWidget();
webView.setVisibility(View.VISIBLE);
webView.loadDataWithBaseURL(&&, detail, &text/html&, &UTF-8&, &&);
Toast.makeText(MainActivity.this, &网页加载完毕&, Toast.LENGTH_SHORT).show();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setViews();
private void setViews() {
txtMenu = (TextView) findViewById(R.id.txtMenu);
txtshow = (TextView) findViewById(R.id.txtshow);
imgPic = (ImageView) findViewById(R.id.imgPic);
webView = (WebView) findViewById(R.id.webView);
scroll = (ScrollView) findViewById(R.id.scroll);
registerForContextMenu(txtMenu);
// 定义一个隐藏所有控件的方法:
private void hideAllWidget() {
imgPic.setVisibility(View.GONE);
scroll.setVisibility(View.GONE);
webView.setVisibility(View.GONE);
// 重写上下文菜单的创建方法
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
MenuInflater inflator = new MenuInflater(this);
inflator.inflate(R.menu.menus, menu);
super.onCreateContextMenu(menu, v, menuInfo);
// 上下文菜单被点击是触发该方法
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.one:
new Thread() {
public void run() {
byte[] data = GetData.getImage(PIC_URL);
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
} catch (Exception e) {
e.printStackTrace();
handler.sendEmptyMessage(0x001);
}.start();
case R.id.two:
new Thread() {
public void run() {
detail = GetData.getHtml(HTML_URL);
} catch (Exception e) {
e.printStackTrace();
handler.sendEmptyMessage(0x002);
}.start();
case R.id.three:
if (detail.equals(&&)) {
Toast.makeText(MainActivity.this, &先请求HTML先嘛~&, Toast.LENGTH_SHORT).show();
handler.sendEmptyMessage(0x003);
return true;
最后别忘了加上联网权限:
android:name=&android.permission.INTERNET&
注意事项:
用handler的原因就不用讲了吧~另外我们加载html代码的使用的是webView的loadDataWithBaseURL而非LoadData,如果用LoadData又要去纠结中文乱码的问题,so…用loadDataWithBaseURL就可以不用纠结那么多了另外有些页面可能需要我们提交一些参数,比如账号密码:我们只需把对应参数拼接到url尾部即可,比如:http://192.168.191.1:8080/ComentServer/LoginServlet?passwd=123&name=Jack然后服务端getParamater(&passwd&)这样就可以获得相应的参数了,我们请求时这些东西都会看得清清楚楚,所以说GET方式并不安全!另外还有一点要注意的就是Android从4.0开始就不允许在非UI线程中进行UI操作!
2)HttpURLConnection发送POST请求代码示例
有GET自然有POST,我们通过openConnection获取到的HttpURLConnection默认是进行Get请求的,所以我们使用POST提交数据,应提前设置好相关的参数:conn.setRequestMethod(&POST&);还有:conn.setDoOutput(true);conn.setDoInput(true);设置允许输入,输出还有:conn.setUseCaches(false); POST方法不能缓存,要手动设置为false,具体实现看代码:
运行效果图:
核心代码:
PostUtils.java
public class PostUtils {
public static String LOGIN_URL = &http://172.16.2.54:8080/HttpTest/ServletForPost&;
public static String LoginByPost(String number,String passwd)
String msg = &&;
HttpURLConnection conn = (HttpURLConnection) new URL(LOGIN_URL).openConnection();
//设置请求方式,请求超时信息
conn.setRequestMethod(&POST&);
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
//设置运行输入,输出:
conn.setDoOutput(true);
conn.setDoInput(true);
//Post方式不能缓存,需手动设置为false
conn.setUseCaches(false);
//我们请求的数据:
String data = &passwd=&+ URLEncoder.encode(passwd, &UTF-8&)+
&&number=&+ URLEncoder.encode(number, &UTF-8&);
//这里可以写一些请求头的东东...
//获取输出流
OutputStream out = conn.getOutputStream();
out.write(data.getBytes());
out.flush();
if (conn.getResponseCode() == 200) {
// 获取响应的输入流对象
InputStream is = conn.getInputStream();
// 创建字节输出流对象
ByteArrayOutputStream message = new ByteArrayOutputStream();
// 定义读取的长度
int len = 0;
// 定义缓冲区
byte buffer[] = new byte[1024];
// 按照缓冲区的大小,循环读取
while ((len = is.read(buffer)) != -1) {
// 根据读取的长度写入到os对象中
message.write(buffer, 0, len);
// 释放资源
is.close();
message.close();
// 返回字符串
msg = new String(message.toByteArray());
return msg;
}catch(Exception e){e.printStackTrace();}
return msg;
PS:因为电脑没装MyEclipse,而且时间关系,就不另外写demo了,用回之前的Eclipse的那个demo!其实从直接看核心代码就够了~代码下载:
4.Cookie问题的处理
说这个之前,首先我们要理解两个概念:Session和CookieCookie只是Session机制的一种常用形式,我们也可以使用其他方式来作为客户端的一个唯一标识,这个由服务器决定,唯一能够证明一个客户端标识就好!除了这种方式外,我们还可以使用URL重写!方法来实现!所以以后别傻傻的跟别人说:Session不就是Cookie!
下面通过一个例子来帮助大家理解这个Cookie:小猪输入账号密码后登陆下学校的教务系统,然后访问课表信息成功,然后如果你用的是Chrome,按F12进入开发模式:来到Resources界面可以看到我们的Cookies:
点击后我们可以看到里面保存的内容,由名称;值;cookie所在的域(domain);cookie所在的目录(path)Asp.net默认为/即根目录;过期时间;Cookie大小:
我们可以看到请求头中有一个Cookie的字段:
恩呢,现在我们把Cookie清掉(或者等几分钟),然后再访问下述链接:
这时候,页面竟然自动跳回登陆页面了!当然一些其他的网站可能会弹出一个对话框说&登陆超时&之类的东西!
小结下Http请求登陆的一个简单流程:一般是登陆的时候:服务器通过Set-Cookie响应头,返回一个Cookie,浏览器默认保存这个Cookie,后续访问相关页面的时候会带上这个Cookie,通过Cookie请求头来完成访问,如果没Cookie或者Cookie过期,就提示用户没登陆,登陆超时,访问需要登陆之类的信息!
而我们使用HttpClient和HttpURLConnection其实也就是模拟这一个流程,登陆后拿到cookie拿着它去发送请求:关键代码如下:获得Cookie:conn.getHeaderField(&Set-Cookie&);请求时带上Cookie:conn.setRequestProperty(&Cookie&,cookie);
另外,除了这种设置请求头的方式外,还可以用另一种折衷的方法:URL重写:就是在原先请求链接的基础上,加上一个…&sessionid=xxxxx这样的参数,然后由服务器来解析判断!Get可以这么写,而Post写法如下:
这里我们用的是JSON字符串的形式,接到请求时服务端取出session里的内容,然后做下查询即可~
5.使用HttpURLConnection发送PUT请求
Put请求对于很多朋友来说可能有点陌生,毕竟我们平时接触的比较多的情况都是GET和POST,一开始小猪也不知道,不过后来才发现和POST其实是差不多的,而且我们只需在POST的基础上改点东西就可以使用了!而HttpClient也给我们提供了一个HttpPut的API,下面贴下小猪自己项目中写的请求代码:
public static String LoginByPut(Context mContext, String mobile, String password, int from,
String devid,String version_name, int remember_me) {
String resp = &&;
HttpURLConnection conn = (HttpURLConnection) new URL(LOGIN_URL).openConnection();
conn.setRequestMethod(&PUT&);
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
String data = &mobile=& + mobile + &&password=& + password + &&from=& + from + &&devid=& + &devid&
+ &&version_name=& + &version_name& + &&remember_me=& + remember_me;
// 获取输出流:
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(data);
writer.flush();
writer.close();
// 获取相应流对象:
InputStream in = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null)
response.append(line);
SPUtils.put(mContext, &session&, conn.getHeaderField(&Set-Cookie&));
// 资源释放:
in.close();
// 返回字符串
Log.e(&HEHE&, response.toString());
return response.toString();
} catch (Exception e) {
e.printStackTrace();
return &&;
本节小结:
好的,本节关于HttpUrlConnection的使用介绍就到这里,另外,HTTP这一小节大部分来自于小猪以前写的一个小合集Android之Http通信,如果看过这个系列的可以跳过这节,大部分内容都是一样的!嗯,就说这么多,谢谢~
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

我要回帖

更多关于 java post请求 xml 的文章

 

随机推荐