android之http通讯,

来源:互联网 发布:儿童教育软件推荐 编辑:程序博客网 时间:2024/05/21 06:59

 

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

 


            

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

  

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

 


            

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



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

 


            

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



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

 


            

  1. String httpUrl = "http://192.168.1.110:8080/httpget.jsp";
  2. //获得的数据
  3. String resultData = "";
  4. URL url = null;
  5. try
  6. {
  7. //构造一个URL对象
  8. url = new URL(httpUrl);
  9. }
  10. catch (MalformedURLException e)
  11. {
  12. Log.e(DEBUG_TAG, "MalformedURLException");
  13. }
  14. if (url != null)
  15. {
  16. try
  17. {
  18. // 使用HttpURLConnection打开连接
  19. HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
  20. //因为这个是post请求,设立需要设置为true
  21. urlConn.setDoOutput(true);
  22. urlConn.setDoInput(true);
  23. // 设置以POST方式
  24. urlConn.setRequestMethod("POST");
  25. // Post 请求不能使用缓存
  26. urlConn.setUseCaches(false);
  27. urlConn.setInstanceFollowRedirects(true);
  28. // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
  29. urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
  30. // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
  31. // 要注意的是connection.getOutputStream会隐含的进行connect。
  32. urlConn.connect();
  33. //DataOutputStream流
  34. DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());
  35. //要上传的参数
  36. String content = "par=" + URLEncoder.encode("ABCDEFG", "gb2312");
  37. //将要上传的内容写入流中
  38. out.writeBytes(content);
  39. //刷新、关闭
  40. out.flush();
  41. out.close();



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

 


            

  1. // http地址
  2. String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get";
  3. //HttpGet连接对象
  4. HttpGet httpRequest = new HttpGet(httpUrl);
  5. //取得HttpClient对象
  6. HttpClient httpclient = new DefaultHttpClient();
  7. //请求HttpClient,取得HttpResponse
  8. HttpResponse httpResponse = httpclient.execute(httpRequest);
  9. //请求成功
  10. if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
  11. {
  12. //取得返回的字符串
  13. String strResult = EntityUtils.toString(httpResponse.getEntity());
  14. mTextView.setText(strResult);
  15. }
  16. else
  17. {
  18. mTextView.setText("请求错误!");
  19. }
  20. }



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

 


            

  1. // http地址
  2. String httpUrl = "http://192.168.1.110:8080/httpget.jsp";
  3. //HttpPost连接对象
  4. HttpPost httpRequest = new HttpPost(httpUrl);
  5. //使用NameValuePair来保存要传递的Post参数
  6. List<NameValuePair> params = new ArrayList<NameValuePair>();
  7. //添加要传递的参数
  8. params.add(new BasicNameValuePair("par", "HttpClient_android_Post"));
  9. //设置字符集
  10. HttpEntity httpentity = new UrlEncodedFormEntity(params, "gb2312");
  11. //请求httpRequest
  12. httpRequest.setEntity(httpentity);
  13. //取得默认的HttpClient
  14. HttpClient httpclient = new DefaultHttpClient();
  15. //取得HttpResponse
  16. HttpResponse httpResponse = httpclient.execute(httpRequest);
  17. //HttpStatus.SC_OK表示连接成功
  18. if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
  19. {
  20. //取得返回的字符串
  21. String strResult = EntityUtils.toString(httpResponse.getEntity());
  22. mTextView.setText(strResult);
  23. }
  24. else
  25. {
  26. mTextView.setText("请求错误!");
  27. }
  28. }

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

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

 

这里有一个非常棒的http通讯的总结,我看了以后茅塞顿开。

先贴代码:

