前言

    有时候发送http请求不想让库自动帮忙处理重定向,库里面默认的是会把所有重定向都完成一遍,结果就是最后一个没有重定向的请求的结果。因此需要一种方案直接获取首次访问的结果,不走重定向。go的http库里面是使用如下代码检查重定向的,以前我傻傻的修改源码让下面这段代码直接返回,这样需要重新编译go自带的库,后来发现更简单的方案。

var shouldRedirect bool
redirectMethod, shouldRedirect, includeBody = redirectBehavior(req.Method, resp, reqs[0])
if !shouldRedirect {
return resp, nil
}

解决方案

    下面代码可以验证自动处理重定向,以及不走重定向的方案。

package main

import (
"io/ioutil"
"log"
"net/http"
"time"
) func main() {
go server()
time.Sleep(time.Second)
mUrl := "http://127.0.0.1:12345/post"
{ // 常规方法
req, err := http.NewRequest(http.MethodPost, mUrl, nil)
if err != nil {
log.Fatal(err)
}
resp, err := http.DefaultClient.Do(req)
if resp != nil {
defer resp.Body.Close()
}
if err != nil {
log.Fatal(err)
}
byt, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
log.Println(resp.StatusCode, "|", string(byt[:128]))
} { // 去掉自动处理重定向
req, err := http.NewRequest(http.MethodPost, mUrl, nil)
if err != nil {
log.Fatal(err)
}
resp, err := http.DefaultTransport.RoundTrip(req)
if resp != nil {
defer resp.Body.Close()
}
if err != nil {
log.Fatal(err)
}
byt, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
log.Println(resp.StatusCode, "|", string(byt[:128]))
}
} // 下面开启一个服务,重定向到百度
func server() {
http.HandleFunc("/post", mPost)
http.ListenAndServe(":12345", nil)
} func mPost(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "http://www.baidu.com", http.StatusFound)
w.Write([]byte(time.Now().String()))
}

结论

    如下的第一个请求是直接返回百度的网页,及重定向以后的内容。第二个请求直接返回第一个302重定向的内容。

2020/10/14 13:11:56 200 |

2020/10/14 13:11:56 302 | 2020-10-14 13:11:56.6559382 +0800 CST m=+1.429170501

golang不想http自动处理重定向的解决方案的更多相关文章

  1. Nginx1.3.15导致Wordpress,Drupal等框架无限重定向的解决方案

    Wordpress建立的站点出现无限循环重定向问题.很多人遇到这个问题,并不是单纯Wordpress,Drupal, PHPCake等框架也都遇到同样的问题. 新版本的Nginx在收到 http:// ...

  2. VS2012不能加载想要打开的项目/解决方案

    今天回宿舍用自己的电脑敲代码,想要打开之前的项目,可是VS2012打开之后项目却显示“无法加载” 查了之后才知道原来是由于某个安装包缺少引起的,具体做法请看如下 链接:http://jingyan.b ...

  3. 【js字符串当做数组来使用】浪费一晚【想出了3个解决方案】

    数据库的所有数据都打成字符串发到前端. 不必把它的类型也强制转成int这类的,页面负责字符串的展示 这样做可以修改页面的数据 response.setHeader("Content-type ...

  4. Golang 入门 : 数组

    数组是指一系列同一类型数据的集合.数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int.string 等,也可以是用户自定义的类型.一个数组包含的元素个数被 ...

  5. jsp登录页面,展示错误信息,刷新页面后错误依然存在解决方案

    在做登录页面的时候,通常使用form表单同步提交的方法进行提交的,也就是在form表单里去写action,如果登录失败,jsp通过jstl表达式获取错误信息展示在页面上,但是有一个问题就是,即使你刷新 ...

  6. python接口自动化七(重定向-禁止重定向Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...

  7. 痞子衡嵌入式:在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...

  8. 探索ABP的EventHub解决方案

    在上一章中,我们构建了一个简单的全栈 Web 应用程序,我们已经看到了使用 ABP 框架开发应用的典型流程,在接下来,我们将使用 ABP 框架创建更高级的应用程序. 给出具有现实世界复杂性的例子并不容 ...

  9. Web安全相关(三):开放重定向(Open Redirection)

    简介 那些通过请求(如查询字符串和表单数据)指定重定向URL的Web程序可能会被篡改,而把用户重定向到外部的恶意URL.这种篡改就被称为开发重定向攻击.   场景分析 假设有一个正规网站http:// ...

随机推荐

  1. Redis学习2:Redis的数据类型和常用操作

    1.常用命令 命令 说明 返回值 时间复杂度 keys */[pattern] 遍历所有符合条件的key,一般不在生产环境使用 所有key O(n) dbsize 计算key的总数 n O(1) ex ...

  2. 当前PageOffice需要获取更高版本的授权才能正常运行。(Error:0x0005)

      说明当前程序的是pagoeffice3说明当前程序的是pagoeffice3.0的程序,而序列号用的是2.0的序列号,或者说是当前程序是4.0的程序,而序列号用的是3.0的序列号.即当前用的是高版 ...

  3. Agumaster 改善了pagination

    页面越来越完善了.

  4. [bash]用于查找指定格式目录的程序

    功能: 在指定目录下查找符合yyyy-MM-dd(-d)nnn模式的目录名,例如2020-03-22-b888 目标目录情况: [root@localhost testfolder]# ll tota ...

  5. 鼠标移到图片上图片放大【css3实例】

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. vue父子传值与非父子传值

    大概梳理下传值的几种方式 一:父子组件传值 props方式 子组件对外暴露方法并向父组件传递由于触发方法导致的值的变化,父组件接收子组件传递来的值:子组件接收父组件传递来的值,并根据传递来的值在子组件 ...

  7. 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第四周:深层神经网络(Deep Neural Networks)-课程笔记

    第四周:深层神经网络(Deep Neural Networks) 4.1 深层神经网络(Deep L-layer neural network) 有一些函数,只有非常深的神经网络能学会,而更浅的模型则 ...

  8. Badboy脚本录制工具

    Badboy 目录 Badboy 1.Badboy安装 2.脚本的录制 1.Badboy安装 下载地址: http://www.badboy.com.au/download/index 安装其实傻瓜式 ...

  9. 宝塔linux部署node项目

    1.安装宝塔linux之后,按需配置,我的是nginx,不是apq的. 2.下载pm2管理器 3.添加站点,将node项目从localhost打包到到站点,node_modules这个无需打包,这个依 ...

  10. 218。重复元素II(重复元素的下标差值<=K)(哈希)

    给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k. 示例 1: 输入: nums ...