- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个条件,我必须在字符串中发送 body 的两个值,在 JSON 中发送另一个值
我的结构:
struct AttendancePost : Codable {
let acad_id :String
let school_id :String
let class_id:String
let section_id:String
let stdid:String
var status:String
let attendant_id:String
}
我在模型中以这种方式插入了数据:
let singldata = AttendancePost(acad_id: data.acad_id!, school_id: SCHOOL_ID, class_id: self.classFID, section_id: self.secID, stdid: data.stdid!, status: "1", attendant_id: savedsesuid!)
self.dataToPost.append(singldata)
var dataToPost = [AttendancePost]()
let jsonEncoder = JSONEncoder()
let jsonData = try? jsonEncoder.encode(dataToPost)
let postData = try? JSONSerialization.data(withJSONObject: jsonData, options: JSONSerialization.WritingOptions.prettyPrinted)
let theBody = "attendance_details=\(jsonData)" + "&user_id=\(savedsesuid!)" + "&school_id=" + SCHOOL_ID
request.httpBody = theBody.data(using: .utf8)
我收到这个错误:
'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'
最佳答案
问题
此代码存在一些问题,首先,您将 singldata
附加到名为 dataToPost
的类(或类型)属性。然后,您将创建一个同名的局部变量(即 dataToPost
),它使用 AttendancePost
类型的空数组进行初始化。然后,您将这个局部变量 dataToPost
(包含一个空数组)传递给您的 JSONEncoder
,然后再尝试使用 JSONSerialization
使用编码器创建的 JSON,这是引发错误的地方。
解决方案
出现此错误是因为您使用来自 JSONEncoder 的数据,而不是 Foundation 对象(例如字典或数组)作为 JSONObject
值。删除或注释掉
let postData = try? JSONSerialization.data(withJSONObject: jsonData, options: JSONSerialization.WritingOptions.prettyPrinted)
错误将消失。但这不会是您问题的终结。首先,您应该按如下方式构建代码的主体部分:
let jsonEncoder = JSONEncoder()
let jsonData = try? jsonEncoder.encode(dataToPost)
var theBody = Data()
if let a = "attendance_details=".data(using: .utf8) {
theBody.append(a)
}
theBody.append(jsonData)
let str = "&user_id=\(savedsesuid!)" + "&school_id=" + SCHOOL_ID
if let b = str.data(using: .utf8) {
theBody.append(b)
}
request.httpBody = theBody
最后,如果将前三行代码简单地简化为:
let dataToPost = AttendancePost(acad_id: data.acad_id!, school_id: SCHOOL_ID, class_id: self.classFID, section_id: self.secID, stdid: data.stdid!, status: "1", attendant_id: savedsesuid!)
如上所述,目前您的代码正在将一个空数组传递给 JSONEncoder
实例。
注意:此代码未经测试并根据内存编写,但出现的任何编译器警告应该很容易解决。
关于json - 如何在 swift 4 的 httpBody 中同时发送字符串值和 json 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49609378/
我想创建 POST 方法的主体 Content-Type: application/x-www-form-urlencoded 我有一本字典 let params = ["key":"val","ke
我有; let parameters = [ "generalSearchInput": search, "requireAllWords":
概览 有2个URLRequest,一个有httpBody,一个没有httpBody。 然而,当比较时,它表明两者是相等的。 问题 这是预期的行为还是我遗漏了什么? 代码 let url = URL(s
我已将 Firebase 与我的 iOS 项目以及此处提到的所有必要步骤集成 https://firebase.google.com/docs/cloud-messaging/ios/client但它
这是我向服务器发送请求的操作。 let urlStr = "someurl" var request = URLRequest(url: URL(string: urlStr)!)
弄清楚了,见下文: 我正在尝试创建一个程序,可以将文本文件的内容快速传递给 http POST 请求。我正在存储在文本文件中运行的 API 查询的过滤器,并希望将它们作为 JSON 对象(?我认为,无
我想将另一个字典作为参数附加到 URLRequest 的 httpBody 请求模型: struct RequestModel: Encodable { let body: Body } st
我想使用 NSURLSessionUploadTask 和 fileUrl API 上传一个大文件。下面的代码是我写的上传一个大文件。我发现了这些问题: 在 -URLSession:task:didC
我正在创建一个演示 Web 服务代码而不使用 AFNetworking 框架。我的 HTTP Request Dictionary 中的参数。如何在 HTTPBody 上设置它? 我的代码如下 NSM
我正在尝试将项目的大部分使用 NSURLConnection 的 NSURLRequest 转换为 ASIHTTPRequest 调用。我遇到了关于在 ASIHTTPRequest 中设置 HTTPB
我正在使用名为“Poster”的 Firefox 工具来检查我的 Web 服务是否正常工作。当我发布请求时,我在要发送的内容中发送一个 JSON 对象(也调用 HTTP body data )。 当我
我正在尝试向 Twitter API 发送 POST 请求以获取 bearer_token 作为仅应用程序身份验证的一部分。我已经按照他们的文档 ( https://dev.twitter.com/o
我有我的 NSURLProtocol MyGreatProtocol。我将它添加到 URL 加载系统, NSURLProtocol.registerClass(MyGreatProtocol) 然后我
我需要使用 HTTPBody of Array 向我的服务器发送一个发布请求。这是我的参数数组: params = [ "message" : [
我正在向某个 URL 发帖,我的 webDev 告诉我需要设置 "data=" 作为参数,我的 JSONObject 作为键。我不知道如何将字符串设置为参数。 我尝试在 request.httpBod
如何使用 alamofire 多部分请求 Swift 打印 HTTPBody 现在我正在尝试使用下面的代码,但应用程序在此行崩溃 print("HTTP Body \(String(data: (re
我试图在 Objective-C 的 POST 请求上传递两个不同的参数。 第一个参数应该放在 Header 上,另一个应该放在 Body 上。 NSDictionary *headerParams
我正在对服务器进行 POST 调用,但 Alamofire 始终将正文作为 JSON 而不是作为编码的表单 URL 发送,我知道为了对正文进行编码,我必须插入 data(使用: .utf8, allo
我在请求中传递了 HTTPBody。但无法得到应有的回应。 下面是我的代码: NSURL *url = [NSURL URLWithString:@"https://sample.ios.com/l1
有没有一种方法可以使用 Combine 将对象编码为 urlRequest.httpBody 或从解码为具有特定错误类型的 AnyPublisher 返回错误。 我无法让它工作,而且似乎没有使用 co
我是一名优秀的程序员,十分优秀!