Httpwebclient post访问WebSerivice服务 认证和post数据 不能同时进行么

  在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持。
  在HTTP通信中使用最多的就是GET和POST了,GET请求可以获取静态页面,也可以把参数放在URL字符串的后面,传递给服务器。POST与GET的不同之处在于POST的参数不是放在URL字符串里面,而是放在HTTP请求数据中。
  本文将使用标准Java接口HttpURLConnection,以一个实例演示如何使用POST方式向服务器提交数据,并将服务器的响应结果显示在Android客户端。
1.服务器端的准备
  为了完成该实例,我们需要在服务器端做以下准备工作:
  (1)我们需要在MyEclipse中创建一个Web工程,用来模拟服务器端的Web服务,这里,我将该工程命名为了&myhttp&。
  (2)修改该工程的&index.jsp&文件,添加两个输入框和一个提交按钮,作为该Web工程的显示页面。运行Tomcat,在浏览器中访问该Web工程,可以看到如图1所示的界面。
图1&Web工程的显示页面
  (3)在该Web工程中,创建一个继承自HttpServlet的LoginAction类,并实现其中的doPost()方法,用来响应图1所示页面的用户操作。具体实现如下:
1   public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
String password = request.getParameter("password");
//判断用户名密码是否正确
if(username.equals("admin") && password.equals("123")) {
out.print("Login succeeded!");
out.print("Login failed!");
out.flush();
out.close();
  由上述代码可以看出,当我们在图1所示的页面输入用户名&admin&,密码&123&时,点击提交按钮,会得到&Login&succeeded!&的提示信息,如图2所示。若用户名、密码错误,则会得到&Login&failed!&的提示信息。
图2&登录成功界面
  至此,服务器端的准备工作就全部完成了。
2.客户端实现
  在Android客户端,我们需要完成的工作是:以POST方式发送用户名密码到上述服务器,并获得服务器的验证信息。
  我们分以下几个步骤来完成。
2.1&UI界面
  在Android工程中,我们需要完成一个简单的UI界面,用来完成用户名密码的输入、发送POST请求、显示服务器的验证结果,完成后的界面如图3所示。
图3&客户端UI界面
  在MainActivity中,我们需要获取两个EditText控件的输入,&提交&按键的监听,以及服务器验证结果的TextView内容显示。具体实现代码如下:
* Function
点击事件响应
博客园-依旧淡然
public void onClick(View view) {
switch(view.getId()) {
case R.id.button_submit:
String username = mEditText_userName.getText().toString();
String password = mEditText_password.getText().toString();
Map&String, String& params = new HashMap&String, String&();
params.put("username", username);
params.put("password", password);
mTextView_result.setText(HttpUtils.submitPostData(params, "utf-8"));
2.2发送POST请求到服务器
  可以看到上述代码中,我们调用了HttpUtils类的静态方法submitPostData()完成了发送POST请求到服务器,并将该方法的返回值(服务器的响应结果)显示在了TextView控件中。
  在HttpUtils类中,submitPostData()方法的具体实现如下:
* Function
发送Post请求到服务器
params请求体内容,encode编码格式
博客园-依旧淡然
public static String submitPostData(Map&String, String& params, String encode) {
byte[] data = getRequestData(params, encode).toString().getBytes();    //获得请求体
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
httpURLConnection.setConnectTimeout(3000);
  //设置连接超时时间
httpURLConnection.setDoInput(true);
//打开输入流,以便从服务器获取数据
httpURLConnection.setDoOutput(true);
//打开输出流,以便向服务器提交数据
httpURLConnection.setRequestMethod("POST");
    //设置以Post方式提交数据
httpURLConnection.setUseCaches(false);
//使用Post方式不能使用缓存
//设置请求体的类型是文本类型
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//设置请求体的长度
httpURLConnection.setRequestProperty("Content-Length", String.valueOf(data.length));
//获得输出流,向服务器写入数据
OutputStream outputStream = httpURLConnection.getOutputStream();
outputStream.write(data);
int response = httpURLConnection.getResponseCode();
//获得服务器的响应码
if(response == HttpURLConnection.HTTP_OK) {
InputStream inptStream = httpURLConnection.getInputStream();
return dealResponseResult(inptStream);
//处理服务器的响应结果
} catch (IOException e) {
e.printStackTrace();
return "";
  通过以上的代码可以看出,在该方法中,其实完成了3件事:
  (1)将用户名密码封装成请求体,这是通过调用getRequestData()方法来实现的(后面会讲到这个方法的具体实现)。
  (2)设置HttpURLConnection对象的各种参数(其实是设置HTTP协议请求体的各项参数),然后通过httpURLConnection.getOutputStream()方法获得服务器输出流outputStream,再使用outputStream.write()方法将请求体内容发送给服务器。
  (3)判断服务器的响应码,通过httpURLConnection.getInputStream()方法获得服务器的响应输入流,然后再调用dealResponseResult()方法处理服务器的响应结果。
2.3封装请求体
  使用POST请求时,POST的参数不是放在URL字符串里,而是放在HTTP请求数据中,所以我们需要对POST的参数进行封装。
  针对该实例而言,我们发送的URL请求是:http://192.168.1.101:8080/myhttp/servlet/LoginAction,但是我们需要将POST的参数(也就是username和password)封装到该请求中,形成如下的形式:http://192.168.1.101:8080/myhttp/servlet/LoginAction?username=admin&password=123。我们该怎么做呢?如下的代码给出了一种实现的方案:
* Function
封装请求体信息
params请求体内容,encode编码格式
博客园-依旧淡然
public static StringBuffer getRequestData(Map&String, String& params, String encode) {
StringBuffer stringBuffer = new StringBuffer();
//存储封装好的请求体信息
for(Map.Entry&String, String& entry : params.entrySet()) {
stringBuffer.append(entry.getKey())
.append("=")
.append(URLEncoder.encode(entry.getValue(), encode))
.append("&");
stringBuffer.deleteCharAt(stringBuffer.length() - 1);
//删除最后的一个"&"
} catch (Exception e) {
e.printStackTrace();
return stringB
2.4处理响应结果
  最后,我们再来看一看对服务器返回结果的处理是怎样的。因为在本实例中,服务器的返回结果是字符串&Login&succeeded!&或&Login&failed!&,所以这里我们需要做的就是将服务器的返回结果输入流转化成字符串。当然了,如果服务器返回的是图片,那么,我们就需要就得到的输入流转化成Bitmap图片了。如下代码是上面代码中用到的dealResponseResult()方法的具体实现。
* Function
处理服务器的响应结果(将输入流转化成字符串)
inputStream服务器的响应输入流
博客园-依旧淡然
public static String dealResponseResult(InputStream inputStream) {
String resultData = null;
//存储处理结果
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
while((len = inputStream.read(data)) != -1) {
byteArrayOutputStream.write(data, 0, len);
} catch (IOException e) {
e.printStackTrace();
resultData = new String(byteArrayOutputStream.toByteArray());
return resultD
2.5运行效果
  最后,看看该实例的运行效果吧,如图4所示。
图4&实例运行效果
阅读(...) 评论()httpClient能不能在一次post请求中进行多次数据交 - 跟谁学
搜索你想学的科目、老师试试,例如“吉他”搜索吉安
&&httpClient能不能在一次post请求中进行多次数据交如题,最近刚刚学习http。在一个应用中使用http协议与服务器进行数据传输。现在遇到的问题是,在登录中密码进行多次加密,这个过程需要和服务器不断地进行数据交互才能完成。有没有办法可以实现?就是在服务器返回第一次数据的时候继续等待客户端返回一串处理后的数据,如此不断地进行交互。如果可以的话,怎么实现?如果不行的话有没有别的方式可以实现?blubluP_Chou
从连接的角度,只能是一次请求,一次响应。第二次请求和第一次请求没有直接关联。不过,服务器和客户端可以通过某种机制来保持状态,从而关联多次请求。比如cookie+session。对于你这个场景,比如可以这么设计:c--&s 客户端发起登录请求s--&c 服务器生成一个唯一session保存,并将对应的cookie和产生的随机数发送给客户端。session和cookie和随机数到对应关系应该由服务端保存c--&s 客户端收到随机数加密后得到密文,将密文跟cookie一起发给服务端s--&c 服务端根据cookie,查找到session和之前生成的随机数,并校验加密结果,从而验证客户端合法。到这里,服务端就可以认为客户端登录成功,当然也可以继续验证,直到验证完成。不过,总的来说,每次交互都是从客户端首先发起,服务端才能响应,这是HTTP1.0的根本规范。HTTP 2.0就不一样了,这就另说了
这不符合HTTP协议的规范,HTTP讲究无状态,不提供连续的数据交换功能,你只能使用其他协议或者通过编写相应的程序连续发送独立的HTTP请求来完成这项工作。
相关问题大家都在看最新提问
关注我们官方微信关于跟谁学服务支持帮助中心下次自动登录
现在的位置:
& 综合 & 正文
Apache HttpClient4.2.5 模拟post、登录并访问验证授权数据
1.HttpClient 简介
(百度文库)HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的编程工具包,并且它支持 HTTP 协议最新的版本和建议。本文首先介绍
HTTPClient,然后根据作者实际工作经验给出了一些常见问题的解决方法。
HttpClient下载地址:
我们选择:HttpClient 4.2.5 (GA)(4.2.5.zip)(下载binary就可以了,不用source)
2.使用方式:
下载完成后解压zip包,在\httpcomponents-client-4.2.5-bin\httpcomponents-client-4.2.5\lib下可以看到所有的包都在里面了,我们接下来的例子中使用其中3个包,分别是:
httpcore-4.2.4.jar
httpclient-4.2.5.jar
commons-logging-1.1.1.jar
将这3个jar包添加到项目中,然后简单封装HttpClient类如下:
package com.
import org.apache.http.HttpE
import org.apache.http.HttpR
import org.apache.http.NameValueP
import org.apache.http.ParseE
import org.apache.http.client.ClientProtocolE
import org.apache.http.client.HttpC
import org.apache.http.client.entity.UrlEncodedFormE
import org.apache.http.client.methods.HttpG
import org.apache.http.client.methods.HttpP
import org.apache.http.conn.scheme.S
import org.apache.http.conn.ssl.SSLSocketF
import org.apache.http.impl.client.DefaultHttpC
import org.apache.http.message.BasicNameValueP
import org.apache.http.util.EntityU
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.io.UnsupportedEncodingE
import java.security.*;
import java.security.cert.CertificateE
import java.util.*;
public class HT {
HttpClient httpclient=new DefaultHttpClient();
* 发送 post请求访问本地应用并根据传递参数不同返回不同结果
public String post(String url,String respEncoding) {
return post(url,"UTF-8",respEncoding,new ArrayList&NameValuePair&());
* 发送 post请求访问本地应用并根据传递参数不同返回不同结果
public String post(String url,String reqEncoding,String respEncoding,List&NameValuePair& param) {
String resStr = "";
// 创建httppost
HttpPost httppost = new HttpPost(
// 创建参数队列
List&NameValuePair& formparams =
UrlEncodedFormEntity uefE
uefEntity = new UrlEncodedFormEntity(formparams, reqEncoding);
httppost.setEntity(uefEntity);
response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
resStr = EntityUtils.toString(entity,respEncoding);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
// httpclient.getConnectionManager().shutdown();
return resS
* 发送 get请求
public String get(String url) {
//httpclient = new DefaultHttpClient();
String resStr = "";
// 创建httpget.
HttpGet httpget = new HttpGet(url);
// 执行get请求.
HttpResponse response = httpclient.execute(httpget);
// 获取响应实体
HttpEntity entity = response.getEntity();
// 打印响应状态
System.out.println(response.getStatusLine());
if (entity != null) {
// 打印响应内容长度
System.out.println("Response content length: "
+ entity.getContentLength());
// 打印响应内容
System.out.println("Response content: "
+ EntityUtils.toString(entity));
resStr=EntityUtils.toString(entity);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
//httpclient.getConnectionManager().shutdown();
return resS
import org.apache.http.NameValueP
import org.apache.http.message.BasicNameValueP
import java.util.ArrayL
import java.util.L
* Created with IntelliJ IDEA.
* User: Administrator
* Date: 13-7-25
* Time: 下午4:05
* To change this template use File | Settings | File Templates.
public class MainClass {
public static void main(String[] args) {
HT ht = new HT();//构造参数
List&NameValuePair& list =new ArrayList&NameValuePair&();
list.add(new BasicNameValuePair("li", "house"));//登录参数
System.out.println(ht.post("http://localhost:2375/Default.aspx", "UTF-8", "UTF-8", list));//先post登录也卖弄
System.out.println(ht.get("http://localhost:2375/WebForm1.aspx"));//此页面是需要登录才能访问的页面
注意点:NameValuePair和BasicNameValuePair都是httpclient包里的,自动生成时可能给你添加jdk中的,需要手动改一下。
1.HttpClient支持SSL连接,请另百度
2.//httpclient.getConnectionManager().shutdown();被屏蔽掉和HttpClient httpclient=new DefaultHttpClient();定义为全局变量的原因就是这样才能保证第一次post登录之后,第二次访问页面不会提示未登录,通俗的讲只要HttpClient的实例没有重新赋值,它会自动保存cookie,下次访问将自动附带上。
&&&&推荐文章:
【上篇】【下篇】HTTP访问的两种方式(HttpClient和HttpURLConnection)
使用HttpClient:
NameValuePair nameValuePair1 = new
BasicNameValuePair("name",&"yang");
NameValuePair nameValuePair2 = new
BasicNameValuePair("pwd","123123");
List nameValuePairs = new ArrayList();
nameValuePairs.add(nameValuePair1);
nameValuePairs.add(nameValuePair2);
String validateURL = "";
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams,5000);&//设置连接超时为5秒
HttpClient client = new
DefaultHttpClient(httpParams);&//
生成一个http客户端发送请求对象
HttpPost httpPost = new
HttpPost(urlString);&//设定请求方式
&if (nameValuePairs!=null
&& nameValuePairs.size()!=0)
&&&&&&&&&&&&
&//把键值对进行编码操作并放入HttpEntity对象中
&&&&&&&&&&&&&
httpPost.setEntity(new
UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));
HttpResponse&httpResponse =
client.execute(httpPost);&// 发送请求并等待响应
&&&&&&&&&&//
判断网络连接是否成功
&if (httpResponse.getStatusLine().getStatusCode()
&&&&&&&&&&&&
System.out.println("网络错误异常!!!!");
&&&&&&&&&&&&&return
&&&&&&&&&&&}
HttpEntity entity = httpResponse.getEntity(); // 获取响应里面的内容
inputStream = entity.getContent(); &//
得到服务气端发回的响应的内容(都在一个流里面)
//&得到服务气端发回的响应的内容(都在一个字符串里面)
//&String strResult =
EntityUtils.toString(entity);&
catch (Exception e) {
&&&System.out.println("这是异常!");
使用HttpURLConnection:
String validateURL="";
URL url = new URL(validateUrl);&//创建URL对象
&&&&&&&//返回一个URLConnection对象,它表示到URL所引用的远程对象的连接
HttpURLConnection conn = (HttpURLConnection)
url.openConnection();
conn.setConnectTimeout(5000); //设置连接超时为5秒
conn.setRequestMethod("GET"); //设定请求方式
conn.connect(); //建立到远程对象的实际连接
//返回打开连接读取的输入流
&&&&&&&DataInputStream
DataInputStream(conn.getInputStream());&&
&//判断是否正常响应数据&
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
&&&&&&&&&&
System.out.println("网络错误异常!!!!");
&&&&&&&&&&&return&
} catch (Exception e) {
&&&e.printStackTrace();
&System.out.println("这是异常!");
&&} finally {
&& &if (conn !=
&conn.disconnect();&//中断连接
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 httpclient post 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信