HTTP 协议概念 GET and POST 请求

来源:互联网 发布:域名赚钱 编辑:程序博客网 时间:2024/05/20 05:07

在请求网络的时候一般常用的提交方式是post或者get请求,post请求安全,传输大小无限制,但是代码量多些,get请求是浏览器有大小限制,用户提交的信息在浏览器的地址栏显示出来因此不安全

在Android中联网请求需要添加权限,4.0以后需要开启一个线程,在网络请求的时候都是以流的方式传输的

第一步使用系统URL的方式联网

熟练地了解,当服务器需要传入特殊的请求头时候需要使用这种

get

 

关于namespasswords是用户输入要提交的数据

// 1.设置连接的网络地址,get请求就是拼接用户提交的内容到URL重点注意事项:在安卓测试中ip地址不可写localhost

因为安卓手机无法识别本地回环地址,必须是指定的ip地址,否则执行到获取响应码一行时不执行,不报错等,服务器拿不到提交的信息,也不会做出任何的反馈,所以执行到获取反馈时无任何执行

String path = "http://172.17.25.55:8080/login/LoginServlet?username="+ names +"&password=" + passwords;

// 2.创建一个URL的连接实例

URL url = new URL(path);

// 3.通过URL的连接实例打开一个连接强转成HttpURLConnection

HttpURLConnection httpurlconn = (HttpURLConnection)url.openConnection();

// 然后设置请求的方式,这里一定要大写,GET

httpurlconn.setRequestMethod("GET");

/ 利用强转后的连接设置请求响应超时

httpurlconn.setConnectTimeout(5000);

// 获取服务器返回的响应码

int responseCode = httpurlconn.getResponseCode();

// 如果响应码是200就是成功,206是部分成功,404找不到页面,504等是服务器内部错误

if (responseCode == 200) {

// 响应成功后拿到服务器返回的数据,服务器返回是以字节流的形式返回

InputStream ins = httpurlconn.getInputStream();

// 读取内容展示由于联网是需要开线程的而UI不允许子线程更新所以在UI线程写个方法在UI线程更新

}

post请求与get请求有几点不同黄色底色是不同之处

关于namespasswords是用户输入要提交的数据

 

//1.请求路径☆☆☆☆☆☆☆重点注意事项:在安卓测试中ip地址不可写localhost

因为安卓手机无法识别本地回环地址,必须是指定的ip地址,否则执行到获取响应码一行时不执行,不报错等,服务器拿不到提交的信息,也不会做出任何的反馈,所以执行到获取反馈时无任何执行

String path = "http://172.17.25.55:8080/login/";

// 2.创建一个URL的连接实例

URL url = new URL(path);

// 3.通过URL的连接实例打开一个连接强转成HttpURLConnection

HttpURLConnection con = (HttpURLConnection) url.openConnection();

// 利用强转后的连接设置请求响应超时

con.setConnectTimeout(5000);

// 然后设置请求的方式,这里一定要大写GET☆☆☆☆

con.setRequestMethod("POST");

// 请求体内容☆☆☆☆☆☆☆

String data = "username=" + names+"&password="+ passwords;

//请求方式是固定的必须这么写包括大小写这个是☆☆☆☆☆☆☆

con.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

//请求体(内容)的长度固定的必须这么写包括大小写这个是☆☆☆☆☆

con.setRequestProperty("Content-Length", data.length()+"");

con.setDoOutput(true);//设置一个标记允许输出数据☆☆☆☆☆

//写入数据把我们组拼好的数据提交给服务器以流的形式提交☆☆☆☆

con.getOutputStream().write(data.getBytes())

int responseCode = con.getResponseCode();

// 如果响应码是200就是成功,206是部分成功,404找不到页面,504等是服务器内部错误

if (responseCode == 200) {

// 响应成功后拿到服务器返回的数据,服务器返回是以字节流的形式返回

InputStream ins = httpurlconn.getInputStream();

// 读取内容展示由于联网是需要开线程的而UI不允许子线程更新所以在UI线程写个方法在UI线程更新

}

 

第二步使用系统结借鉴Alpha的封装好的类(了解即可)原因是请求头信息封装好了但是过于复杂,第三方完全可以更好的替代

//[2.1]定义get方式要提交的路径小细节如果提交中文要对name 和 pwd 进行一个urlencode 编码

Get

// 1.设置连接的网络地址,利用URLEncoder编码用户提交的数据这样中文就能够提交了,而且用户的信息有一些保障

关于namespasswords是用户提交的数据

