具有二进制正文的 iOS swift post 请求

2024-04-09

我想从 iOS (swift3) 发出一个 POST 请求,该请求传递一大块原始字节作为正文。我做了一些实验,这让我认为以下方法有效:

let url = URL(string: "https://bla/foo/bar")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = Data(hex: "600DF00D")
let session = URLSession.shared
let task = session.dataTask(with: request) { (data, response, error) in
    "DATA \(data ?? Data()) RESPONSE \(response) ERROR \(error)".print()
}
task.resume()

直到我尝试发送一些简单的内容(例如单个 0xF0)之前,我并不知道这是一个问题。这时我的龙卷风服务器开始抱怨我正在发送它

WARNING:tornado.general:Invalid x-www-form-urlencoded body: 'utf-8' codec can't decode byte 0xf0 in position 2: invalid continuation byte

我是否应该以某种方式设置一些标题?或者我需要做一些不同的事情?


两种常见的解决方案是:

  1. 您的错误消息告诉我们网络服务正在等待x-www-form-urlencoded请求(例如key=value)并为value,您可以对二进制有效负载执行 Base-64 编码。

    不幸的是,base-64 字符串仍然需要进行百分比转义(因为 Web 服务器通常会解析+字符作为空格),所以你必须这样做:

    let base64Encoded = data
        .base64EncodedString(options: [])
        .addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)!
        .data(using: String.Encoding.utf8)!
    
    var body = "key=".data(using: .utf8)!
    body.append(base64Encoded)
    
    var request = URLRequest(url: url)
    request.httpBody = body
    request.httpMethod = "POST"
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard error == nil else {
            print(error!)
            return
        }
    
        ...
    }
    task.resume()
    

    Where:

    extension CharacterSet {
        static let urlQueryValueAllowed: CharacterSet = {
            let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
            let subDelimitersToEncode = "!$&'()*+,;="
    
            var allowed = CharacterSet.urlQueryAllowed
            allowed.remove(charactersIn: generalDelimitersToEncode + subDelimitersToEncode)
            return allowed
        }()
    }
    

    有关该字符集的更多讨论,请参阅此答案中的第 2 点:https://stackoverflow.com/a/35912606/1271826 https://stackoverflow.com/a/35912606/1271826.

    无论如何,当您在服务器上收到此内容时,您可以检索它,然后反转 Base-64 编码,然后您将获得原始的二进制有效负载。

  2. 或者,您可以使用multipart/formdata请求(您可以在其中提供二进制有效负载,但必须将其包装为更广泛的一部分)multipart/formdata格式)。看https://stackoverflow.com/a/26163136/1271826 https://stackoverflow.com/a/26163136/1271826如果你想自己做这件事。

