Android传统HTTP请求get----post方式提交数据(包括乱码问题)
1.模仿登入页面显示(使用传统方式是面向过程的)
使用Apache公司提供的HttpClient API是面向对象的
(文章底部含有源码的连接,包括了使用async框架)
(解决中文乱码的问题。主要是对中文的数据进行URL编码)
android手机默认的编码是UTF-8
2.手机截图Demo
3.server截图
代码例如以下:
server端的代码:
//測试 android设备登入
public class Login extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String username = request.getParameter("username");
String password = request.getParameter("password"); //对数据进行编码,解决乱码问题
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("username--:"+username+"---password:"+password); if(username.equals("admin") && password.equals("123")){
response.getOutputStream().write("登入成功".getBytes("UTF-8"));
}else{
response.getOutputStream().write("登入失败".getBytes("UTF-8"));
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// request.setCharacterEncoding("UTF-8");
doGet(request, response); } }
Androidclient
布局文件的部分:
//測试 android设备登入
public class Login extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String username = request.getParameter("username");
String password = request.getParameter("password"); //对数据进行编码,解决乱码问题
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("username--:"+username+"---password:"+password); if(username.equals("admin") && password.equals("123")){
response.getOutputStream().write("登入成功".getBytes("UTF-8"));
}else{
response.getOutputStream().write("登入失败".getBytes("UTF-8"));
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// request.setCharacterEncoding("UTF-8");
doGet(request, response); } }
Activity代码部分:
(注意:android4.0之后訪问网络必须开子线程进行訪问,而且涉及到权限。记得加上訪问网络的权限
以下的代码中,我写入get和post两种方式的线程请求。。
。。。。。
。。。
。。。慢慢体会
)
public class MainActivity extends AppCompatActivity {
    private static final int SUCCESS = 0;
    private static final int FAILE = 1;
    private static final int NET_ERROR = 3;
    private static final String TAG = "MainActivity";
    EditText et_username;
    EditText et_password;
    TextView show_result;
    String username;
    String password;
    final String path = "http://188.188.7.85/Android_Server/Login";
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            int what = msg.what;
            switch (what) {
                case SUCCESS:
                    String data = (String) msg.obj;
                    show_result.setText(data);
                    break;
                case FAILE:
                    Toast.makeText(MainActivity.this, "连接server失败", Toast.LENGTH_SHORT).show();
                    break;
                case NET_ERROR:
                    Toast.makeText(MainActivity.this, "网络出现异常", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_username = (EditText) findViewById(R.id.et_username);
        et_password = (EditText) findViewById(R.id.et_password);
        show_result = (TextView) findViewById(R.id.show_result);
        username = et_username.getText().toString().trim();
        password = et_password.getText().toString().trim();
    }
    public void login(View view) {
        username = et_username.getText().toString().trim();
        password = et_password.getText().toString().trim();
        if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
            Toast.makeText(this, "username与password不能为空", Toast.LENGTH_SHORT).show();
            return;
        }
        //使用传统get方式的请求server
//        new Thread_get().start();
        //使用传统的post方式请求server
        new Thread_post().start();
    }
    //传统的post方式请求server端
    class Thread_post extends Thread {
        @Override
        public void run() {
            try {
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                //1.设置请求方式
                conn.setRequestMethod("POST");
                conn.setConnectTimeout(5000); //设置连接的超时事件是5秒
                //2.组合数据,一定要将数据进行URL编码
                String commitData = "username="+URLEncoder.encode(username,"UTF-8")+"&password="+URLEncoder.encode(password,"UTF-8");
                // 3. 指定content-type -实际上就是指定传输的数据类型
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                //4.指定content-length Content-Length: 数据的长度
                conn.setRequestProperty("Content-Length", commitData.length() + "");
                //5.打开输出流。告诉server,我要写数据了
                conn.setDoOutput(true);
                //6.開始写数据
                OutputStream os = conn.getOutputStream();
                os.write(commitData.getBytes());
//                os.close();
                int code = conn.getResponseCode();  //获取返回的成功代码
                Log.i(TAG, "code:---" + code);
                if (code == 200) {
                    //表示连接server成功返回信息
                    String data = ServerTools.getInfo(conn.getInputStream());
                    Log.i(TAG, "data:---" + data);
                    //使用消息处理机制,将数据传递给主线程
                    Message ms = new Message();
                    ms.what = SUCCESS;
                    ms.obj = data;
                    handler.sendMessage(ms);
                } else {
                    //使用消息处理机制,将数据传递给主线程
                    Message ms = new Message();
                    ms.what = FAILE;
                    handler.sendMessage(ms);
                }
            } catch (Exception e) {
                //使用消息处理机制,将数据传递给主线程
                Message ms = new Message();
                ms.what = NET_ERROR;
                handler.sendMessage(ms);
                e.printStackTrace();
            }
        }
    }
    //传统的get方式请求server端
    class Thread_get extends Thread {
        @Override
        public void run() {
            try {
                String getPath = path +
                        "?username=" + URLEncoder.encode(username, "UTF-8") +
                        "&password=" + URLEncoder.encode(password, "UTF-8");
                URL url = new URL(getPath);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(5000); //设置连接的超时事件是5秒
                int code = conn.getResponseCode();  //获取返回的成功代码
                Log.i(TAG, "code:---" + code);
                ;
                if (code == 200) {
                    //表示连接server成功返回信息
                    String data = ServerTools.getInfo(conn.getInputStream());
                    Log.i(TAG, "data:---" + data);
                    //使用消息处理机制,将数据传递给主线程
                    Message ms = new Message();
                    ms.what = SUCCESS;
                    ms.obj = data;
                    handler.sendMessage(ms);
                } else {
                    //使用消息处理机制,将数据传递给主线程
                    Message ms = new Message();
                    ms.what = FAILE;
                    handler.sendMessage(ms);
                }
            } catch (Exception e) {
                //使用消息处理机制,将数据传递给主线程
                Message ms = new Message();
                ms.what = NET_ERROR;
                handler.sendMessage(ms);
                e.printStackTrace();
            }
        }
    }
}
工具类:
public class ServerTools {
    //从服务端获取流数据进行转化成文本文件
    public static String getInfo(InputStream in) {
        //将数据流写在内存中
        ByteArrayOutputStream raf = new ByteArrayOutputStream();
        String data = null;
        try{
            byte[] bt = new byte[1024];
            int len =0 ;
            while((len = in.read(bt)) != -1){
                raf.write(bt,0,len);
            }
           data = raf.toString();
        }catch (Exception e){
            e.printStackTrace();
        }
        return data;
    }
}
Android的源码已经放在github中:
传统方式Demo地址:https://github.com/momxmo/HTTP_get_post
Apache提供的HttpClient API面向对象的方式Demo:https://github.com/momxmo/HttpClient_get_post
使用async-http-master流行框架进行http请求:https://github.com/momxmo/Http_android-async-http-master_Demo
Android传统HTTP请求get----post方式提交数据(包括乱码问题)的更多相关文章
- Android HttpClient框架get和post方式提交数据(非原创)
		1.fragment_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android& ... 