01publicclassActivity1extendsActivity {
02 
03   privatefinalString DEBUG_TAG = "System.out";
04 
05   privateTextView mTextView;
06   privateButton mButton;
07 
08   protectedvoidonCreate(Bundle savedInstanceState) {
09       super.onCreate(savedInstanceState);
10       setContentView(R.layout.main);
11 
12       mTextView = (TextView) findViewById(R.id.TextView01);
13       mButton = (Button) findViewById(R.id.Button01);
14       mButton.setOnClickListener(newhttpListener());
15   }
16 
17   // 设置按钮监听器
18   classhttpListenerimplementsOnClickListener {
19       publicvoidonClick(View v) {
20           refresh();
21       }
22   }
23 
24   privatevoidrefresh() {
25       String httpUrl = "http://192.168.0.101:8080/Test/test.jsp";
26       // URL可以加参数
27       // String httpUrl =
28       // "http://192.168.0.101:8080/Test/test.jsp?par=abcdefg";
29       String resultData = "";
30       URL url = null;
31       try{
32           // 创建一个URL对象
33           url = newURL(httpUrl);
34       }catch(MalformedURLException e) {
35           Log.d(DEBUG_TAG,"create URL Exception");
36       }
37       // 声明HttpURLConnection对象
38       HttpURLConnection urlConn = null;
39       // 声明InputStreamReader对象
40       InputStreamReader in = null;
41       // 声明BufferedReader对象
42       BufferedReader buffer = null;
43       String inputLine = null;
44       if(url != null) {
45           try{
46               // 使用HttpURLConnection打开连接
47               urlConn = (HttpURLConnection) url.openConnection();
48               // 得到读取的内容(流)
49               in = newInputStreamReader(urlConn.getInputStream());
50               // 创建BufferReader对象,输出时候用到
51               buffer = newBufferedReader(in);
52               // 使用循环来读取数据
53               while((inputLine = buffer.readLine()) != null) {
54                   // 在每一行后面加上换行
55                   resultData += inputLine + "\n";
56               }
57               // 设置显示取的的内容
58               if(resultData != null&& !resultData.equals("")) {
59                   mTextView.setText(resultData);
60               }else{
61                   mTextView.setText("读取的内容为空");
62               }
63           }catch(IOException e) {
64               e.printStackTrace();
65           }finally{
66               try{
67                   // 关闭InputStreamReader
68                   in.close();
69                   // 关闭URL连接
70                   urlConn.disconnect();
71               }catch(IOException e) {
72                   e.printStackTrace();
73               }
74           }
75       }else{
76           Log.d(DEBUG_TAG,"URL is NULL");
77       }
78   }
79}


第二种方式:

001publicclassActivity2extendsActivity {
002 
003   privatefinalString DEBUG_TAG = "System.out";
004 
005   privateTextView mTextView;
006   privateButton mButton;
007 
008   protectedvoidonCreate(Bundle savedInstanceState) {
009       super.onCreate(savedInstanceState);
010       setContentView(R.layout.main);
011 
012       mTextView = (TextView) findViewById(R.id.TextView01);
013       mButton = (Button) findViewById(R.id.Button01);
014       mButton.setOnClickListener(newhttpListener());
015   }
016 
017   // 设置按钮监听器
018   classhttpListenerimplementsOnClickListener {
019       publicvoidonClick(View v) {
020           refresh();
021       }
022   }
023 
024   privatevoidrefresh() {
025       String httpUrl = "http://192.168.0.101:8080/Test/test.jsp";
026       String resultData = "";
027       URL url = null;
028       try{
029           // 创建一个URL对象
030           url = newURL(httpUrl);
031       }catch(MalformedURLException e) {
032           Log.d(DEBUG_TAG,"create URL Exception");
033       }
034       // 声明HttpURLConnection对象
035       HttpURLConnection urlConn = null;
036       // 声明InputStreamReader对象
037       InputStreamReader in = null;
038       // 声明BufferedReader对象
039       BufferedReader buffer = null;
040       String inputLine = null;
041       // 声明DataOutputStream流
042       DataOutputStream out = null;
043       if(url != null) {
044           try{
045               // 使用HttpURLConnection打开连接
046               urlConn = (HttpURLConnection) url.openConnection();
047               // 因为这个是POST请求所以要设置为true
048               urlConn.setDoInput(true);
049               urlConn.setDoOutput(true);
050               // 设置POST方式
051               urlConn.setRequestMethod("POST");
052               // POST请求不能设置缓存
053               urlConn.setUseCaches(false);
054               urlConn.setInstanceFollowRedirects(false);
055               // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
056               urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
057               // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成
058               // 要注意的是connectio.getOutputStream会隐含的进行connect
059               urlConn.connect();
060               // DataOutputStream流
061               out = newDataOutputStream(urlConn.getOutputStream());
062               String content = "par="+ URLEncoder.encode("abcdefg","gb2312");
063               // 将要上传的内容写入流中
064               out.writeBytes(content);
065               // 得到读取的内容(流)
066               in = newInputStreamReader(urlConn.getInputStream());
067               // 创建BufferReader对象,输出时候用到
068               buffer = newBufferedReader(in);
069               // 使用循环来读取数据
070               while((inputLine = buffer.readLine()) != null) {
071                   // 在每一行后面加上换行
072                   resultData += inputLine + "\n";
073               }
074               // 设置显示取的的内容
075               if(resultData != null&& !resultData.equals("")) {
076                   mTextView.setText(resultData);
077               }else{
078                   mTextView.setText("读取的内容为空");
079               }
080           }catch(IOException e) {
081               e.printStackTrace();
082           }finally{
083               try{
084                   // 刷新DataOutputStream流
085                   out.flush();
086                   // 关闭DataOutputStream流
087                   out.close();
088                   // 关闭InputStreamReader
089                   in.close();
090                   // 关闭URL连接
091                   urlConn.disconnect();
092               }catch(IOException e) {
093                   e.printStackTrace();
094               }
095           }
096       }else{
097           Log.d(DEBUG_TAG,"URL is NULL");
098       }
099   }
100}