对于这两种方法,图书馆喜欢阿拉莫菲尔 https://github.com/Alamofire/Alamofire让它变得更加容易,让您摆脱构建这些请求的麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有二进制正文的 iOS swift post 请求 的相关文章

  • ReactNative - 未处理的 JS 异常:SyntaxError

    当我尝试在 iOS 8 上启动 RUN 应用程序时 出现这个奇怪的错误 Unhandled JS Exception SyntaxError仅此而已 不再有更多信息 有any1偶然发现这个问题吗 在 iOs 9 上应用程序运行正常 x代码版
  • 在 IOS 中从 iPhone 删除资产(图片或视频)

    我正在开发一个 Iphone 应用程序 我可以使用 Assetslibrary 枚举资产并将它们加载到表视图中 用户可以在应用程序中删除一行 图片 视频 但如何直接从我的应用程序更新 Iphone 相册 否则 刷新时 表视图将重新加载之前删
  • 具有动态警报正文的快速本地通知

    所以我可以创建一个像这样的本地通知 var localNotification UILocalNotification localNotification fireDate NSDate timeIntervalSinceNow 7 loc
  • 如何在 swiftUI (macOS) 中检测按键按下和释放

    除了标题之外没什么可说的 我希望能够在按下按键和释放按键时 在 macOS 上 在 swiftUI 视图中执行操作 在 swiftUI 中是否有任何好的方法可以做到这一点 如果没有 有什么解决方法吗 不幸的是 键盘事件处理是其中一个令人痛苦
  • 在 Xcode5 中使用 XCTest 时 AFNetworking 导致错误

    我正在使用 Xcode 5 现在刚刚开始对现有项目进行单元测试 为此我添加了CocoaTouch Unit Testing Bundle作为我的项目的目标 目标名称是 MyAppTests 我之前使用添加了 AFNetworking 库Co
  • SwiftUI:动态“列表”中的“切换”在重用时会破坏其布局?

    我试图展现一种动态List行包含Toggle元素 这Toggle最初布局正确 但是当它们滚动进和滚出视图时 即单元格重用时 它们的布局会中断 最小示例代码 import SwiftUI struct SwitchList View var
  • 重叠的装载机圆

    我试图重现苹果为应用程序 活动 制作的重叠圆圈 见下图 如果您使用标准贝塞尔路径 起始 结束位置将仅在 0 到 2PI 之间产生影响 例如 如果您尝试填充 4PI 即使使用一些阴影 则无法模拟重叠加载 如何制作类似于苹果解决方案的东西来创建
  • 如何解决malloc_error_break?

    我在 iOS 3 0 模拟器上遇到此错误 但在 3 1 3 和 3 2 模拟器上没有遇到此错误 创建符号断点后malloc error break 我在日志中看到了这一点 Session started at 2010 02 13 19 1
  • 为什么 UITableViewCell 不可访问(对于 VoiceOver)

    我并不是想解决任何问题 当然你可以设置isAccessibilityEnabled true它有效 我的问题是 为什么它默认关闭并且界面生成器中没有适当的部分 在我看来 不建议使 UITableViewCell 子类可访问 有没有更好的方法
  • iOS:滚动视图仅在键盘出现后才起作用

    我制作了滚动视图 其中有很多文本字段 我添加了更新的 TPKeyBoardAvoidingScrollView 并将其添加到滚动视图的文件所有者中 我在 h 文件中添加了插座 在 m 文件中综合并添加了行 self view addSubv
  • 对成员“buildBlock()”的引用不明确

    我一直在尝试使用 Swift UI 为 iOS 13 制作一个应用程序 但我不断收到这个奇怪的错误 对成员 buildBlock 的引用不明确 无论我做什么 错误都不会消失 我尝试一次对代码段进行注释 以查看哪一部分可能导致了问题 但唯一有
  • 从 iOS 13 开始安排 iOS 后台任务

    我正在实现用于更新数据的BackgroundTasks 框架 但我遇到了以下问题 无法计划刷新App 错误域 BGTaskSchedulerErrorDomain代码 1 空 无法安排数据提取 Error Domain BGTaskSche
  • 查找已用应用程序名称的捆绑包/开发人员

    我正在尝试将应用程序上传到应用程序商店并收到以下错误 很容易理解 The App Name you have entered has already been used 该应用程序不在 iTunes 上 有什么方法可以找出谁拥有该应用程序或
  • iOS 解决方法:在没有 CSS 属性的情况下平滑滚动 滚动行为:平滑?

    编辑 我找到了一个 jQuery 解决方案 https codepen io chriscoyier pen dpBMVP https codepen io chriscoyier pen dpBMVP这个确实可以在 iOS 上运行 我想
  • 在视图之间传递核心数据实体变量

    我无法理解如何在视图之间使用核心数据实体变量 为了更好地理解我的问题是什么 我的代码如下 View A 基本上 您必须将完整预算实体或相关预算实体的 ID 从视图 A 传递到视图 B 由于不知道您的应用程序的视图层次结构和逻辑 我假设您选择
  • iOS 防止计时器 UILabel 在数字变化时“晃动”

    我有一个UILabel它以以下格式显示计时器的输出MM ss SS 分 秒 厘秒 但是随着厘秒宽度的变化 它从左向右 摇动 例如 11 比 33 窄 有什么办法可以减轻这种情况吗 我尝试过将其居中 给它固定的宽度 但它们似乎没有帮助 从iO
  • XCode 4.5 给我“SenTestingKit/SenTestKit.h”文件未找到,但适用于 4.4.1

    我刚刚安装了 XCode 4 5 它在我现有的项目之一上给了我一个 SenTestingKit SenTestingKit h 文件未找到错误 此错误仅发生在 XCode 4 5 中 但它在 4 4 1 上编译正常 我已经检查过SenTes
  • ios 导航 堆栈操作

    我在尝试从 iOS 应用程序操作导航堆栈时遇到问题 或者至少是由于这种操纵而产生的行为 我的情况 我有 3 个 ViewController 控制器a显示多个级别 控制器 b 是游戏视图 控制器 c 是某种分数 显然 我将在控制器 a 中选
  • ios - Gamekit 的 GKOctree 未找到元素

    我正在尝试使用GKOctree https developer apple com documentation gameplaykit gkoctree用于高效检索 3D 空间中的对象 然而 以下代码似乎没有按预期工作 import Gam
  • iOS 电池监控 Swift

    我已将监控设置为启用 但模拟器和设备中的电池电量仍然为 1 UIDevice currentDevice batteryMonitoringEnabled true var level UIDevice currentDevice batt

