玩转WEB接口之一 【HTTP调试测试神器 httpbin使用】

news2024/10/3 4:38:54

文章目录

  • 一、项目、作者何许人也
  • 二、观摩庐山真面目
  • 三、怎么玩
  • 四、后端怎么调用
    • 1. RestTemplate测试代码
    • 2. 运行结果

一、项目、作者何许人也

httpbin是大神kennethreitz为搭建测试用的http服务而写的项目,httpbin 这个服务应用能测试HTTP请求及响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试具有很大的帮助,它是用 Python + Flask 编写的,是一个开源项目。

Kenneth Reitz: 著名的python首席架构师,requests、python-guide、pipenv、legit、autoenv等一系列大名鼎鼎的python类库及工具的创作者,大神级程序员,据说其身价高达5亿美元。

二、观摩庐山真面目

官网 https://httpbin.org/

http方法组展开的接口
在这里插入图片描述
其他的分组

在这里插入图片描述
点击 HTML form 是一个form表单提交页面,可以用来测试
在这里插入图片描述

三、怎么玩

以get请求为例:

展开 HTTP Methods 方法下面的get请求,选择Try it out,
在这里插入图片描述

出现 Execute 点击他, Response body 返回json数据。
在这里插入图片描述
依次类推,post请求返回数据如下:
在这里插入图片描述
包含form表单、json数据、header、url、origin 等信息。

四、后端怎么调用

1. RestTemplate测试代码

这里选取了四个典型场景: get请求、formdata表单提交、json字符串post提交、带文件 multipart/form-data 提交
在这里插入图片描述

import java.util.Arrays;

import org.apache.commons.lang3.RandomUtils;
import org.junit.jupiter.api.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class RestTemplateSimpleTest
{
    private static RestTemplate restTemplate;
    
    static
    {
        int type = RandomUtils.nextInt(1, 5);
        log.info("--------- type:{}", type);
        switch (type)
        {
            case 1:
                // 使用默认客户端构造RestTemplate,写法1
                /*** Java HttpURLConnection (默认RestTemplate采用,不支持HTTP2) ***/
                restTemplate = new RestTemplate();
                break;
            
            case 2:
                // 使用默认客户端构造RestTemplate,写法2
                restTemplate = new RestTemplate(new SimpleClientHttpRequestFactory());
                break;
            
            case 3:
                // 使用默认客户端构造RestTemplate,写法3
                restTemplate = new RestTemplate();
                restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory());
                break;
            
            case 4:
                // 使用默认客户端构造RestTemplate, 配置proxy,connectTimeout,readTimeout等参数
                SimpleClientHttpRequestFactory clientHttpRquestFactory = new SimpleClientHttpRequestFactory();
                clientHttpRquestFactory.setConnectTimeout(5000);
                clientHttpRquestFactory.setReadTimeout(65000);
                restTemplate = new RestTemplate(clientHttpRquestFactory);
                break;
            default:
        }
    }
    
    @Test
    public void testGet()
    {
        String url = "https://httpbin.org/get";
        String responseBody = restTemplate.getForObject(url, String.class);
        log.info("responseBody={}", responseBody);
    }
    
    @Test
    public void testFormData001()
    {
        // POST请求只能用MultiValueMap
        String url = "https://httpbin.org/post";
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("q1", "java");
        params.add("q2", "python");
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
        
        if (RandomUtils.nextBoolean())
        {
            String response = restTemplate.postForObject(url, requestEntity, String.class);
            log.info("ResponseBody={}", response);
        }
        else
        {
            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, String.class);
            log.info("ResponseEntity={}", responseEntity.getBody());
        }
    }
    
    @Test
    public void testUpload()
    {
        // POST请求只能用MultiValueMap
        String url = "https://httpbin.org/post";
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        
        // Resource适用于文件、Jar內
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        Resource file = new ClassPathResource("123.jpg");
        // 多次调用,后台接受到的是MultipartFile[]
        params.add("file", file);
        params.add("file", file);
        
        params.add("name", "girl");
        params.add("age", "18");
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, String.class);
        log.info("ResponseEntity={}", responseEntity);
    }
}

