zoukankan      html  css  js  c++  java
  • android两种基本联网方式与一种第三方开源项目的使用

    安卓请求网络的三种方式
    在请求网络的时候一般常用的提交方式是post或者get请求,post请求安全,传输大小无限制,但是代码量多些,get请求是浏览器有大小限制,用户提交的信息在浏览器的地址栏显示出来因此不安全
    Android中联网请求需要添加权限,4.0以后需要开启一个线程,在网络请求的时候都是以流的方式传输的
    第一步使用系统URL的方式联网
    (熟练地了解,当服务器需要传入特殊的请求头时候需要使用这种)
     
    get
    关于names与passwords是用户输入要提交的数据
    // 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
    关于names与passwords是用户输入要提交的数据 
    //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编码用户提交的数据这样中文就能够提交了,而且用户的信息有一些保障
    关于names与passwords是用户提交的数据
    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 = new DefaultHttpClient();
    //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 = new ArrayList<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包,导完后报错,一个市报名错误删除即可还有一个是没有导包,导入包即可使用 
    关于names与passwords是用户提交的数据 
    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 = new AsyncHttpClient();
    //3.进行get请求传入一个路径,与一个AsyncHttpResponseHandler响应线程
    ashttp.get(path,new AsyncHttpResponseHandler() {
    //请求成功的回调方法
    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
    //responseBody服务器返回的正文statusCode服务器返回的状态码,  Header服务器返回的响应头信息
    try {
    Toast.makeText(MainActivity.this,new String(responseBody,"gbk"), 0).show();
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    }
    //请求失败回调的方法
    @Override
    public void onFailure(int statusCode, Header[] headers,
    byte[] responseBody, Throwable error) {
    Toast.makeText(MainActivity.this,new String(responseBody), 0).show();
    }
    });
    Post
    String path = "http://172.17.25.55:8080/login/LoginServlet";
    // 创建一个asynchttp
    AsyncHttpClient ashttp = new AsyncHttpClient();
    //准备请求体内容
    RequestParams params = new RequestParams();
    params.put("username", names);
    params.put("password", passwords);
    //请求一个post请求
    ashttp.post(path, params ,new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
    try {
    Toast.makeText(MainActivity.this,new String(responseBody, "gbk"), 0).show();
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    @Override
    public void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) {
    Toast.makeText(MainActivity.this, new String(responseBody),0).show();
    }
    });
  • 相关阅读:
    第十章 嵌入式Linux的调试技术
    第九章 硬件抽象层:HAL
    第八章 让开发板发出声音:蜂鸣器驱动
    第八章GPS与Google Map定位系统
    第六章 接口驱动程序开发
    第七章 Android嵌入式组态软件
    第五章 S5PV210硬件结构
    第四章
    第三章
    第二章
  • 原文地址:https://www.cnblogs.com/youshashuosha/p/5632222.html
Copyright © 2011-2022 走看看