随机推荐

  • 如何使用 jquery 淡入文本装饰 css?

    我有以下代码 This is a span sentence span 当用户将鼠标悬停在sentence 我希望在单词下方淡入下划线 这似乎是一个简单的问题 但我一直不知道如何最好地做到这一点 需要明确的是 我不能只使用css hover
  • Firefox 错误地记住单选按钮

    在 Firefox 7 0 1 中 我有两个复选框和许多其他输入 当我通过 jQuery 添加另一个输入时 Firefox 无法正确记住选择了哪些无线电输入 例如 如果我选择第一个单选按钮 然后刷新页面 则选择第二个单选按钮而不是第一个单选
  • 如何使用 Facebook Graph API 执行 FQL 查询

    我正在寻找一种使用新的 Open Graph API 执行 FQL facebook 查询语言 查询的方法 但没有成功 有谁知道我该怎么做 通过这个优秀的例子在这里找到了答案 http code google com p facebook
  • 无头 Linux 上的命令行“Android update sdk”

    如何在无头 Linux 服务器上更新 安装 Android SDK 平台 我得到的只是以下错误 似乎实际上不支持 更新 sdk 操作 android sdk linux 86 tools android verbose update sdk
  • 为什么有 2 种 AppFabric?

    我看到我们现在拥有 Windows Server AppFabric 和 Azure AppFabric 这只是 Microsoft 营销部门的命名空间冲突还是这些技术共享通用接口 有人告诉我 可以在本地生产服务器上使用 Azure App
  • 如何在 iOS 程序退出时关闭 UIManager 文档

    我有一个围绕全局 UIManagedDocument 核心数据 的 iOS 程序 我想知道如何确保它在程序退出之前正确保存和关闭 首先 如果我想确保在退出之前保存该文档 我应该 可以打电话吗 void closeWithCompletion
  • 如何在 socket.io python 服务器中获取连接客户端的会话 ID?

    我有这样的事情 from flask import Flask jsonify request render template Response from flask socketio import SocketIO emit app Fl
  • 如何将图例放在情节之外

    我有一系列 20 个图 不是子图 要在一个图中绘制 我希望图例是在盒子之外的 同时 我不想更改轴 因为图形的尺寸会减小 我想将图例框保留在绘图区域之外 我希望图例位于绘图区域右侧的外部 有没有办法减小图例框内文本的字体大小 从而使图例框的尺
  • Sequelize 创建具有关联的对象

    我正在尝试保存续集模型及其关联 所有关联都是一对一的 从数据库中检索具有关联的模型效果很好 但插入它们是另一回事 而且文档只会让我更加困惑 这是我的插入方法 models radcheck create user include model
  • 将csv文件导入access的VBA程序

    我需要 VBA 中的程序将数据从 csv excel 文件导入到 access 而不需要一些记录 如页眉和页脚 例如 我在 csv 文件中有一个表 其中包含一些 不属于表日期的句子 A1 这是一些句子标题 A2标题A3 A7 数据数据数据数
  • Azure VM的公共静态IP [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有什么方法可以赋值Azure VM 的公共静态 IP 我是否必须通过 Azure 虚拟网络进行操作
  • 如何使用 Tailwindcss 创建真正的粘性页眉/页脚(即使滚动也粘在底部)?

    很多博客和帖子声称使用 Tailwindcss 创建 粘性页脚 但我找不到thought关于内容超过简短的 hello world 行的情况 例如在none在这些示例中 如果主区域足够高可以滚动 则页脚会 粘住 https www goma
  • 用于分配视口元参数的脚本,iPhone / iPad 难题

    我正在使用 JavaScript 片段根据浏览器窗口的宽度设置视口元标记的内容参数 该脚本几乎完成了它应该做的事情 它将任何大屏幕设备的初始比例值设置为 1 将纵向模式下的 iPad 设置为 0 5 并将任何屏幕宽度小于 700px 的设备
  • numpy 广播如何执行得更快?

    在下面的问题中 https stackoverflow com a 40056135 5714445 https stackoverflow com a 40056135 5714445 Numpy 的广播提供了一种解决方案 其速度几乎比使
  • 使用支持 bean 的单个属性绑定两个 JSF 输入字段

    假设我有两个h inputText成分 我想将两个文本字段绑定到支持 bean 中的单个属性 问题是提交给支持 bean 的值是来自第二个文本字段的值 我希望该值应该从用户输入文本的字段提交 My code
  • 向特定联系号码发送 Whatsapp 消息(Swift 项目)

    我正在尝试向存储在全局变量中的收件人号码发送 Whatsapp 消息 通过使用这个简单的代码 let whatsAppUrl NSURL string whatsapp globalPhone if UIApplication shared
  • comonad 的简洁总结。 (其中 monad 是“不纯计算的类型”)

    就简洁的总结而言 这种对 Monad 的描述似乎胜出 https stackoverflow com questions 2488646 why are side effects modeled as monads in haskell 将
  • 通过扩展名限制可选文件[重复]

    这个问题在这里已经有答案了 如何通过扩展名限制可以使用 input type file 元素选择的文件 我已经知道接受属性 但在 chrome 中 它确实通过定义的最后一个 MIME 类型 在本例中为 gif 来限制文件 而 FF4 甚至不
  • 为什么需要EventSourcingHandler(在聚合对象中)?

    公平警告 我不知道我在做什么 所以即使问这个问题也可能会出错 我想要更新一个简单对象 聚合 的状态 然后向 UI 提供已更改对象的投影 这是我的聚合对象 命令处理程序存在 但此处未显示 Aggregate public class Widg
  • 具有二进制正文的 iOS swift post 请求

    我想从 iOS swift3 发出一个 POST 请求 该请求传递一大块原始字节作为正文 我做了一些实验 这让我认为以下方法有效 let url URL string https bla foo bar var request URLReq