Java的Http网络通讯(Post,Get)

Java的Http网络通讯(Post,Get)

本文档为本人学习总结,义务提供,不作为商用,侵权请联系删除
本文档部分内容为转载,转载处在下会标明

服务器的简单搭建

首先让我们来搭建一个简单的JSP网站
简单JSP网站
以上网站在我们进行访问时,返回我们的访问信息,并返回使用的方法!
例如:
提交的用户名为wojiushiwo,密码为123456
这是我们的服务器就原样返回我们的用户名和密码,外加我们此次访问所使用的提交方式
如果我用Post方法,返回Method:Post|user=wojiushiwo|pad=123456

java的GET通讯方式

特点:要传递的参数作为网址一并打开,浏览器提交使用的方式为GET,通常用于从网站上获取数据,参数直接显示在浏览器的网址框上(不安全)!

  • 第一步:根据网址和参数实例化URL
java.net.URL url=new java.net.URL(网址+"?"+参数);
//此时参数直接作为网址打开
  • 第二步:打开url的Connection连接
URLConnection connection=url.openConnection();
  • 第三步:获取连接的输入流
InputStream ips=connection.getInputStream();//根据连接获取输入流
InputStreamReader ipsr=new InputStreamReader(ips);//将输入流转化为字符流
BufferedReader br=new BufferedReader(ipsr);//将输入字符流包装,以便使用
  • 第四步:输出包装流中的数据
while((line=br.readLine()) != null)
{
    
    
	text.append(line);
}//每次读一行,行数据不为空时继续读取!

此时我们就可以进行简单的使用GET方法取出服务器中的数据了
让我们来试验一下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URLConnection;

public class Testclass {
    
    

	public static void main(String[] args) {
    
    
		
		String URL="http://localhost:8080/helloworld/01/hello.jsp";
		String Params="user=wojiushiwo&pad=123456789";
		new Thread(new Runnable() {
    
    
			
			public void run() {
    
    
				try {
    
    
					
					java.net.URL url=new java.net.URL(URL+"?"+Params);
					URLConnection connection=url.openConnection();
					InputStream ips=connection.getInputStream();
					InputStreamReader ipsr=new InputStreamReader(ips);
					BufferedReader br=new BufferedReader(ipsr);
					String line;
					StringBuilder text=new StringBuilder();
					while((line=br.readLine()) != null)
					{
    
    
						text.append(line);
					}
					br.close();
					ipsr.close();
					ips.close();
					System.out.println(text);					
				} catch (MalformedURLException e) {
    
    
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
    
    
					// TODO Auto-generated catch block
					e.printStackTrace();
				}			
			}
		}).start();
	}
}

以上是测试的全部代码,在这里一并放出!
GET通讯方法测试结果
测试成功,成功返回我们想要的数据,不过在软件中,总是提交数据的场景较多,所以Post方法用处较多,接下来让我们看一下Post通讯!

Java的POST通讯方式

特点:适用于提交大量数据,网址中不包含提交内容(安全),提交内容使用输出流进行输出!

  • 第一步:根据网址实例化URL
java.net.URL url=new java.net.URL(网址);
//此时对比上方,参数并不作为网址进行打开,而是通过下方输出流进行写出

Post方法与Get方法最大的区别就在于:
Post方法在打开URL是仅仅打开原网址的内容,而Get方法是将所有待提交的内容连同网址一并提交
此处需注意

  • 第二步:打开URL的HttpURLConnection连接
HttpURLConnection httpurlconnection=(HttpURLConnection)url.openConnection();
//需要进行类型强转
  • 第三步:设置请求参数
httpurlconnection.setRequestMethod("POST");//设置请求方法
httpurlconnection.setRequestProperty("encoding","UTF-8");//设置字符集编码
httpurlconnection.setDoInput(true);//允许输入
httpurlconnection.setDoOutput(true);//允许输出		

我们在使用Post方法是,还需设置以上参数

  • 第四步:获取并封装HttpURLConnection的输出流并将提交的参数进行输出
OutputStream os=httpurlconnection.getOutputStream();	//获取输出流	
OutputStreamWriter ow=new OutputStreamWriter(os);	//将输出流转化为输出字符流
BufferedWriter bw=new BufferedWriter(ow);//将输出字符流包装
bw.write(Params);//向网站提交参数
bw.flush();//输出所有缓冲区