第三种方式

01publicclassActivity3extendsActivity{
02   privateTextView mTextView;
03   privateButton mButton;
04 
05   protectedvoidonCreate(Bundle savedInstanceState) {
06       super.onCreate(savedInstanceState);
07       setContentView(R.layout.main);
08       mTextView = (TextView) findViewById(R.id.TextView01);
09       mButton = (Button) findViewById(R.id.Button01);
10       mButton.setOnClickListener(newhttpListener());
11   }
12 
13   // 设置按钮监听器
14   classhttpListenerimplementsOnClickListener {
15       publicvoidonClick(View v) {
16           String httpUrl = "http://192.168.0.101:8080/Test/test.jsp?par=HttpClient_android_Get";
17           // HttpGet连接对象
18           HttpGet httpRequest = newHttpGet(httpUrl);
19           try{
20               // 取的HttpClient对象
21               HttpClient httpclient = newDefaultHttpClient();
22               // 请求HttpClient,取的HttpResponse
23               HttpResponse httpResponse = httpclient.execute(httpRequest);
24               // 请求成功
25               if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
26                   // 取的返回的字符串
27                   String strResult = EntityUtils.toString(httpResponse.getEntity());
28                   // 这个返回值可能会在行尾出现小方格
29                   // 在TextView要显示的文字过滤掉回车符("\r")就可以正常显示了。
30                   String strsResult = strResult.replace("\r","");
31                   mTextView.setText(strsResult);
32               }else{
33                   mTextView.setText("请求错误");
34               }
35           }catch(ClientProtocolException e) {
36               mTextView.setText(e.getMessage().toString());
37           }catch(IOException e) {
38               mTextView.setText(e.getMessage().toString());
39           }catch(Exception e) {
40               mTextView.setText(e.getMessage().toString());
41           }
42       }
43   }
44}

第四种方式

01publicclassActivity4extendsActivity{
02   privateTextView mTextView;
03   privateButton mButton;
04 
05   protectedvoidonCreate(Bundle savedInstanceState) {
06       super.onCreate(savedInstanceState);
07       setContentView(R.layout.main);
08       mTextView = (TextView) findViewById(R.id.TextView01);
09       mButton = (Button) findViewById(R.id.Button01);
10       mButton.setOnClickListener(newhttpListener());
11   }
12 
13   // 设置按钮监听器
14   classhttpListenerimplementsOnClickListener {
15       publicvoidonClick(View arg0) {
16           String httpUrl = "http://192.168.0.101:8080/Test/test.jsp";
17           // 创建HttpPost连接对象
18           HttpPost httpRequest = newHttpPost(httpUrl);
19           // 使用NameValuePair来保存要传递的Post参数
20           List params = newArrayList();
21           // 添加要传递的参数
22           params.add(newBasicNameValuePair("par","HttpClient_android_Post"));
23           try{
24               // 设置字符集
25               HttpEntity httpentity = newUrlEncodedFormEntity(params,"gb2312");
26               // 请求httpRequest
27               httpRequest.setEntity(httpentity);
28               // 取的默认的HttpClient
29               HttpClient httpclient = newDefaultHttpClient();
30               // 取的HttpResponse
31               HttpResponse httpResponse = httpclient.execute(httpRequest);
32               // HttpStatus.SC_OK表示连接成功
33               if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
34                   // 取的返回的字符串
35                   String strResult = EntityUtils.toString(httpResponse.getEntity());
36                   // 这个返回值可能会在行尾出现小方格
37                   // 在TextView要显示的文字过滤掉回车符("\r")就可以正常显示了。
38                   String strsResult = strResult.replace("\r","");
39                   mTextView.setText(strsResult);
40               }else{
41                   mTextView.setText("请求错误");
42               }
43           }catch(ClientProtocolException e) {
44               mTextView.setText(e.getMessage().toString());
45           }catch(IOException e) {
46               mTextView.setText(e.getMessage().toString());
47           }catch(Exception e) {
48               mTextView.setText(e.getMessage().toString());
49           }
50       }
51   }
52}
0 0
原创粉丝点击