2. 运行结果

 2024-01-26 17:52:44.587 [main] INFO  com.fly.rest.RestTemplateSimpleTest - --------- type:3
2024-01-26 17:52:46.461 [main] INFO  com.fly.rest.RestTemplateSimpleTest - responseBody={
  "args": {}, 
  "headers": {
    "Accept": "text/plain, application/json, application/*+json, */*", 
    "Host": "httpbin.org", 
    "User-Agent": "Java/1.8.0_221", 
    "X-Amzn-Trace-Id": "Root=1-65b379f1-30d6643c75aaf2992a9faa97"
  }, 
  "origin": "61.169.67.18", 
  "url": "https://httpbin.org/get"
}

2024-01-26 17:52:46.710 [main] INFO  com.fly.rest.RestTemplateSimpleTest - ResponseEntity=<200,{
  "args": {}, 
  "data": "{\"pageNo\":\"2\",\"pageSize\":\"10\",\"keyword\":\"1\"}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "application/json", 
    "Content-Length": "44", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "Java/1.8.0_221", 
    "X-Amzn-Trace-Id": "Root=1-65b379f1-4c7461bf00bf0966330cdc84"
  }, 
  "json": {
    "keyword": "1", 
    "pageNo": "2", 
    "pageSize": "10"
  }, 
  "origin": "61.169.67.18", 
  "url": "https://httpbin.org/post"
}
,[Date:"Fri, 26 Jan 2024 09:22:57 GMT", Content-Type:"application/json", Content-Length:"523", Connection:"keep-alive", Server:"gunicorn/19.9.0", Access-Control-Allow-Origin:"*", Access-Control-Allow-Credentials:"true"]>
2024-01-26 17:52:46.942 [main] INFO  com.fly.rest.RestTemplateSimpleTest - ResponseBody={
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "q1": "java", 
    "q2": "python"
  }, 
  "headers": {
    "Accept": "application/json", 
    "Content-Length": "17", 
    "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", 
    "Host": "httpbin.org", 
    "User-Agent": "Java/1.8.0_221", 
    "X-Amzn-Trace-Id": "Root=1-65b379f1-3400da2d5aa686e725741d55"
  }, 
  "json": null, 
  "origin": "61.169.67.18", 
  "url": "https://httpbin.org/post"
}

2024-01-26 17:52:48.339 [main] INFO  com.fly.rest.RestTemplateSimpleTest - ResponseEntity=<200,{
  "args": {}, 
  "data": "", 
  "files": {
    "file": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eH3cxK4vJ4Yfpb2ibjlbD9BnG7SEaN8myH5Lt+18DSH1UQCPvpKhrK1j+ij52ppGX42r4TcRZ62Y76GqwOgMEr2HJ4fqbeJuvKyH6H24nabMmOPrGKR61y5p5OH4xnqJRIO/gR4xylWq1GF/ecRvudYcjvnmY8ry3rC9V3gm4vvxhyigmcLVvfwZqlc9uWgBp28Y8tZM1Xtxmo3XY48nAPqYloP34ylNCSccYhuzRhAMoK46AFBHsb/3vCTygDcYJ+M0Mh3NyS/nNQVx7NF38P3jDp86NOGTC3h/l7w7VaRhmkUx2KLuR89PkwGUN6RPg1jlhthYDov5PsxJBI0eyHH3jMao6aHy+XjEUx0eE8aenxh8jnNW+H58znARGaQvwuEjRaDf3P9x7ECqgP++cKg02tscF1jfR95BEBBCb9awVq9Rpf3jLQ6RB+TgxtoEJeF/o/eeOri2nhXk+cQdMNIPyePrJ8qqKz0e8bB8Ckd9uvrIAdcj3+sdqTZG/eJFS7VowQiB0Cz7wBIHEQcTwHkH1gKSAzArb8uCikgkPOczoS3jZr94gAKmDzJQ/WAQAsXYO0ccREWfccFc7VBujd/owCaCBzTY/SZYFFWU4R/wDMRBVBid1XZ+cvGm6HGxx8LhsRNIclpX7fjGAxriPjLmioVKfL+sBFSVwpEf3cugXpD+E4z//Z"
  }, 
  "form": {
    "age": "18", 
    "name": "girl"
  }, 
  "headers": {
    "Accept": "application/json", 
    "Content-Length": "67257", 
    "Content-Type": "multipart/form-data;charset=UTF-8;boundary=j8heXoBDLEg1JRe3apeLMkvEeVnkcGIiymWf75", 
    "Host": "httpbin.org", 
    "User-Agent": "Java/1.8.0_221", 
    "X-Amzn-Trace-Id": "Root=1-65b379f1-136ad5f76c66cd7e626c56c5"
  }, 
  "json": null, 
  "origin": "61.169.67.18", 
  "url": "https://httpbin.org/post"
}
,[Date:"Fri, 26 Jan 2024 09:22:58 GMT", Content-Type:"application/json", Content-Length:"44945", Connection:"keep-alive", Server:"gunicorn/19.9.0", Access-Control-Allow-Origin:"*", Access-Control-Allow-Credentials:"true"]>

