Java中通过URL发送json

发布于:2024-07-02 ⋅ 阅读:(15) ⋅ 点赞:(0)

发送json的代码

package service.WxMessages;

import com.alibaba.fastjson2.JSONObject;

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Map;

public class tokenSendServlet {

    public static void main(String[] args) {

        Map<String, String> tokenAndTime = new WxTokenRead().getTokenAndTime();
        String token = tokenAndTime.get("token");
        String time = tokenAndTime.get("time");

        JSONObject json = new JSONObject();
        json.put("token", token);
        json.put("time", time);

        String urlStr = "servlet/receiverToken";//发送数据的url,我这里发的是servlet

        sendJsonPostRequest(json.toJSONString(), urlStr);
    }


    /**
     * 向指定URL发送JSON数据的POST请求。
     *
     * @param json   JSON数据字符串
     * @param urlStr 目标URL字符串
     */
    public static void sendJsonPostRequest(String json, String urlStr) {
        try {
            // 创建URL和HttpURLConnection
            URL url = new URL(urlStr);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // 设置请求方法为POST
            connection.setRequestMethod("POST");

            // 设置请求头Content-Type为application/json
            connection.setRequestProperty("Content-Type", "application/json");

            // 设置允许输出
            connection.setDoOutput(true);

            // 写入JSON数据到请求体
            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = json.getBytes(StandardCharsets.UTF_8);
                os.write(input, 0, input.length);
            }

            // 获取响应码
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code : " + responseCode);

            // 关闭连接
            connection.disconnect();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

接收json的代码(写的servlet)

package servlet;

import com.alibaba.fastjson2.JSONObject;
import dao.HikariConnection;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.stream.Collectors;

@WebServlet(urlPatterns = "/servlet/receiverToken", description = "这里是说明")
public class receiverToken extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        try {
            // 设置响应内容类型
            response.setContentType("text/html;charset=UTF-8");

            // 读取Postman发送的数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
            String json = reader.lines().collect(Collectors.joining());


            System.out.println("Received JSON: " + json);

            // 解析整个JSON对象
            JSONObject jsonObject = JSONObject.parseObject(json);

            // 获取各个字段的值
            String token = jsonObject.getString("token");
            String time = jsonObject.getString("time");

            System.out.println("Token: " + token + " Time: " + time);

            // 更新数据库中的 token 和时间
            updateTokenAndTime(token, time);

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("/servlet/receiverToken 接收token和时间失败!json为空");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    // 更新数据库中的 token 和时间
    public static int updateTokenAndTime(String token ,String time) {
        final String sql = "UPDATE wx_token SET token = ?, time = ? WHERE id = ?";
        int rowsAffected = 0;
        try {
            Connection conn = HikariConnection.getInstance(); // 从连接池中获取一个连接
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, token); // 设置新的 token
            ps.setString(2, time); // 获取当前系统时间并设置
            ps.setInt(3, 1); // 设置要更新的记录的 id
            rowsAffected = ps.executeUpdate();
            if (rowsAffected > 0) {
//                System.out.println("Token 和时间更新成功!");
            } else {
//                System.out.println("Token 和时间更新失败!");
            }
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
            //log.error("获取数据库连接失败!");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rowsAffected;
    }
}