服务器之家

服务器之家 > 正文

简单介绍Java网络编程中的HTTP请求

时间:2020-01-06 14:20     来源/作者:goldensun

HTTP请求的细节——请求行
 
  请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST
  用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
  不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1
  GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
  如果请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。
 
HTTP请求的细节——消息头

 
  HTTP请求中的常用消息头
 
  accept:浏览器通过这个头告诉服务器,它所支持的数据类型
  Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
  Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
  Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
  Host:浏览器通过这个头告诉服务器,想访问哪台主机
  If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
  Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的  防盗链
  Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接

例:

http_get

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
 
 
public class Http_Get {
 
  private static String URL_PATH = "http://192.168.1.125:8080/myhttp/pro1.png";
 
  public Http_Get() {
    // TODO Auto-generated constructor stub
  }
 
  public static void saveImageToDisk() {
    InputStream inputStream = getInputStream();
    byte[] data = new byte[1024];
    int len = 0;
    FileOutputStream fileOutputStream = null;
    try {
      fileOutputStream = new FileOutputStream("C:\\test.png");
      while ((len = inputStream.read(data)) != -1) {
        fileOutputStream.write(data, 0, len);
      }
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } finally {
      if (inputStream != null) {
        try {
          inputStream.close();
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
      if (fileOutputStream != null) {
        try {
          fileOutputStream.close();
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
    }
  }
 
  /**
   * 获得服务器端的数据,以InputStream形式返回
   * @return
   */
  public static InputStream getInputStream() {
    InputStream inputStream = null;
    HttpURLConnection httpURLConnection = null;
    try {
      URL url = new URL(URL_PATH);
      if (url != null) {
        httpURLConnection = (HttpURLConnection) url.openConnection();
        // 设置连接网络的超时时间
        httpURLConnection.setConnectTimeout(3000);
        httpURLConnection.setDoInput(true);
        // 表示设置本次http请求使用GET方式请求
        httpURLConnection.setRequestMethod("GET");
        int responseCode = httpURLConnection.getResponseCode();
        if (responseCode == 200) {
          // 从服务器获得一个输入流
          inputStream = httpURLConnection.getInputStream();
        }
      }
    } catch (MalformedURLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return inputStream;
  }
 
  public static void main(String[] args) {
    // 从服务器获得图片保存到本地
    saveImageToDisk();
  }
}

Http_Post

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
 
public class Http_Post {
 
  // 请求服务器端的url
  private static String PATH = "http://192.168.1.125:8080/myhttp/servlet/LoginAction";
  private static URL url;
 
  public Http_Post() {
    // TODO Auto-generated constructor stub
  }
 
  static {
    try {
      url = new URL(PATH);
    } catch (MalformedURLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
 
  /**
   * @param params
   *      填写的url的参数
   * @param encode
   *      字节编码
   * @return
   */
  public static String sendPostMessage(Map<String, String> params,
      String encode) {
    // 作为StringBuffer初始化的字符串
    StringBuffer buffer = new StringBuffer();
    try {
      if (params != null && !params.isEmpty()) {
         for (Map.Entry<String, String> entry : params.entrySet()) {
            // 完成转码操作
            buffer.append(entry.getKey()).append("=").append(
                URLEncoder.encode(entry.getValue(), encode))
                .append("&");
          }
        buffer.deleteCharAt(buffer.length() - 1);
      }
      // System.out.println(buffer.toString());
      // 删除掉最有一个&
       
      System.out.println("-->>"+buffer.toString());
      HttpURLConnection urlConnection = (HttpURLConnection) url
          .openConnection();
      urlConnection.setConnectTimeout(3000);
      urlConnection.setRequestMethod("POST");
      urlConnection.setDoInput(true);// 表示从服务器获取数据
      urlConnection.setDoOutput(true);// 表示向服务器写数据
      // 获得上传信息的字节大小以及长度
      byte[] mydata = buffer.toString().getBytes();
      // 表示设置请求体的类型是文本类型
      urlConnection.setRequestProperty("Content-Type",
          "application/x-www-form-urlencoded");
      urlConnection.setRequestProperty("Content-Length",
          String.valueOf(mydata.length));
      // 获得输出流,向服务器输出数据
      OutputStream outputStream = urlConnection.getOutputStream();
      outputStream.write(mydata,0,mydata.length);
      outputStream.close();
      // 获得服务器响应的结果和状态码
      int responseCode = urlConnection.getResponseCode();
      if (responseCode == 200) {
        return changeInputStream(urlConnection.getInputStream(), encode);
      }
    } catch (UnsupportedEncodingException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return "";
  }
 
  /**
   * 将一个输入流转换成指定编码的字符串
   *
   * @param inputStream
   * @param encode
   * @return
   */
  private static String changeInputStream(InputStream inputStream,
      String encode) {
    // TODO Auto-generated method stub
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    byte[] data = new byte[1024];
    int len = 0;
    String result = "";
    if (inputStream != null) {
      try {
        while ((len = inputStream.read(data)) != -1) {
          outputStream.write(data, 0, len);
        }
        result = new String(outputStream.toByteArray(), encode);
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    return result;
  }
 
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Map<String, String> params = new HashMap<String, String>();
    params.put("username", "admin");
    params.put("password", "123");
    String result = Http_Post.sendPostMessage(params, "utf-8");
    System.out.println("--result->>" + result);
  }
 
}

相关文章

热门资讯

玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
配置IIS网站web服务器的安全策略配置解决方案
配置IIS网站web服务器的安全策略配置解决方案 2019-05-23
Nginx服务器究竟是怎么执行PHP项目
Nginx服务器究竟是怎么执行PHP项目 2019-05-24
返回顶部