用HttpURLConnection复现http响应码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);// 默认值为 true
            con.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输入,默认值为 true
            con.setDoOutput(false);// 设置是否使用HttpURLConnection进行输出,默认值为 false

            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();
        }
    }
}

报错log:

http状态码:405
测试失败:405

Caused 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进行输出,默认值为 false

            OutputStreamWriter 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输入,默认值为 true
            con.setDoOutput(true);// 设置是否使用HttpURLConnection进行输出,默认值为 false


            OutputStreamWriter 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一样。

相关推荐

  1. Http响应状态

    2024-07-10 16:54:05       23 阅读
  2. HTTP常见响应

    2024-07-10 16:54:05       45 阅读
  3. HTTP 响应

    2024-07-10 16:54:05       16 阅读
  4. HTTP常见响应状态

    2024-07-10 16:54:05       17 阅读
  5. HTTP常见报错响应

    2024-07-10 16:54:05       24 阅读
  6. 常见的Http响应状态

    2024-07-10 16:54:05       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 16:54:05       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 16:54:05       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 16:54:05       4 阅读
  4. Python语言-面向对象

    2024-07-10 16:54:05       5 阅读

热门阅读

  1. Nginx Websocket 协议配置支持

    2024-07-10 16:54:05       10 阅读
  2. Perl语言入门到高级学习

    2024-07-10 16:54:05       10 阅读
  3. 【 HTML基础知识】

    2024-07-10 16:54:05       9 阅读
  4. Vue3框架搭建3:配置说明-prettier配置

    2024-07-10 16:54:05       9 阅读
  5. Python基础练习•二

    2024-07-10 16:54:05       13 阅读
  6. 【Unity】ScreenToWorldPoint转换三维空间MousePosition

    2024-07-10 16:54:05       11 阅读
  7. AD确定板子形状

    2024-07-10 16:54:05       9 阅读
  8. ELK优化之Elasticsearch

    2024-07-10 16:54:05       12 阅读
  9. QianfanLLMEndpoint和QianfanChatEndpoint的区别

    2024-07-10 16:54:05       11 阅读