IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 搭建简易PostMan 发送Json数据后台逻辑 -> 正文阅读

[开发测试]搭建简易PostMan 发送Json数据后台逻辑

搭建简单客户端

需要处理的问题:

  • 向服务器发送请求
  • 包装请求体
  • 将请求体数据转换为Json
  • 将响应结果输出到控制台
  • 解决重定向问题
  • 解决错误页的输出

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.Properties;
import java.util.Scanner;

/**
 * @BelongsProject: JavaLearnAll
 * @BelongsPackage: Socket.post
 * @Author: Wang Haipeng
 * @CreateTime: 2021-10-21 08:47
 * @Description: 编写客户端与服务器交互,向服务器发送请求并输出
 */
public class PostTest {
    public static void main(String[] args) throws IOException {
        /*获取数据配置文件的*/
        String propsFilename = args.length >0 ? args[0] : "F:\\Code\\JavaLearnAll\\src\\main\\java\\Socket\\post\\post.properties";
        Properties props = new Properties();
        try(InputStream in = Files.newInputStream(Paths.get(propsFilename))) {
            props.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }

        /*访问的URL*/
        String urlString = props.remove("url").toString();
        /*用户端浏览器类型*/
        Object userAgent = props.remove("User-Agent");
        /*重定向次数*/
        Object redirects = props.remove("redirects");


        /*设置全局的Cookie 处理器*/
        CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
        String result = doPost(new URL(urlString),props,
                userAgent == null ? null : userAgent.toString(),
                redirects == null ? -1 : Integer.parseInt(redirects.toString()));
        System.out.println(result);
    }


    /**
     *
     * @param url 用于请求服务器的URL
     * @param nameValuePairs 连接/请求信息
     * @param userAgent 用户客户端类型
     * @param redirects 响应次数
     * @return 打印服务器的请求
     * @Description: 向服务器发送请求,如果有重定向则处理重定向,如果没有重定就将服务器的的响应数据打印到控制台上
     *
     */
    public static String doPost(URL url, Map<Object,Object> nameValuePairs, String userAgent, int redirects) throws IOException {

        /*所有满足URL类的协议都可以通过URLConnection 来封装请求或者响应的对象*/
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        if (userAgent != null){
            connection.setRequestProperty("User-agent",userAgent);
        }

        if (redirects >0){
            /*HttpURLConnection.setFollowRedirects 设置所有的http 连接自动处理重定向*/
            /*设置本次连接自动处理重定向*/
            connection.setInstanceFollowRedirects(false);
        }
        /*设置请求头的属性*/
        connection.setRequestProperty("Content-Type","application/json");
        /*HTTP协议要求必须发送下请求的的长度*/
        /*
        这一段设置请求长度的代码必须放到PrintiWriter 建立之前,因为PrintWriter 对象建立就一定会建立连接
        而请求头必须在PrintWrter 前发送给服务器
         */
        connection.setRequestProperty("Content-Length","1024");
        /*开启响应输出*/
        connection.setDoOutput(true);
        
        /*将数据简单封装为Json 数据传递给服务器*/
        try(PrintWriter out = new PrintWriter(connection.getOutputStream())) {
            StringBuilder request = new StringBuilder();
            request.append("{");
            for (Map.Entry<Object,Object> pair : nameValuePairs.entrySet()){
                String name = pair.getKey().toString();
                String value = pair.getValue().toString();
                String result = '\"'+name+'\"'+':'+'\"'+value+'\"'+',';
                request.append(result);
            }
            request.append("}");
            request.deleteCharAt(request.length()-2);
            System.out.println(request.toString());
            out.print(request.toString());
        }

        String encoding = connection.getContentEncoding();

        if (encoding == null){
            encoding = "UTF-8";
        }

        /*
        * 处理无法进行自动重定向的情况
        * */
        if (redirects > 0){
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_MOVED_PERM
                    || responseCode == HttpURLConnection.HTTP_MOVED_TEMP
                    || responseCode == HttpURLConnection.HTTP_SEE_OTHER
            ){
                /*重定向的目标位置会放置在响应头的Location 字段*/
                String location = connection.getHeaderField("Location");
                if (location != null){
                    /*返回当前的Connection 建立连接的URL对象*/
                    URL base = connection.getURL();
                    /*断开连接*/
                    connection.disconnect();
                    return doPost(new URL(base,location), nameValuePairs, userAgent, redirects-1);
                }
            }
        }else if (redirects == 0){
            throw new IOException("Too many redirects!");
        }

        /**
         * 处理从服务器读数据过程中服务器端出错的情况
         * 当读取响应过程中服务器端出现错误,那么在调用connection.getInputStream()
         * 时会抛出一个错误页面,为了捕获这个错误页,可以通过getErrorStream方法:
         */
        StringBuilder response = new StringBuilder();
        try(Scanner in = new Scanner(connection.getInputStream(),encoding)) {
            while (in.hasNextLine()){
                response.append(in.nextLine());
                response.append("\n");
            }
        }catch(IOException e){
            InputStream err = connection.getInputStream();
            /*如果服务器不存在错误的响应页,那么就抛出这个错误客户端不去处理,一般会有响应页*/
            if (err == null){
                throw e;
            }
            try(Scanner in = new Scanner(err)) {
                response.append(in.nextLine());
                response.append("\n");
            }
        }
        return response.toString();
    }

}


image.png
image.png

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-10-22 11:14:07  更:2021-10-22 11:14:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 2:46:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码