此处需注意:
Post与Get方法提交数据的第二个区别在此:
Post方法不在URL提交的数据需要使用流来提交,在此处我们就获取了一个输出流,最后把它封装为缓冲流以便我们使用,我们需要提交的数据需要在缓冲流BufferWriter对象中调用write方法进行输出,而不是像Get方法一样直接在Url中提交数据!
所以直观地来说,使用Post方法提交数据时数据并不显示在Url中,所以也是更加安全的原因之一!

  • 第五步:获取并封装输入流
InputStream is=httpurlconnection.getInputStream();
InputStreamReader ir=new InputStreamReader(is);
BufferedReader br=new BufferedReader(ir);

在我们输出数据后,接下来的操作与Get方法基本相同,获取输入流得到网站所返回的信息!

  • 第六步:输出输入流中的数据
	while((line=br.readLine())!=null)
	{
    
    
		text.append(line);
	}

得到数据的方法与上方相同!

接下来让我们进行一个简单测试:

public class Testclass {
    
    

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		String URL="http://localhost:8080/helloworld/01/hello.jsp";
		String Params="user=我就是我&pad=123456789";
		new Thread(new Runnable() {
    
    
			@Override
			public void run() {
    
    
				try {
    
    
					java.net.URL url=new java.net.URL(URL);
					HttpURLConnection httpurlconnection=
							(HttpURLConnection)url.openConnection();
					httpurlconnection.setRequestMethod("POST");
					httpurlconnection.setRequestProperty("encoding","UTF-8");
					httpurlconnection.setDoInput(true);
					httpurlconnection.setDoOutput(true);					
					OutputStream os=httpurlconnection.getOutputStream();					
					OutputStreamWriter ow=new OutputStreamWriter(os);					
					BufferedWriter bw=new BufferedWriter(ow);
					bw.write(Params);
					bw.flush();
					InputStream is=httpurlconnection.getInputStream();
					InputStreamReader ir=new InputStreamReader(is);
					BufferedReader br=new BufferedReader(ir);
					String line;
					StringBuilder text=new StringBuilder();
					while((line=br.readLine())!=null)
					{
    
    
						text.append(line);
					}
					System.out.println(text);
					
				} catch (MalformedURLException e) {
    
    
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
    
    
					// TODO Auto-generated catch block
					e.printStackTrace();
				}		
			}
		}).start();
	}
}

由于设置了编码,所以我们可以直接提交中文数据!
测试结果如下:
Post提交测试结果

更好的提交代码

以上我所写的都是我的个人学习笔记,并不使用,提交的时候由于不设置编码可能会出现乱码的问题!
接下来我会附上一篇我一直在使用的代码,出处不详,侵权请联系删除!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

public class HttpClient {
    
    
    /**
     * 向指定URL发送GET方法的请求
     * 
     * @param url
     *            发送请求的URL
     * @param param
     *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return URL 所代表远程资源的响应结果
     */
    public static String sendGet(String url, String param) {
    
    
        String result = "";
        BufferedReader in = null;
        try {
    
    
            String urlNameString = url + "?" + param;
            URL realUrl = new URL(urlNameString);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
    
    
                System.out.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
    
    
                result += line;
            }
        } catch (Exception e) {
    
    
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
    
    
            try {
    
    
                if (in != null) {
    
    
                    in.close();
                }
            } catch (Exception e2) {
    
    
                e2.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 向指定 URL 发送POST方法的请求
     * 
     * @param url
     *            发送请求的 URL
     * @param param
     *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static String sendPost(String url, String param) {
    
    
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
    
    
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
    
    
                result += line;
            }
        } catch (Exception e) {
    
    
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
    
    
            try{
    
    
                if(out!=null){
    
    
                    out.close();
                }
                if(in!=null){
    
    
                    in.close();
                }
            }
            catch(IOException ex){
    
    
                ex.printStackTrace();
            }
        }
        return result;
    }    
}

以上代码封装了GET与POST提交方法,并设置了编码,本人一直使用没有出错!

猜你喜欢

转载自blog.csdn.net/qq_42628989/article/details/88934361