Java 不依赖第三方实现 HTTP GET 和 POST 请求 ( 一 )

yufei       6 年, 3 月 前       2578

一般情况下,我们使用 Java 发起一个 HTTP 发起一个 GETPOST 请求,最先想到的是什么?

对,就是先找找看有没有啥现成的解决方案,然后,肯定就会想到 HTTPClient 这种大名鼎鼎的库

其实,对于一般的请求,Java 内置的包 java.net 就能够实现了。能不使用 HTTPClient 就不用呗

怎么说呢?我本人有极大的洁癖症,能少一点是一点

所以,接下来的案例,我们就不用什么 IDE 了,直接上一个纯文本编辑器,外加 Java 环境即可。

远程资源

既然是网络请求,肯定要远程资源,我们也进一步偷懒吧,直接使用 https://jsonplaceholder.typicode.com ,该网站提供了简单的 get / post / put / delete 端点 ( endpoint)

出于演示目的,我只使用 GETPOST 端点

源码文件

直接取个名字 GetAndPost.java 就好了

随便放在哪里,只要你能找到就好,然后输入以下内容调试下我们的 Java 环境

public class GetAndPost {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

保存,然后在命令行中输入 javac GetAndPost.java && java GetAndPost 看看输出是否成功

$ javac GetAndPost.java && java GetAndPost
Hello World

引入包和添加方法原型

我们需要用到 java.net 包里的相关类来创建 HTTP 请求,需要用到 java.io 包里的相关类来读取请求的结果,所以需要引入这两个包

import java.io.*;
import java.net.*;

对于 GETPOST 请求,我们分别添加两个方法来实现,分别是

MyGETRequest();  // 用于实现 GET 请求
MyPOSTRequest(); // 用于实现 POST 请求

添加完后,所有的 GetAndPost.java 中的内容如下

GetAndPost.java

import java.io.*;
import java.net.*;

public class GetAndPost {

    public static void MyGETRequest() throws IOException {}
    public static void MyPOSTRequest() throws IOException {}

    public static void main(String[] args) {

        try {

            GetAndPost.MyGETRequest();  // 用于实现 GET 请求
            GetAndPost.MyPOSTRequest(); // 用于实现 POST 请求

        } catch ( IOException e ) {

            System.out.println(e);
        }
    }
}

MyGETRequest()

我们在 MyGETRequest()https://jsonplaceholder.typicode.com/posts/1 发起一个 HTTP GET 请求

为了对 MyGETRequest() 输出的结果有个预期,我们先在浏览器中打开这个网址,得到的结果如下

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}

我们先来说说使用 java.net 包完成一个 HTTP GET 请求的一般流程

  1. 使用 java.net.URL 类创建一个 URL 类的实例 urlForGetRequest ,参数为要请求的网址
  2. 调用 URL 实例的 openConnection() 方法打开一个到远程服务器的连接 conection
  3. 然后对连接 conection 设置一些属性,比如调用 setRequestMethod() 设置请求方法,调用 setRequestProperty() 添加一些查询参数
  4. 设置完了属性之后,就可以调用连接的 getResponseCode() 发起请求并返回请求的响应状态码
  5. 判断返回的响应状态吗,如果为 200 则表示成功,然后就可以调用连接的 getInputStream() 获取输入流
  6. 有了输入流之后,就可以使用 java.io 包中的相关类读取响应的数据
  7. 其它的对响应数据的处理逻辑

遵循这个思路,MyGETRequest() 的实现大概如下

public static void MyGETRequest() throws IOException {

    // 1. 创建 URL 实例
    URL urlForGetRequest = new URL("https://jsonplaceholder.typicode.com/posts/1");
    String readLine = null;

    // 2. 打开到远程服务器的连接
    HttpURLConnection conection = (HttpURLConnection) urlForGetRequest.openConnection();

    // 3. 设置连接属性,比如请求方法和请求参数
    conection.setRequestMethod("GET");
    conection.setRequestProperty("userId", "a1bcdef"); // set userId its a sample here

    // 4. 发起请求并获取响应的状态码
    int responseCode = conection.getResponseCode();

    // 5. 根据状态码作出一些判断,如果为 200 则表示成功
    if (responseCode == HttpURLConnection.HTTP_OK) {

        // 6. 使用 getInputStream() 获取输入流并读取输入流里的数据
        BufferedReader in = new BufferedReader(
            new InputStreamReader(conection.getInputStream()));

        // 7. 其它处理逻辑,这里直接输出响应的数据
        StringBuffer response = new StringBuffer();
        while ((readLine = in .readLine()) != null) {
            response.append(readLine);
        }
        in.close();
        System.out.println("JSON String Result " + response.toString());
    } else {
        System.out.println("GET NOT WORKED");
    }
}

使用 javac GetAndPost.java && java GetAndPost 命令运行结果如下

$ javac GetAndPost.java && java GetAndPost
JSON String Result {  "userId": 1,  "id": 1,  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"}

得到的结果是不是我们直接在浏览器中访问的一样?

全部的源代码如下

import java.io.*;
import java.net.*;

public class GetAndPost {

    public static void MyGETRequest() throws IOException {

        // 1. 创建 URL 实例
        URL urlForGetRequest = new URL("https://jsonplaceholder.typicode.com/posts/1");
        String readLine = null;

        // 2. 打开到远程服务器的连接
        HttpURLConnection conection = (HttpURLConnection) urlForGetRequest.openConnection();

        // 3. 设置连接属性,比如请求方法和请求参数
        conection.setRequestMethod("GET");
        conection.setRequestProperty("userId", "a1bcdef"); // set userId its a sample here

        // 4. 发起请求并获取响应的状态码
        int responseCode = conection.getResponseCode();

        // 5. 根据状态码作出一些判断,如果为 200 则表示成功
        if (responseCode == HttpURLConnection.HTTP_OK) {

            // 6. 使用 getInputStream() 获取输入流并读取输入流里的数据
            BufferedReader in = new BufferedReader(
                new InputStreamReader(conection.getInputStream()));

            // 7. 其它处理逻辑,这里直接输出响应的数据
            StringBuffer response = new StringBuffer();
            while ((readLine = in .readLine()) != null) {
                response.append(readLine);
            }
            in.close();
            System.out.println("JSON String Result " + response.toString());
        } else {
            System.out.println("GET NOT WORKED");
        }
    }

    public static void MyPOSTRequest() throws IOException {}

    public static void main(String[] args) {

        try {

            GetAndPost.MyGETRequest();  // 用于实现 GET 请求
            GetAndPost.MyPOSTRequest(); // 用于实现 POST 请求

        } catch ( IOException e ) {

            System.out.println(e);
        }
    }
}

篇幅有限,POST 请求我们下一章节中再来讲解把

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.