- Android 采用post方式提交数据到服务器
		接着上篇<Android 采用get方式提交数据到服务器>,本文来实现采用post方式提交数据到服务器 首先对比一下get方式和post方式: 修改布局: <LinearLayout ... 
- Android(java)学习笔记213:开源框架post和get方式提交数据(qq登录案例)
		1.前面提到Http的get/post方式 . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2.Android应用会经常使用http协议进行传输,网上会有很完善 ... 
- Android 使用Post方式提交数据(登录)
		在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持. 在HTTP通信中使用最多的就是GET和POS ... 
- Android 使用Post方式提交数据
		在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持. 在HTTP通信中使用最多的就是GET和POS ... 
- Android(java)学习笔记156:开源框架post和get方式提交数据(qq登录案例)
		1. 前面提到Http的get/post方式 . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2. Android应用会经常使用http协议进行传输,网上会有很 ... 
- Android学习之Http使用Post方式进行数据提交(普通数据和Json数据)
		转自:http://blog.csdn.net/wulianghuan/article/details/8626551 我们知道通过Get方式提交的数据是作为Url地址的一部分进行提交,而且对字节数的 ... 
- 苹果微信浏览器不能post方式提交数据问题
		form表单中采用post方式提交数据时,在苹果的微信浏览器中无法传递,安卓的可以 如图: 在controller中获取该数据为 null 将表单的提交方式修改为get就能够获取到 现在采用Ajax方 ... 
- postman 中post方式提交数据
		post方式提交数据时,把参数填写在body中而不是pOST下面的哪一行 
随机推荐
- 杂项:Web API
			ylbtech-杂项:Web API 今天的web计算平台包含了广泛的功能,其中的大部分均可以通过API(应用程序编程接口)访问. 从简单的社会书签服务del.icio.us,到复杂得多的amazon ... 
- dijkstra的stl实现(最近觉得挺方便的
			dijkstra的stl实现(最近觉得挺方便的 stl可作为跳板 --- Rujia liu struct node { int dis, id; node(int dis = 0, int id = ... 
- 使用 CSS 追踪用户
			原文地址:Crooked Style Sheets 作者:jbtronics 除了使用 JS 追踪用户,现在有人提出了还可以使用 CSS 进行网页追踪和分析,译者认为,这种方式更为 优雅,更为 简洁, ... 
- CentOS7.5 AndroidStudio Debug报错:insufficient permissions for device
			/ ::: Launching instantapp $ adb push /home/vevi/AndroidStudioProjects/WeChatGod/app/build/outputs/a ... 
- Css打造一个简单的静态七巧板
			偶然在微博上看到用css写一个七巧板,正好也有一些源代码,于是就试着敲了敲. 主要是利用了css3的transform,实现平移,旋转,变形,直接用看到的代码敲出来之后有些问题,因为宽度上下面绿色的三 ... 
- telerik:RadAsyncUpload 使用 时不执行上传事件的解决办法AsyncUpload1_FileUploaded(object sender, FileUploadedEventArgs e)
			一般是因为web.config没有配置的原因! 只要在<handlers>下加上 <add name="Telerik.Web.UI.WebResource" v ... 
- Deutsch lernen (12)
			1. hinweisen - wies hin - hingewiesen 向...指出,指明 auf etw.(A) hinweisen Ich möchte (Sie) darauf hiweis ... 
- 两款工作流JBPM和CCBPM的对比
			以国外流行的工作流jbpm4的模式与当今中国开源的ccbpm(ccflow和jflow的总称)流程引擎对照.以便让各位能够了解到中国国情的工作流引擎与国际流行的设计规则的差别.不同.与优缺点. 国外工 ... 
- 【技术累积】【点】【编程】【13】XX式编程
			(原)函数式编程 核心概念 函数式一等公民(输入输出啥的都可以是函数): 纯函数,固定输入带来固定输出: 阅读性良好,无并发问题,但效率偏低: 大历史背景 旨在描述问题如何计算: 有两位巨擘对问题的可 ... 
- jq 跨域请求
			//使用getJSON <script type="text/javascript"> $(function () { $("#btn2").cli ... 