未完待续,有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!

-over-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1412665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是框架 确定伦敦金的框架为何重要?

在伦敦金投资中&#xff0c;我们要进行分析或者交易&#xff0c;都要将伦敦金走势置于一个框架内。什么才是框架呢&#xff1f;笔者认为&#xff0c;在当前伦敦金走势的上方和下方画出支撑阻力位&#xff0c;这就是框架。但我们要注意框架得能够立得起来&#xff0c;那才算是好…

Python之线程与进程相关介绍

Python 线程与进程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流&#xff0c;一个进程中可以并发多个线程&#xff0c;每条线程并行执行不同的任务。 使用 threading 模块 …

TCP 状态转换

上图中还没有进行握手的时候状态是关闭的。 三次握手状态的改变&#xff1a; 客户端发起握手。 调用 connect() 函数时状态转化为&#xff1a;SYN_SENT。调用 listen() 函数时状态转换为&#xff1a;LISTEN。ESTABLISHED是被连接的状态。 四次挥手状态的改变&#xff1a; …

实战EDA电子设计自动化经典入门模型VHDL代码编写(含代码解释)上篇--状态机,逻辑设计:Y=AB+C

前言 电子设计自动化&#xff08;EDA&#xff09;&#xff1a; 定义&#xff1a;EDA是用于设计和开发复杂的电子系统&#xff08;如集成电路&#xff09;和印刷电路板的软件工具集合。这些工具通常用于设计电路、进行仿真测试、分析电路行为以及协助制造过程。应用&#xff1a;…

013:获取K线图,增加周期可选

改进《001:如何获取A股个股的前复权K线数据》&#xff0c;增加周期可选。 代码&#xff1a; import tkinter as tk from tkinter import messagebox from tkcalendar import Calendar import pandas as pd import requests from urllib.parse import urlencodedef gen_secid(…

软件设计师——软件工程(五)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

颠覆式创新:LAXCUS分布式操作系统7.0

在这轮AI浪潮中&#xff0c;英伟达已经获得了硬件算力入口&#xff0c;Laxcus要获取软件算力入口。 有几位网友想了解我们正在研发的Laxcus分布式操作系统7.0的情况。应他们要求&#xff0c;今天就说说Laxcus 7.0版本。Laxcus 7.0是一个全新的操作系统&#xff0c;具有很多独特…

libjsoncpp 的编译和交叉编译

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

ps---1.使用置入嵌入的智能化对象命令制作拼贴画

ps—使用置入嵌入的智能化对象命令制作拼贴画 素材 步骤 打开背景图 置入嵌入对象&#xff08;置入完&#xff0c;移动到正确的位置&#xff0c;回车或双击&#xff09; 栅格化图层 重复上述步骤制作拼贴画

华硕ASUS K43SD笔记本安装win7X64(ventoy为入口以支撑一盘多系统);友善之臂mini2440开发板学习

记录 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 1. MBR样式常规安装win7X64Sp1 (华硕 K43SD 安装 win7X64 ) 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 (常规安装) 设置: 禁用UEFI 启用AHCI ventoy制作MBR(非UEFI)方式的启动U盘 U盘中放cn_windows_7_ultimate_wit…

