开发者社区 问答 正文

钉钉内置浏览器,手机端用Ajax发起图片后缀地址,method怎么一直是GET?

var xhr   = $.ajaxSettings.xhr();
    var headers = $.extend({
      'Upload-Offset': range_from,
      'Content-Type': 'application/offset+octet-stream'
    }, self.options.headers);
    var options = {
      type: 'PATCH',
      url: self.fileUrl, // 图片后缀地址例如:/api/v1/upload/upload_resumable/default/default.zopen.standalone/c/4/c/4a94af6df4522ab6f8023e8a7f0b9.jpg
      data: blob,
      processData: false,
      contentType: self.file.type,
      cache: false,
      xhr: function() {
        return xhr;
      },
      headers: headers
    };
    $(xhr.upload).bind('progress', function(e) {
      self.bytesWritten = bytesWrittenAtStart + e.originalEvent.loaded;
      self._emitProgress(e);
    });
    this._jqXHR = $.ajax(options)
      .fail(function(jqXHR, textStatus, errorThrown) {
        var msg = jqXHR.responseText || textStatus || errorThrown;
        self._emitFail(msg);
      })
      .done(function() {
        if(range_to === self.file.size){
          if (self.options.resetAfter === true) {
            self._urlCache(false);
          }
          self._emitDone();
        }else{
          self._uploadFile(range_to);
        }
      });
  };

上面url参数是图片后缀地址,服务端获取的request method 变成了GET,如果url改成非图片后缀地址,request method是正常的。


测试type参数为POST也是相同问题。


问题总结:发起Ajax请求,如果请求地址是一个图片后缀地址,浏览器把请求方式统一变成了GET

ISO系统没问题,部分安卓机型有问题,有问题的钉钉版本和浏览器user agnet 如下:
'HTTP_USER_AGENT': 'Mozilla/5.0 (Linux; U; Android 9; zh-CN; BKL-AL00 Build/HUAWEIBKL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/11.9.4.974 UWS/2.13.1.52 Mobile Safari/537.36 AliApp(DingTalk/4.6.18) com.alibaba.android.rimet/11146596 Channel/227200 language/zh-CN',

展开
收起
wangxinyu 2019-04-17 17:15:28 1938 分享 版权
阿里云 AI 助理回答

根据你的描述,问题似乎出在特定的安卓设备和钉钉版本上,当Ajax请求的目标URL指向一个图片后缀时,这些环境下的浏览器会不遵循你设置的HTTP方法(在这里是PATCH),而是将其错误地转换为GET请求。这可能是由于某些特定浏览器或应用内浏览器(如钉钉内置浏览器)对URL结尾是图片格式的特殊处理逻辑导致的。

解决这个问题可能需要一些变通的方法,以下是一些建议:

  1. 修改请求路径

    • 考虑修改服务端接口,避免直接使用以图片后缀结尾的URL发起非GET请求。可以设计一个新的API路径,该路径不暗示资源类型,从而避免触发特定客户端的异常行为。
  2. 使用代理服务

    • 在前端和实际图片上传服务之间部署一个简单的代理服务,这个服务接收所有类型的请求,并将它们正确转发到实际的图片上传处理逻辑中。这样,前端始终请求的是一个“中立”URL,避免了直接对图片URL发起非标准请求的问题。
  3. 检查并适配User-Agent

    • 在发送请求前,通过检测navigator.userAgent来识别出有问题的用户代理字符串。对于这些特定的用户代理,可以尝试调整请求策略,比如临时改变请求方式为POST(虽然你提到POST也有问题,但可以尝试结合其他规避措施)或者通过更改URL方案来绕过这一问题。
  4. 利用表单提交模拟

    • 如果直接的Ajax请求无法按预期工作,可以考虑使用HTML表单(包括隐藏的iframe技术或FormData配合POST请求)来模拟文件上传过程。尽管这可能不是最优雅的解决方案,但在兼容性要求较高的场景下不失为一种可行手段。
  5. 与钉钉团队沟通

    • 如果问题影响范围较大且确定是由钉钉内置浏览器的行为引起,可以尝试联系钉钉的技术支持或开发者社区反馈此问题,看是否能从源头得到修复或官方的建议。

请根据实际情况选择合适的解决方案进行尝试。希望这些建议对你有所帮助!

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答