用HttpURLConnection复现http响应码405

目录

  • 使用GET方法,访问GET接口,服务端返回405
  • 使用GET方法,访问POST接口,服务端返回405
  • 使用POST方法,访问GET接口,服务端返回405

使用GET方法,访问GET接口,服务端返回405

发生场景:
复制的POST请求代码,手动修改为GET,没有修改彻底,导致错误。

错误代码:

public class GET405 {public static void main(String[] args) {try {String defURL = "https://httpbin.org/get";URL url = new URL(defURL);// 打开和URL之间的连接HttpURLConnection con = (HttpURLConnection) url.openConnection();con.setRequestMethod("GET");//请求get方式con.setDoInput(true);// 默认值为 truecon.setDoOutput(true);//默认值为 false,传body参数必须写// 得到请求的输出流对象OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream(), "UTF-8");String body = "username=xiaohu&password=123456";writer.write(body);writer.flush();//            System.out.println("http请求方法:"+con.getRequestMethod());System.out.println("http状态码:" + con.getResponseCode());// 获取服务端响应,通过输入流来读取URL的响应InputStream is = con.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));StringBuffer sbf = new StringBuffer();String strRead = null;while ((strRead = reader.readLine()) != null) {sbf.append(strRead);sbf.append("\r\n");}reader.close();// 关闭连接con.disconnect();// 打印读到的响应结果System.out.println("运行结束:" + sbf.toString());} catch (Exception e) {e.printStackTrace();}}
}

报错log:

405原因:
con.getOutputStream() 会把原有的GET方法改为POST方法,用POST方法访问GET接口,就报错405。看jdk1.8中HttpURLConnection的getOutpuStream()方法的源码:

解决办法:删掉getOutputStream(),用url传参。

正确代码:

public class GET200 {public static void main(String[] args) {try {String defURL = "https://httpbin.org/get";String body = "username=xiaohu&password=123456";URL url = new URL(defURL+"?"+body);// 打开和URL之间的连接HttpURLConnection con = (HttpURLConnection) url.openConnection();con.setRequestMethod("GET");//请求get方式//          System.out.println("http请求方法:"+con.getRequestMethod());System.out.println("http状态码:" + con.getResponseCode());// 获取服务端响应,通过输入流来读取URL的响应InputStream is = con.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));StringBuffer sbf = new StringBuffer();String strRead = null;while ((strRead = reader.readLine()) != null) {sbf.append(strRead);sbf.append("\r\n");}reader.close();// 关闭连接con.disconnect();// 打印读到的响应结果System.out.println("运行结束:" + sbf.toString());} catch (Exception e) {e.printStackTrace();}}
}

运行结果:

http状态码:200
运行结束:{"args": {"password": "123456", "username": "xiaohu"}, "headers": {"Accept": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2", "Host": "httpbin.org", "User-Agent": "Java/1.8.0_221", "X-Amzn-Trace-Id": "Root=1-668a1ba0-278338c97b93d6ca4276c0b0"}, "origin": "113.57.25.151", "url": "https://httpbin.org/get?username=xiaohu&password=123456"
}

使用GET方法,访问POST接口,服务端返回405

发生场景:接口文档显示接口为GET接口,实际上后端人员写的是POST接口,文档没同步。

错误代码:

public class GETtoPOST405 {public static void main(String[] args) {try {String defURL = "https://httpbin.org/post";String body="username=xiaohu&password=123456";URL url = new URL(defURL + "?" + body);HttpURLConnection con = (HttpURLConnection) url.openConnection();
//          con.setUseCaches(false); // Post请求不能使用缓存con.setRequestMethod("GET");//请求get方式con.setDoInput(true);// 设置是否从HttpURLConnection输入,默认值为 truecon.setDoOutput(false);// 设置是否使用HttpURLConnection进行输出,默认值为 falseint code = con.getResponseCode();System.out.println("http状态码:" + code);if (code == HttpURLConnection.HTTP_OK) {System.out.println("测试成功");} else {System.out.println("测试失败:" + code);}// 获取服务端响应,通过输入流来读取URL的响应InputStream is = con.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));StringBuffer sbf = new StringBuffer();String strRead = null;while ((strRead = reader.readLine()) != null) {sbf.append(strRead);sbf.append("\r\n");}reader.close();// 关闭连接con.disconnect();// 打印读到的响应结果System.out.println("运行结束:" + sbf.toString());} catch (Exception e) {e.printStackTrace();}}
}

报错log:

http状态码:405
测试失败:405Caused by: java.io.IOException: Server returned HTTP response code: 405 for URL: https://httpbin.org/post?username=xiaohu&password=123456

405原因:不知道后端接口的定义,或者没有沟通彻底,或者后端开发人员失误,本应该是GET定义成了POST。应该使用POST方法。

解决方法:使用POST请求。

正确代码:

public class POSTtoPOST200 {public static void main(String[] args) {try {String defURL = "https://httpbin.org/post";URL url = new URL(defURL);HttpURLConnection con = (HttpURLConnection) url.openConnection();
//          con.setUseCaches(false); // Post请求不能使用缓存con.setRequestMethod("POST");//请求POST方式con.setDoOutput(true);// 设置是否使用HttpURLConnection进行输出,默认值为 falseOutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream(), "UTF-8");String body = "username=xiaohu&password=123456";writer.write(body);writer.flush();int code = con.getResponseCode();System.out.println("http状态码:" + code);if (code == HttpURLConnection.HTTP_OK) {System.out.println("测试成功");} else {System.out.println("测试失败:" + code);}// 获取服务端响应,通过输入流来读取URL的响应InputStream is = con.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));StringBuffer sbf = new StringBuffer();String strRead = null;while ((strRead = reader.readLine()) != null) {sbf.append(strRead);sbf.append("\r\n");}reader.close();// 关闭连接con.disconnect();// 打印读到的响应结果System.out.println("运行结束:" + sbf.toString());} catch (Exception e) {e.printStackTrace();}}
}

运行结果:

http状态码:200
测试成功
运行结束:{"args": {}, "data": "", "files": {}, "form": {"password": "123456", "username": "xiaohu"}, "headers": {"Accept": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2", "Content-Length": "31", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "Java/1.8.0_221", "X-Amzn-Trace-Id": "Root=1-668a2091-2a64856935929fab74082ce4"}, "json": null, "origin": "113.57.25.151", "url": "https://httpbin.org/post"
}

使用POST方法,访问GET接口,服务端返回405

发生场景:代码失误,本该写GET,写成了POST。

错误代码:

public class POSTtoGET405 {public static void main(String[] args) {try {String defURL = "https://httpbin.org/get";URL url = new URL(defURL);// 打开和URL之间的连接HttpURLConnection con = (HttpURLConnection) url.openConnection();con.setRequestMethod("POST");//请求post方式
//            con.setUseCaches(false); // Post请求不能使用缓存con.setDoInput(true);// 设置是否从HttpURLConnection输入,默认值为 truecon.setDoOutput(true);// 设置是否使用HttpURLConnection进行输出,默认值为 falseOutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream(), "UTF-8");String body = "username=xiaohu&password=123456";writer.write(body);writer.flush();writer.close();int code = con.getResponseCode();System.out.println("http状态码:" + code);if (code == HttpURLConnection.HTTP_OK) {System.out.println("测试成功");} else {System.out.println("测试失败:" + code);}// 获取服务端响应,通过输入流来读取URL的响应InputStream is = con.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));StringBuffer sbf = new StringBuffer();String strRead = null;while ((strRead = reader.readLine()) != null) {sbf.append(strRead);sbf.append("\r\n");}reader.close();// 关闭连接con.disconnect();// 打印读到的响应结果System.out.println("运行结束:" + sbf.toString());} catch (Exception e) {e.printStackTrace();}}
}

405原因: 接口只接受GET方法,请求是POST方法。

错误场景:后端开发定义失误,本该是POST接口,写成了GET。接口没有测试。

解决办法:用GET访问。正确代码和GET访问GET一样。

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

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

相关文章

Linux shell编程学习笔记63:free命令 获取内存使用信息

0 前言 在系统安全检查中,内存使用情况也是一块可以关注的内容。Linux提供了多个获取内存信息的命令很多。今天我们先研究free命令。 1 free命令的功能、用法和选项说明 1.1 free命令的功能 free 命令可以显示系统内存的使用情况,包括物理内存、交换…

Java多语言跨境电商外贸商城源码 tiktok商城系统源码 跨境电商源码

Java多语言跨境电商外贸商城源码 tiktok商城系统源码 跨境电商源码 技术栈 PC端使用:vueelementui 用户端使用:uniapp 管理端使用:vueelementui 后台服务使用:springbootmybatisplusmysql 功能描述: 对接PayPal…

【面试题】字节一面面试题

自我介绍,项目介绍MQ的使用场景,不同的MQ之前的区别,为什么使用公司的MQ数据库怎么部署的(应该是问节点,库表)事务隔离级别innodb为什么选可重复读作为隔离级别数据库三大日志,保存先后顺序undo…

vue3+electron项目搭建,遇到的坑

我主要是写后端,所以对前端的vue啊vue-cli只是知其然,不知其所以然 这样也导致了我在开发前端时候遇到了很多的坑 第一个坑, vue2升级vue3始终升级不成功 第二个坑, vue add electron-builder一直卡进度,进度条走完就是不出提示succes 第一个坑的解决办法: 按照网上说的升级v…

使用Java实现高性能的文件上传下载服务

使用Java实现高性能的文件上传下载服务 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 引言 在现代Web应用中,文件上传和下载服务是非常常见的功能需求。如何实现高性能、可靠且安全…

Ubuntu 20.04下多版本CUDA的安装与切换 超详细教程

目录 前言一、安装 CUDA1.找到所需版本对应命令2.下载 .run 文件3.安装 CUDA4.配置环境变量4.1 写入环境变量4.2 软连接 5.验证安装 二、安装 cudnn1.下载 cudnn2.解压文件3.替换文件4.验证安装 三、切换 CUDA 版本1.切换版本2.检查版本 前言 当我们复现代码时,总会…

深入分析SSL/TLS服务器的证书(C/C++代码实现)

SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是网络安全领域的重要协议,它们在保护网络通信中发挥着至关重要的作用。这些协议通过加密和身份验证机制,确保数据在传输过程中的机密性和完整性…

建投数据与中再数科签署战略合作协议

近日,建投数据科技股份有限公司(以下简称“建投数据”)与中再保数字科技有限责任公司(以下简称“中再数科”)签署战略合作协议。双方通过资源整合共享,实现优势互补,共同探索产品及服务的跨领域…

初见:AntDB智能运维“三剑客“之ACC

前情回顾 在前两个章节中,我们介绍了 AntDB 智能运维"三剑客"的 ADC 和 MTK。 初见:AntDB智能运维"三剑客"之ADC 初见:AntDB智能运维"三剑客"之MTK 本文将继续介绍 AntDB 数据库智能运维平台 ACC。 AntDB 介绍…

如何设置PHP wkhtmltopdf

首先参考:Composer三步曲:安装、使用、发布 在 php 路径下,应能打开命令行输入php -v能够看到php版本信息。 然后执行以下三条: php -r "copy(https://install.phpcomposer.com/installer, composer-setup.php);"php…

minist数据集分类模型的训练

minist数据集训练 训练方法:利用pytorch来实现minist数据集的分类模型训练 训练模型如下图所示 模型代码: import torch from torch import nn from torch.nn import Flattenclass Net(nn.Module):def __init__(self):super().__init__()self.module …

ChatGPT对话:Scratch编程中一个单词,如balloon,每个字母行为一致,如何优化编程

【编者按】balloon 7个字母具有相同的行为,根据ChatGPT提供的方法,优化了代码,方便代码维护与复用。初学者可以使用7个字母精灵,复制代码到不同精灵,也能完成这个功能,但不是优化方法,也没有提高…

__builtin_constant_p 常量检查函数

__builtin_constant_p 详细介绍 功能:__builtin_constant_p 是 GCC (GNU Compiler Collection) 提供的一个内置函数,用于在编译时检测一个表达式是否是常量。它返回一个整型值: 如果表达式 exp 是编译时常量,则返回 1。否则&…

【sklearn模型训练全指南】深入理解机器学习模型的构建过程

标题:【sklearn模型训练全指南】深入理解机器学习模型的构建过程 在机器学习中,模型训练是一个核心过程,它涉及到从数据中学习并获得预测能力。scikit-learn(简称sklearn)作为Python中一个广泛使用的机器学习库&#…

FairJob:促进在线广告系统公平性研究

在人工智能(AI)与人类动态的交汇处,既存在机遇也存在挑战,特别是在人工智能领域。尽管取得了进步,但根植于历史不平等中的持续偏见仍然渗透在我们的数据驱动系统中,这些偏见不仅延续了不公平现象&#xff0…

Centos新手问题——yum无法下载软件

起因:最近在学习centos7,在VM上成功安装后,用Secure进行远程登陆。然后准备下载一个C编译器,看网络上的教程,都是用yum来下载,于是我也输入了命令: yum -y install gcc* 本以为会自动下载&…

使用Python绘制雷达图

使用Python绘制雷达图 雷达图效果代码 雷达图 雷达图,也称为蛛网图或星型图,是一种二维图表,用于显示多变量数据。每个变量在一个从中心点向外辐射的轴上表示,轴的数量与变量的数量相同。雷达图通常用于比较多个样本的多维数据&a…

docker部署redis/mongodb/

一、redis 创建/root/redis/conf/redis.conf 全部执行命令如下 docker run -it -d --name redis -p 6379:6379 --net mynet --ip 172.18.0.9 -m 400m -v /root/redis/conf:/usr/local/etc/redis -e TXAsia/Shangehai redis redis-server /usr/local/etc/redis/redis.conf 部署…

C#——密封类详情

密封类 密封类是密封方法的扩展,用于确保某个类不会被继承。在C#中,你可以使用sealed关键字来声明一个密封类。 public sealed class SealedClass {// 类成员定义 } 如果使用密封类继承的话,程序会报错!!&#xff0…

01:spring

文章目录 一:常见面试题1:什么是Spring框架?1.1:spring官网中文1.2:spring官网英文 2:谈谈自己对于Spring IOC和AOP的理解2.1:IOCSpring Bean 的生命周期主要包括以下步骤: 2.2&…