全桥变压器计算2

1 根据输入最高电压与磁通密度计算出来原边的圈数 2 根据输入输入电压计算出来原副边圈数 3 输入功率计算 4 根据输入功率计算DC输出的平均值,有效值,峰值电流 5根据副边电感感量,然后写出励磁电感的表达式 6 根据写出理想变压器原边绕组电流表达式<

瀑布流布局 (初版)

瀑布流布局 文章目录 瀑布流布局前言1. 背景2. 点⬇️&#x1f517;去体验效果如下图所示&#xff1a; 一、初版waterfall布局和问题暴露&#xff1f;1.效果图如下&#xff1a;2.暴露问题如下图所示&#xff1a;第一张问题图&#xff1a;第二张问题图&#xff1a; 3.HTML代码如…

Linux的权限(三)

目录 共享文件夹 分析一 补充内容 分析二 粘滞位 共享文件夹 分析一 在普通用户yyf中创建一个目录test&#xff1a; 普通用户yyf在test目录中创建yyf类的文件&#xff0c;超级用户root在该目录中创建root.txt类的文件&#xff08;从拥有者和所属组上来看只有root可以对这…

博弈论(牛客练习赛)

思路&#xff1a;我们考虑小念赢 1、如果n>1并且p0&#xff0c;小念可以连续取两次&#xff0c;相当于小念有挂&#xff0c;可以从必败态转为必胜态&#xff0c;必赢。 2、如果n>1并且m>n-1&#xff0c;小念第一次取n-1个&#xff0c;小念必赢。 代码&#xff1a; …

【覆盖率类型 覆盖策略覆盖组_2023.01.26】

覆盖率类型 覆盖率&#xff1a;衡量设计验证的完备性 代码覆盖率 检测对设计代码运行程度的衡量&#xff0c;达到100%并不代表验证的工作已经完成&#xff08;可能某些功能并未设计&#xff09; line coverage paths coverage toggle coverage//所有变量都有过0&#xff0c…

Java-List接口常用方法和遍历方法

List的继承结构 其中&#xff0c;红色为接口&#xff0c;蓝色为实现类 List的四大方法 List的基本操作void add(int index,E e)boolean remove(Object o)E remove(int index)E set(int index,E e)E get(int index)其中注意删除方法有两种&#xff0c;执行的时候主要选择实参…

爬虫(滑块验证的破解)

基于滑块的验证破解 —— Selenium 1.可分为三个核心步骤 获取验证码图片识别图片&#xff0c;计算轨迹距离寻找滑块&#xff0c;控制滑动 打开网址&#xff1a;https://www.geetest.com/adaptive-captcha-demo 2.获取验证图片 import re import time from selenium import…

OSPF协议基础(OSPF工作过程)

目录 OSPF基本工作原理邻居建立过程Router ID发现并建立邻居 - Hello报文OSPF邻居建立过程 链路状态信息丰富的数据链路层支持能力网络类型 - P2P网络网络类型 - 广播型网络网络类型 - NBMA网络网络类型 - P2MP网络OSPF的度量方式 报文类型及作用OSPF协议报文头部OSPF报文类型O…

推荐几款便宜幻兽帕鲁游戏联机服务专用云服务器

随着互联网技术的发展&#xff0c;云服务器已经成为了许多游戏联机服务的首选。如果大家想要自行搭建幻兽帕鲁联机服务器&#xff0c;那么使用云服务器是一个很好的选择。下面&#xff0c;本文将推荐几款便宜幻兽帕鲁游戏联机服务专用云服务器。 幻兽帕鲁游戏对于服务器配置要求…

Linux中的LVM理论

Linux LVM&#xff1a;Logical Volume Manager逻辑卷管理 无需在停机的情况下&#xff0c;动态调整分区的大小 PV里面的存在很多小方块PE&#xff08;物理扩展&#xff09;&#xff0c;一个PV继承了pp的100G&#xff0c;只不过被分开分配了 划分小的PE再存放在VG里面&#…