Android网络编程之使用get方式向服务端提交数据和乱码问题的解决

学习javaweb的时候都知道向服务端提交数据有两种方式,get和post。今天学习了在Android客户端使用get方式提交登录数据的小案例。
  • 步骤:

    • 先新建一个web项目,搭建一个简单的登录表单界面
    • 简单登录界面
    • 设置好用户名和密码,点击登录的时候会显示登录成功或者失败,这里就不在贴Servlet和jsp的代码了。在这里我设置用户名为”小强”,密码为123.
    • 设置安卓的布局,两个EditView和一个Button。点击Button的时候会弹出一个吐司显示登录成功或者失败
  • 乱码问题:
    使用浏览器打开这个表单界面的时候,用户名内容如果是中文字符“小强”,那么在用户名和密码都正确的情况下,点击登录后显示的信息会是看不懂的乱码。把码表都改成utf-8之后可以正确显示,但是却显示的是登录失败!因为浏览器提交数据的时候使用的是utf-8,而服务器使用ISO-8859-1的方式自然就把用户名“小强”解析成了乱码封装了,所以登录才会失败的。
    解决办法:

 name = new String(name.getBytes("ISO-8859-1"),"utf-8");

这样浏览器端的乱码问题就解决了,下面看Android客户端。
当用户名使用中文提交的时候,你会发现用户名“小强”和密码“123”,都写对了,但是还是提示登录失败。

这是因为,浏览器在提交表单数据的时候,会把用户名”小强”进行一次URL编码,我们可以在地址栏中清晰的看出

http://192.168.252.1:8080/web/LoginServletname=%E5%B0%8F%E5%BC%BA&password=123

name被URL编码了。所以,我们在安卓客户端进行提交数据的时候也要对name进行URL编码,如下:

//提交的数据需要进行URL编码,字母和数字编码后都不变
String path = "http://192.168.252.1:8080/web/LoginServlet?name="+URLEncoder.encode(name)+"&password="+pass;

这样就可以解决用户名为中文字符时及时用户名密码都正确却显示登录不成功的问题。
* 部分代码

//布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}"
    android:orientation="vertical"
     >

    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名"
        />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="登录"
        />


</LinearLayout>
  • 现在开始写按钮的点击事件click()方法,主要注意一下几点
    • 开启网络连接的步骤
    • 网络编程的权限设置
    • 刷新UI只能在主线程内设置,所以要使用消息队列机制,开启一个子线程运行其他代码
public class MainActivity extends Activity {    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //刷新主线程
    @SuppressLint("HandlerLeak")
    Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            Toast.makeText(MainActivity.this, (String) msg.obj, 0).show();
        };
    };


    public void click(View v){
        EditText et_name = (EditText) findViewById(R.id.et_name);
        EditText et_password = (EditText) findViewById(R.id .et_password);

        final String name = et_name.getText().toString();
        final String pass = et_password.getText().toString();

        Thread t = new Thread(){
            @Override
            public void run() {
                //提交的数据需要进行URL编码,字母和数字编码后都不变
                String path = "http://192.168.252.1:8080/web/LoginServlet?name="+URLEncoder.encode(name)+"&password="+pass;
                try {
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setReadTimeout(5000);
                    conn.setConnectTimeout(5000);

                    if(conn.getResponseCode() == 200){
                        InputStream is = conn.getInputStream();
                        String text = utils.getTextFromStream(is);

                        //消息队列机制,把读取出来的数据交给handler发送给主线程刷新UI
                        Message msg = handler.obtainMessage();
                        msg.obj = text;
                        handler.sendMessage(msg);
                    }                   
                } catch (Exception e) {
                    e.printStackTrace();
                }               
            }

        };
        t.start();      
    }
}
中文乱码问题着实让人头疼,写得有点乱,有不对的地方欢迎指正
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_kayce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值