爱编程的深柒 2023-09-30 14:21 采纳率: 0%
浏览 42
已结题

使用uni-app发起网络请求,获取重定向302返回的cookie

使用uni-app发起网络请求,获取重定向302返回的cookie
我需要使用uni-app发起一个post请求,现在存在的问题是:uni.request发起请求后,服务器返回302并重定向到一个新的网址。这时候uniapp会向重定向的网址发起请求,最后获取的响应内容是重定向后的,而我需要重定向前返回为302的响应体和cookie。
我尝试过使用其他方法发起请求,但是会因为没有适配器而需要使用uniapp的。导致获取的响应体又是重定向后的。
我需要在app上使用这个程序,所以发起请求的要适配安卓才行。
联系微信:xbos1314
备注:后端不是我的接口,所以我无法改重定向。后端返回302后会同时返回cookie,我需要获取这个cookie。

  • 写回答

16条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-30 16:12
    关注
    获得1.00元问题酬金

    【相关推荐】




    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
  • 玥轩_521 2023-09-30 16:32
    关注
    获得0.60元问题酬金

    援引通义千问:
    你可以尝试使用uniapp的uni.request发起post请求,并设置withCredentials属性为true,这样在重定向后,会保留之前的cookie。同时,你也可以通过response对象的headers属性来获取服务器返回的set-cookie字段,从而获取到服务器返回的cookie。
    以下是一个示例代码:

    uni.request({
      url: '你的请求地址',
      method: 'POST',
      data: {
        // 请求数据
      },
      withCredentials: true, // 保留之前的cookie
      success: function(res) {
        console.log(res.data); // 输出重定向后的响应体
        console.log(res.headers['set-cookie']); // 输出服务器返回的set-cookie字段
      },
      fail: function(err) {
        console.log(err);
      }
    })
    

    请注意,如果你需要在安卓和iOS上都能使用这个方法,你需要确保你的服务器支持向Android和iOS发送带有cookie的请求。

    评论
  • 小明说Java 2023-09-30 16:50
    关注
    获得0.60元问题酬金

    引用文心一言并结合自己思考回答:
    对于这个问题,你可以尝试使用 axios 这个库来处理。axios 是一个基于 promise 的 HTTP 库,可以用于浏览器和 node.js。下面是一个使用 axios 获取302重定向的cookie的示例:

    import axios from 'axios'  
      
    axios.defaults.withCredentials = true; // 允许跨域请求时携带cookie  
      
    axios.post('http://example.com', {  
        // 发送到服务器的数据  
    })  
    .then(function (response) {  
        // 请求成功时处理  
    })  
    .catch(function (error) {  
        // 请求失败时处理  
        if (error.response) {  
            // 服务器返回的3xx重定向响应  
            console.log(error.response.headers);  
            console.log(error.response.data);  
        } else if (error.request) {  
            // 请求发出但服务器未返回响应  
            console.log(error.request);  
        } else {  
            // 发生错误,请求未成功发出  
            console.log('Error', error.message);  
        }  
        console.log(error.config);  
    })  
    .then(function () {  
        // always executed  
    });
    
    

    你需要把 'http://example.com' 替换成你的请求地址,发送的数据替换成你需要发送的内容。在 .catch() 中,如果服务器返回了3xx重定向响应,你可以通过 error.response 获取到响应头和响应体。如果重定向的URL和你的请求URL同源,那么服务器通常会在响应头中包含 Set-Cookie,你可以从这个响应头中获取到cookie。

    如果你在运行时遇到了跨域问题,你可能需要在后端服务器设置 CORS (跨源资源共享)策略,或者在前端使用代理来绕过这个限制。如果你正在开发一个运行在微信小程序或其他 App上的uni-app应用,你可能需要使用微信小程序的网络请求API或者使用其他API来获取cookie。因为浏览器安全策略限制,JavaScript在浏览器中无法直接获取到HTTP响应中的Set-Cookie。

    评论
  • coder_small_bell 2023-09-30 23:21
    关注
    获得0.40元问题酬金

    直接去header,然后拿cookie就行。

    评论
  • 心梓知识 2023-10-02 15:29
    关注
    获得0.60元问题酬金

    结合GPT给出回答如下请题主参考
    您好,以下是使用uni-app发起网络请求获取重定向302返回的cookie的代码示例:

    uni.request({
      url: 'https://example.com',
      method: 'POST',
      header: {
        'content-type': 'application/json'
      },
      data: {
        username: 'example',
        password: 'password'
      },
      success: (res) => {
        if (res.statusCode === 302) {
          // 获取Set-Cookie字段中的cookie值
          const cookie = res.header['Set-Cookie'][0].split(';')[0];
          console.log('Cookie:', cookie);
        } else {
          console.log('请求失败');
        }
      },
      fail: () => {
        console.log('请求失败');
      }
    });
    

    在上述代码中,我们使用uni.request方法发起一个POST请求,并将用户名和密码作为请求体发送给服务器。如果服务器返回的状态码是302,则说明发生了重定向。此时,我们可以通过访问响应头中的Set-Cookie字段获取返回的cookie值,并打印出来。

    需要注意的是,我们将响应头中的Set-Cookie字段中的cookie值进行了截取和处理,只保留了第一个cookie值。这是因为Set-Cookie字段中可能会包含多个cookie值,而我们只需要其中的一个。

    评论
  • bug菌¹ Java领域优质创作者 2023-10-02 17:31
    关注
    获得1.00元问题酬金

    该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。


    可以尝试使用uni-app的内置拦截器,在拦截器中处理重定向和获取cookie。

    具体步骤如下:

    1.在请求中添加拦截器,代码如下:

    uni.request({
      url: 'your_url',
      method: 'POST',
      header: {
        'Content-Type': 'application/json'
      },
      data: {
        'your_data': 'your_value'
      },
      // 添加拦截器
      interceptor: {
        // 请求前处理
        request: function (config) {
          return config;
        },
        // 响应后处理
        response: function (response) {
          // 判断是否重定向
          if (response.statusCode === 302) {
            // 获取cookie
            const cookie = response.header['Set-Cookie'];
            // 处理重定向
            uni.request({
              url: response.header.Location,
              method: 'GET',
              header: {
                'Cookie': cookie
              },
              success: function (res) {
                // 处理重定向后的响应
                console.log(res);
              },
              fail: function (err) {
                console.log(err)
              }
            })
          }
          return response;
        }
      },
      success: function (res) {
        console.log(res);
      },
      fail: function (err) {
        console.log(err)
      }
    })
    

    2.在拦截器中判断请求是否重定向,如果是则获取重定向后的url和cookie,发起新的请求并携带cookie。

    3.在新的请求中处理重定向后的响应体。

    希望能帮到您,如有问题请随时提出。

    评论
  • 专家-赤兔[在线] 2023-10-02 22:05
    关注
    获得0.60元问题酬金

    引自强大而免费的微信小程序:皆我百晓生。如有帮助,还望采纳。


    在uni-app中,可以使用uni.request方法来发起网络请求。但是由于uni-app对于重定向的处理比较简单,无法直接获取到重定向前的响应体和cookie。但是可以使用插件来实现此功能。

    首先,你需要安装uni-app的插件:uni.requestInterceptor,该插件可以拦截请求并获取重定向前的响应体和cookie。

    安装插件时,首先需要使用npm命令进行安装:

    npm install uni.requestInterceptor
    

    安装完成后,在你的uni-app项目的入口文件(一般为main.js)中,添加以下代码:

    import interceptor from 'uni.requestInterceptor'
    
    Vue.use(interceptor, {
      complete (config, rel, callback) {
        // 判断请求是否为重定向请求
        if (rel.statusCode === 302) {
          // 获取重定向前的响应体和cookie
          const res = rel.data
          const cookie = rel.header['Set-Cookie']
          // 这里可以对响应体和cookie进行处理操作
          // ...
        }
        // 继续请求
        callback()
      }
    })
    

    上述代码中,我们引入了插件,并在Vue中使用了该插件。在complete回调函数中,我们判断了请求是否为重定向请求,如果是则获取了重定向前的响应体和cookie。你可以在这里对响应体和cookie进行自定义的处理操作。

    之后,在你需要发起POST请求的地方,使用uni.request方法来进行网络请求。例如:

    uni.request({
      url: 'http://example.com',
      method: 'POST',
      success (res) {
        // 处理响应
      },
      fail (res) {
        // 处理失败
      }
    })
    

    经过上述操作,你就可以在uni-app中发起POST请求,并获取重定向前的响应体和cookie了。记得根据你的具体情况来修改代码。

    评论
  • 想你依然心痛 全栈领域新星创作者 2023-10-04 09:55
    关注
    获得0.80元问题酬金

    uniapp 基于原生的XMLHttpRequest对象和fetch API,因此可以使用这两个对象,通过设置配置项followRedirectsfalse来禁用自动重定向,然后手动处理重定向,从而获取重定向前的响应体和cookie。

    具体的代码如下:

    uni.request({
      url: 'http://example.com',
      method: 'POST',
      data: {
        // 请求参数
      },
      followRedirects: false,
      success: (res) => {
        if (res.statusCode === 302) {
          // 获取重定向前的响应体和cookie
          const headers = res.headers;
          const cookie = headers['set-cookie'];
          const location = headers['location'];
          uni.request({
            url: location,
            method: 'GET',
            header: {
              Cookie: cookie
            },
            success: (res) => {
              console.log(res);
            }
          })
        }
      }
    })
    

    这里的followRedirects设置为false,表示禁用自动重定向,res.statusCode === 302表示收到重定向响应,然后从响应头中获取set-cookielocation,并且发起新的请求获取重定向前的响应体和cookie。

    需要注意的是,在设置头部时,需要传递重定向后的响应返回的cookie,所以需要在第一次请求中获取到cookie,然后传递到第二次请求的头部中。

    希望这个思路能够帮助你解决问题。

    评论
  • 关注
    获得0.60元问题酬金

    配置uni-app的manifest.json文件,将"h5": { "serviceWorker": { "updateViaCache": "none" } }添加进去,以确保不使用缓存的方式进行重定向

    评论
  • Hi 小朋友 2023-10-06 11:25
    关注
    获得0.40元问题酬金

    在uni-app中,您可以通过设置请求的followRedirects选项来控制是否跟随重定向,并且通过responseCookies属性来获取响应的Cookies。以下是一种可能的实现方式:

    <template>
      <view>
        <button @tap="sendRequest">发送请求</button>
      </view>
    </template>
    
    <script>
    export default {
      methods: {
        sendRequest() {
          uni.request({
            url: 'https://example.com/your_endpoint',
            method: 'POST',
            data: {
              // your request data here
            },
            header: {
              'content-type': 'application/json',
              // other headers if needed
            },
            dataType: 'json',
            followRedirects: false, // 不跟随重定向
            success: (res) => {
              if (res.statusCode === 302) {
                // 这是一个重定向响应
                console.log('重定向前的响应体:', res.data);
                console.log('重定向后的URL:', res.header.Location);
              } else {
                // 这是最终响应
                console.log('最终响应体:', res.data);
                const cookies = res.responseCookies;
                console.log('响应Cookies:', cookies);
              }
            },
            fail: (err) => {
              console.error('请求失败', err);
            },
          });
        },
      },
    };
    </script>
    

    上述代码中,followRedirects选项设置为false,这样在收到302响应时不会自动跟随重定向。您可以在success回调中根据响应的statusCode来判断是否是重定向响应。在最终的响应中,您可以通过responseCookies属性来获取响应的Cookies。

    请注意替换URL和请求数据以适应您的具体需求。确保您的请求头和数据是正确的。如果服务器返回的Cookie不在responseCookies属性中,您可能需要手动处理响应头来提取Cookie信息。

    同时,请确保您的uni-app版本支持followRedirects选项,因为一些旧版本可能不支持。

    评论
  • 技术宅program 2023-10-07 09:40
    关注
    获得0.60元问题酬金

    通过Nginx反向代理来处理302重定向请求,从而获取重定向前的响应体和cookie

    评论
  • yy64ll826 2023-10-07 09:58
    关注
    获得0.40元问题酬金

    uni-app——一种通过Nginx反向代理处理302重定向请求解决网络请求中无法获取Cookie的解决方案
    配置一层Nginx

             location /jwglxt {
                proxy_pass http://jwglxt.zstu.edu.cn;
                proxy_intercept_errors on;
                error_page 301 302 307 = @handle_redirects;
            }
    
            location @handle_redirects {
               set $jsessionid "JSESSIONID=$upstream_cookie_JSESSIONID; Path=/jwglxt; HttpOnly";
                add_header 'Set-Cookie' $jsessionid;
                return 200 ;
            }
    
    
    
    评论
  • Minuw 2023-10-07 17:34
    关注
    获得0.60元问题酬金

    c参考gpt
    在uni-app中,你可以使用uni.request方法来发起网络请求。如果服务器返回302状态码并重定向到另一个网址,uni.request方法会自动跟随重定向并返回最终的响应体。如果你需要获取重定向前的响应体和cookie,可以通过以下步骤实现:

    1. uni.request方法中设置followRedirect参数为false,禁止自动跟随重定向:

      uni.request({
        url: 'http://example.com',
        method: 'POST',
        data: {
          // 请求数据
        },
        header: {
          // 请求头部
        },
        followRedirect: false, // 禁止自动跟随重定向
        success: (res) => {
          // 处理响应体和cookie
        },
        fail: (err) => {
          // 处理请求失败
        }
      })
      
    2. 如果服务器返回302状态码,success回调函数中的res参数会包含一个headers属性,其中包含了响应头部信息。你可以从响应头部中获取重定向前的状态码和cookie:

      success: (res) => {
        // 获取重定向前的状态码
        const statusCode = res.statusCode;
      
        // 获取cookie
        const cookie = res.headers['Set-Cookie'];
      
        // 处理响应体和cookie
      }
      

      注意,Set-Cookie是一个响应头部字段,它包含了服务器返回的cookie信息。如果服务器返回多个cookie,它们会以分号分隔在同一个Set-Cookie字段中。你可以使用字符串分割方法来获取每个cookie。

    3. 如果你需要发送cookie到服务器,可以在请求头部中设置Cookie字段:

      header: {
        'Cookie': cookie // 设置cookie
      }
      

      注意,Cookie是一个请求头部字段,它包含了客户端发送给服务器的cookie信息。如果你需要发送多个cookie,它们也应该以分号分隔在同一个Cookie字段中。

    评论
  • 会跑的小鹿 2023-10-07 20:26
    关注
    获得0.20元问题酬金

    写个条件判断进行处理

    评论
  • GIS工具开发 2023-10-07 21:42
    关注
    获得0.60元问题酬金

    前端判断一下返回302时,然后进行处理

    评论
  • 数据大魔王 2023-09-30 15:47
    关注

    uni-app中使用uni.request发起网络请求时,默认会自动处理重定向。希望获取重定向前的响应体和cookie,可以通过以下步骤进行处理:

    1. 在App.vue中的created生命周期函数中,添加如下代码:
      uni.onUnhandledRejection(function(res) {
      let { reason } = res
      if(reason.statusCode === 302){
       let newUrl = reason.header.Location // 获取重定向的网址
       // 发起一个新的请求获取重定向前的响应体和cookie
       uni.request({
         url: newUrl,
         complete: (res) => {
           console.log("Original response body:", res)
           let cookies = res.header["Set-Cookie"] // 获取响应中的cookie
           console.log("Cookies:", cookies)
         }
       })
      }
      })
      
    2. uni.requestcomplete回调函数中,可以获取到重定向前的响应体。如果服务器返回了cookie,可以通过res.header["Set-Cookie"]来获取
      这样就可以通过在App.vue中的created生命周期函数里进行处理,获取到重定向前的响应体和cookie了。
    评论

报告相同问题?

问题事件

  • 系统已结题 10月8日
  • 创建了问题 9月30日

悬赏问题

  • ¥30 哈夫曼编码译码器打印树形项目
  • ¥20 求完整顺利登陆QQ邮箱的python代码
  • ¥15 怎么下载MySQL,怎么卸干净原来的MySQL
  • ¥15 网络打印机Ip地址自动获取出现问题
  • ¥15 求局部放电案例库,用于预测局部放电类型
  • ¥100 QT Open62541
  • ¥15 stata合并季度数据和日度数据
  • ¥15 谁能提供rabbitmq,erlang,socat压缩包,记住版本要对应
  • ¥15 Vue3 中使用 `vue-router` 只能跳转到主页面?
  • ¥15 用QT,进行QGIS二次开发,如何在添加栅格图层时,将黑白的矢量图渲染成彩色