Android客户端向服务器端发送数据的流程(1)

原理:

android客户端通过使用org.apache.http.impl.client.DefaultHttpClient类来发送数据;

方法介绍:

HttpClient是android中提供的一个类 , 也是apache开源组织提供的项目 , 他是个简单的HTTP客户端, 而不是一个浏览器 , 可以用于发送HTTP请求,接受http响应.但是不会缓存服务器的响应,不能执行html中in个内嵌的JS代码,也不会对页面的额内容进行任何的解析和处理;

这句话的意思就是:如果你请求的页面内容是:

<HTML>

<BODY>

<br/>

</BODY>

</HTML>的话 , 他是不会解析成一个换行符号的 , 而是解析成一个字符串"<HTML><BODY><br/></BODY>"

一个请求的发送大致可以分为:

step1  创建HttpClient对象 详情请看代码中标识的1.1-   1.2   1.3 

step2  创建POST请求的对象---HttpPost

step3  为HttpPost对象中放入参数--setParams(HttpParams ) 或者是setEntity(HttpEntity)

step4  通过HttpClient.exec(HttpPost)方法会返回一个HttpResponse对象 ; 这个对象中提供有获取服务器的响应头,获取服务器的响应内容等等

------------------>>>

Demo:

 

package com.creazy.demohttpclient;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Looper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity
{

private Button btn_login;
private Button btn_reg;

private HttpClient httpClient;// 用于管理数据发送和接受的 ------step<1.1> : 声明HttpClient对象

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//init ...初始化成员变量<1.2>
this.btn_login = (Button)findViewById(R.id.login);
this.btn_reg = (Button)findViewById(R.id.regiser);
        this.httpClient = new DefaultHttpClient() ;//初始化HttpClient对象<1.3>
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}

/**
*
*/
public void showLogin(View v)
{
this.tv_content.setText("");
//load login View
final View loginDialog = getLayoutInflater().inflate(R.layout.login_layout , null );
AlertDialog.Builder bud = new AlertDialog.Builder(MainActivity.this);
bud.setTitle("login");
bud.setView(loginDialog);
bud.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//get user info
final String name = ((EditText) loginDialog.findViewById(R.id.user)).getText().toString();
final String pass = ((EditText) loginDialog.findViewById(R.id.passed)).getText().toString();


new Thread() {
@Override
public void run() {
super.run();
String url = "http://192.168.1.101:8080/DemoLogin/LoginServlet";
HttpPost post = new HttpPost(url);//创建一个Post对象 , Step2,这个对象中含有请求的URL
List<NameValuePair> params = new ArrayList<NameValuePair>();//step<3.1> 构造请求参数

params.add(new BasicNameValuePair("user", name));
params.add(new BasicNameValuePair("pass", pass));

try {
//设置请求参数
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));Step3.2


HttpResponse response = httpClient.execute(post);//step4.1获取响应对象


if (response.getStatusLine().getStatusCode() == 200) {
String msg =EntityUtils.toString( response.getEntity());//step4.2获取响应的内容
Looper.prepare();
Toast.makeText(MainActivity.this , msg, Toast.LENGTH_LONG).show();
Looper.loop();//等待循环
}

} catch (Exception e) {
e.printStackTrace();
}


}
}.start(); //开启线程

}
});

bud.setNegativeButton("cancel " , null);
bud.show();



}


public void showRegister(View v)
{


}
}
 
====================================================================================
 
如图: 这是在浏览器中访问的数据结果:
image
android 客户端:

ATM@]CS10{R}DKHG}]$ER6U

不输入任何用户信息
 

}9[@KY`)KRTX[H_TK(2I$TH

 

=============================>此时 发现android中的Toast显示的数据 和反问浏览器时的数据一致  说明:  我们这条道路走通了

 
 
 
posted @ 2015-07-23 14:38  修雨轩陈  阅读(818)  评论(0编辑  收藏  举报