• Android 网络编程之Http通信


        Android中提供的HttpURLConnection和HttpClient接口可以用来开发HTTP程序。以下是本人在学习中的总结与归纳。
    1. HttpURLConnection接口
        首先需要明确的是,Http通信中的POST和GET请求方式的不同。GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而POST方法的参数是放在Http请求中。因此,在编程之前,应当首先明确使用的请求方法,然后再根据所使用的方式选择相应的编程方式。
        HttpURLConnection是继承于URLConnection类,二者都是抽象类。其对象主要通过URL的openConnection方法获得。创建方法如下代码所示:

    URL url = new URL("http://www.51cto.com/index.jsp?par=123456");  
    HttpURLConnection urlConn=(HttpURLConnection)url.openConnection(); 

    通过以下方法可以对请求的属性进行一些设置,如下所示:

    //设置输入和输出流  
    urlConn.setDoOutput(true);  
    urlConn.setDoInput(true);  
    //设置请求方式为POST  
    urlConn.setRequestMethod("POST");  
    //POST请求不能使用缓存  
    urlConn.setUseCaches(false);  
    //关闭连接  
    urlConn.disConnection(); 

    HttpURLConnection默认使用GET方式,例如下面代码所示:

    //使用HttpURLConnection打开连接  
    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
    //得到读取的内容(流)  
    InputStreamReader in = new InputStreamReader(urlConn.getInputStream());  
    // 为输出创建BufferedReader  
    BufferedReader buffer = new BufferedReader(in);  
    String inputLine = null;  
    //使用循环来读取获得的数据  
    while (((inputLine = buffer.readLine()) != null))  
    {  
        //我们在每一行后面加上一个"\n"来换行  
        resultData += inputLine + "\n";  
    }           
    //关闭InputStreamReader  
    in.close();  
    //关闭http连接  
    urlConn.disconnect(); 

     如果需要使用POST方式,则需要setRequestMethod设置。代码如下:

            String httpUrl = "http://192.168.1.110:8080/httpget.jsp";  
            //获得的数据  
            String resultData = "";  
            URL url = null;  
            try 
            {  
                //构造一个URL对象  
                url = new URL(httpUrl);   
            }  
            catch (MalformedURLException e)  
            {  
                Log.e(DEBUG_TAG, "MalformedURLException");  
            }  
            if (url != null)  
            {  
                try 
                {  
                    // 使用HttpURLConnection打开连接  
                    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
                    //因为这个是post请求,设立需要设置为true  
                    urlConn.setDoOutput(true);  
                    urlConn.setDoInput(true);  
                    // 设置以POST方式  
                    urlConn.setRequestMethod("POST");  
                    // Post 请求不能使用缓存  
                    urlConn.setUseCaches(false);  
                    urlConn.setInstanceFollowRedirects(true);  
                    // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的  
                    urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
                    // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,  
                    // 要注意的是connection.getOutputStream会隐含的进行connect。  
                    urlConn.connect();  
                    //DataOutputStream流  
                    DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());  
                    //要上传的参数  
                    String content = "par=" + URLEncoder.encode("ABCDEFG", "gb2312");  
                    //将要上传的内容写入流中  
                    out.writeBytes(content);   
                    //刷新、关闭  
                    out.flush();  
                    out.close();  

    2. HttpClient接口
        使用Apache提供的HttpClient接口同样可以进行HTTP操作。
        对于GET和POST请求方法的操作有所不同。GET方法的操作代码示例如下:

            // http地址  
            String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get";  
            //HttpGet连接对象  
            HttpGet httpRequest = new HttpGet(httpUrl);  
             //取得HttpClient对象  
            HttpClient httpclient = new DefaultHttpClient();  
            //请求HttpClient,取得HttpResponse  
            HttpResponse httpResponse = httpclient.execute(httpRequest);  
            //请求成功  
            if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)  
            {  
                    //取得返回的字符串  
                    String strResult = EntityUtils.toString(httpResponse.getEntity());  
                    mTextView.setText(strResult);  
            }  
            else 
            {  
                    mTextView.setText("请求错误!");  
            }  
            } 

        使用POST方法进行参数传递时,需要使用NameValuePair来保存要传递的参数。,另外,还需要设置所使用的字符集。代码如下所示:

    // http地址  
            String httpUrl = "http://192.168.1.110:8080/httpget.jsp";  
            //HttpPost连接对象  
            HttpPost httpRequest = new HttpPost(httpUrl);  
            //使用NameValuePair来保存要传递的Post参数  
            List<NameValuePair> params = new ArrayList<NameValuePair>();  
            //添加要传递的参数  
            params.add(new BasicNameValuePair("par", "HttpClient_android_Post"));  
            //设置字符集  
                HttpEntity httpentity = new UrlEncodedFormEntity(params, "gb2312");  
                //请求httpRequest  
                httpRequest.setEntity(httpentity);  
                //取得默认的HttpClient  
                HttpClient httpclient = new DefaultHttpClient();  
                //取得HttpResponse  
                HttpResponse httpResponse = httpclient.execute(httpRequest);  
                //HttpStatus.SC_OK表示连接成功  
                if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)  
                {  
                    //取得返回的字符串  
                    String strResult = EntityUtils.toString(httpResponse.getEntity());  
                    mTextView.setText(strResult);  
                }  
                else 
                {  
                    mTextView.setText("请求错误!");  
                }  
            } 

        HttpClient实际上是对Java提供方法的一些封装,在HttpURLConnection中的输入输出流操作,在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse,这样,就减少了操作的繁琐性。

        另外,在使用POST方式进行传输时,需要进行字符编码。

  • 相关阅读:
    HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】
    POJ Problem 2367 Genealogical tree【拓扑排序】
    HDU Problem 2647 Reward【拓扑排序】
    HDU Problem 1285 确定比赛名次【拓扑排序】
    HDU Problem HDU Today 【最短路】
    HDU Problem 3665 Seaside【最短路】
    HDU Problem 一个人的旅行 【最短路dijkstra】
    HDU Problem 1596 find the safest road【最短路dijkstra】
    Beyond Compare文本合并进行内容替换要注意什么
    用这些工具都可以比较代码的差异
  • 原文地址:https://www.cnblogs.com/waddell/p/3393031.html
Copyright © 2020-2023  润新知