【问题标题】:how to send a POST request to download a file using rn-fetch-blob?如何使用 rn-fetch-blob 发送 POST 请求以下载文件?
【发布时间】:2019-03-23 10:46:17
【问题描述】:

我正在使用rn-fetch-blob 库来下载文件并将其保存到设备中,并且我已经成功地使用 GET 请求来做到这一点:.fetch('GET', "http://api.pdflayer.com/api/convert?access_key=MY_ACCESS_KEY&document_url=URL_PATH"),但我使用的 API 只接受发布请求,所以我尝试了这个但没有用:

const { config, fs } = RNFetchBlob;
let DownloadDir = fs.dirs.DownloadDir;
let options = {
  fileCache: true,
  addAndroidDownloads : {
    useDownloadManager : true,
    path: DownloadDir + "/file.pdf"
  }
};
const data = JSON.stringify({
  access_key: "MY_ACCESS_KEY",
  document_url: "https://pdflayer.com/downloads/invoice.html"
});
config(options)
  .fetch('POST', 'http://api.pdflayer.com/api/convert', {body: data})
    .then((res) => {
       console.log(res);
    })
    .catch((err) => {
       console.log(err)
    })

如果我没有正确发送我的请求,我应该怎么做?提前致谢。

【问题讨论】:

    标签: javascript react-native fetch


    【解决方案1】:

    根据 rn-fetch-blob 的文档:

    headers:object (可选)HTTP请求的Headers,值为 如果您要上传二进制文件,标头应该被字符串化, content-type 应该是 application/octet-stream 或 multipart/form-data(见上面的例子)。

    正文:字符串 |数组(可选)HTTP 请求的正文,正文 可以是 BASE64 字符串,也可以是包含对象元素的数组, 每个元素都有 2 个必需的属性名称、数据和可选 属性文件名,一旦设置文件名,数据属性中的内容将 被视为文件的路径或 BASE64 字符串,这将是 稍后转换为字节数组。

    我认为您应该为您的请求定义内容类型并像这些示例一样更改您的代码:

    // Post binary data using base64 encoding
    RNFetchBlob.fetch('POST', 'http://myupload.com/upload', { 
            'Content-Type' : 'application/octet-stream' 
        }, RNFetchBlob.base64.encode(mydata))
    
    // Post binary data from existing file
    RNFetchBlob.fetch('POST', 'http://myupload.com/upload', { 
            'Content-Type' : 'application/octet-stream' 
        }, RNFetchBlob.wrap(path_to_the_file))
    
    // Post form data 
    RNFetchBlob.fetch('POST', 'http://myupload.com/upload', { 
            'Content-Type' : 'multipart/form-data' 
        }, [
            { name : 'user_name', data : 'Bill' },
            // binary field data from a file path, use `wrap` method to wrap the path
            { name : 'avatar', filename : 'avatar.jpg', data : RNFetchBlob.wrap(path_to_the_file) },
            // binary field data encoded in BASE64
            { name : 'pet-avatar', filename : 'pet-avatar.jpg', data : RNFetchBlob.base64.encode(image_data) },
        ])
    

    希望对你有帮助:)

    【讨论】:

    • @BlueTurtle 将您的内容类型更改为“multipart/form-data”
    • 我做了,但没有任何改变!,我已经在邮递员中测试了这个 API,我可以发送一个具有完全相同数据的发布请求并获取一个文件,我确定有什么问题我的要求
    • 你知道有什么替代库可以满足我的需要吗?
    • @BlueTurtle 也许您的问题与其他问题有关,但是,您可以改用 XMLHttpRequest、Frisbee 或 axios 库。
    猜你喜欢
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多