String path ="http://172.17.25.55:8080/login/LoginServlet?username="+URLEncoder.encode(names,"utf-8") +"&password=" +URLEncoder.encode(passwords,"utf-8") ;

//2.获取httpclient实力直接new它的子类

DefaultHttpClient dehttp = newDefaultHttpClient();

//3.准备get请求

HttpGet get = new HttpGet(path);

//4.执行一个请求返回的是服务器响应结果

HttpResponse httpresponse = dehttp.execute(get);

//5.拿到服务器响应码

int statusCode =httpresponse.getStatusLine().getStatusCode();

if(statusCode==200){

//6.获取服务器返回的数据以实体的形式返回

InputStream content =httpresponse.getEntity().getContent();

//7.读取展示结果

}

Post

String path = "http://172.17.25.55:8080/login/LoginServlet";

//2.获取httpclient实力直接new他的子类

DefaultHttpClient dehttp = new DefaultHttpClient();

//3准备 post请求

HttpPost post = new HttpPost(path);

//4.开始准备post提交的正文,以键值对的形成

/4.1准备一个集合存放NameValuePair

List<NameValuePair>an =newArrayList<NameValuePair>();

//4.2创建NameValuePair子类实现是BasicNameValuePair

//创建需要提交的数据以key value的形式提交key是服务器根据去取的key

BasicNameValuePair bnp1 =new BasicNameValuePair("username",names);

BasicNameValuePair bnp2 =new BasicNameValuePair("password",passwords);

//4.3添加到集合中

an.add(bnp1);

an.add(bnp2);

//4.4准备entity实体 new一个子类实现UrlEncodedFormEntity

//UrlEncodedFormEntity需要的是一个List<? extends NameValuePair>

UrlEncodedFormEntity uf =new UrlEncodedFormEntity(an);

//4.5设置实体

post.setEntity(uf);

//5.执行一个请求返回的是服务器响应结果

HttpResponse httpresponse = dehttp.execute(post);

//6.拿到服务器响应码

int statusCode = httpresponse.getStatusLine().getStatusCode();

if(statusCode==200){

//7.获取服务器返回的数据以实体的形式返回

InputStream content = httpresponse.getEntity().getContent();

//8.读取展示结果

}

第三部使用开源项目Asynhttpclient(熟练掌握)

注意:使用Asynhttpclient需要导入第三方的com包,导完后报错,一个市报名错误删除即可还有一个是没有导包,导入包即可使用

关于namespasswords是用户提交的数据

Get

//1.设置连接的网络地址,利用URLEncoder编码用户提交的数据这样中文就能够提交了,而且用户的信息有一些保障           

String path = "http://172.17.25.55:8080/login/LoginServlet?username="

+ URLEncoder.encode(names,"utf-8") +"&password=" +URLEncoder.encode(passwords,"utf-8") ;

//2.创建一个asynchttp

AsyncHttpClient ashttp = newAsyncHttpClient();

//3.进行get请求传入一个路径,与一个AsyncHttpResponseHandler响应线程

ashttp.get(path,new AsyncHttpResponseHandler(){

//请求成功的回调方法

@Override

publicvoidonSuccess(int statusCode, Header[] headers, byte[]responseBody) {

//responseBody服务器返回的正文statusCode服务器返回的状态码, Header服务器返回的响应头信息

try {

Toast.makeText(MainActivity.this,newString(responseBody,"gbk"), 0).show();

} catch(UnsupportedEncodingException e) {

e.printStackTrace();

}

}

//请求失败回调的方法

@Override

    publicvoid onFailure(int statusCode, Header[]headers,

byte[] responseBody, Throwableerror) {

Toast.makeText(MainActivity.this,newString(responseBody), 0).show();

}

});

Post

String path = "http://172.17.25.55:8080/login/LoginServlet";

// 创建一个asynchttp

AsyncHttpClient ashttp = newAsyncHttpClient();

//准备请求体内容

RequestParams params = newRequestParams();

params.put("username", names);

params.put("password", passwords);

//请求一个post请求

ashttp.post(path, params ,newAsyncHttpResponseHandler() {

@Override

publicvoidonSuccess(int statusCode, Header[] headers, byte[]responseBody) {

try {

Toast.makeText(MainActivity.this,newString(responseBody,"gbk"), 0).show();

} catch(UnsupportedEncodingException e) {

e.printStackTrace();

    }

}

@Override

publicvoidonFailure(int statusCode, Header[] headers,byte[]responseBody, Throwable error) {

Toast.makeText(MainActivity.this,new String(responseBody),0).show();

}

});

0 0
原创粉丝点击