- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 Siesta 构建 API 客户端和 Xcode 8 上的 Swift 3。我希望能够使用 Siesta 资源获取实体,然后更新一些数据并对 API 进行补丁
。
问题是拥有一个实体,如果我将 JSON 数组保存在我的实体字段中,我无法将它们发送回服务器,我会收到以下错误:
▿ Siesta.RequestError
- userMessage: "Cannot send request"
- httpStatusCode: nil
- entity: nil
▿ cause: Optional(Siesta.RequestError.Cause.InvalidJSONObject())
- some: Siesta.RequestError.Cause.InvalidJSONObject
- timestamp: 502652734.40489101
我的实体是:
import SwiftyJSON
import Foundation
struct Order {
let id: String?
let sessionId: String?
let userId: Int?
let status: String?
let comment: String?
let price: Float?
let products: Array<JSON>?
init(json: JSON) throws {
id = json["id"].string
sessionId = json["sessionId"].string
userId = json["userId"].int
status = json["status"].string
comment = json["comment"].string
price = json["price"].float
products = json["products"].arrayValue
}
/**
* Helper method to return data as a Dictionary to be able to modify it and do a patch
**/
public func toDictionary() -> Dictionary<String, Any> {
var dictionary: [String:Any] = [
"id": id ?? "",
"sessionId": sessionId ?? "",
"userId": userId ?? 0,
"status": status ?? "",
"comment": comment ?? ""
]
dictionary["products"] = products ?? []
return dictionary
}
}
我正在做的是:
MyAPI.sessionOrders(sessionId: sessionId).request(.post, json: ["products": [["product": productId, "amount": 2]], "comment": "get Swifty"]).onSuccess() { response in
let createdObject : Order? = response.typedContent()
expect(createdObject?.sessionId).to(equal(sessionId))
expect(createdObject?.comment).to(equal("get Swifty"))
expect(createdObject?.products).to(haveCount(1))
expect(createdObject?.price).to(equal(product.price! * 2))
if let createdId = createdObject?.id {
var data = createdObject?.toDictionary()
data?["comment"] = "edited Swifty" // can set paid because the user is the business owner
MyAPI.order(id: createdId).request(.patch, json: data!).onSuccess() { response in
result = true
}.onFailure() { response in
dump(response) //error is here
}
}
}
资源:
func sessionOrders( sessionId: String ) -> Resource {
return self
.resource("/sessions")
.child(sessionId)
.child("orders")
}
func order( id: String ) -> Resource {
return self
.resource("/orders")
.child(id)
}
变形金刚:
self.configureTransformer("/sessions/*/orders", requestMethods: [.post, .put]) {
try Order(json: ($0.content as JSON)["data"])
}
self.configureTransformer("/orders/*") {
try Order(json: ($0.content as JSON)["data"])
}
我已经设法通过创建像这样的字典结构来解决这个问题:
let products: Array<Dictionary<String, Any>>?
products = json["products"].arrayValue.map({
["product": $0.dictionaryValue["product"]!.stringValue, "amount": $0.dictionaryValue["amount"]!.intValue]
})
但如果我需要修改任何东西,我会感到非常沮丧:
var data = createdObject?.toDictionary()
data?["comment"] = "edited Swifty"
//if I want to modify the products...
var products = data?["products"] as! Array<Dictionary<String, Any>>
products[0]["amount"] = 4
data?["products"] = products
如何使用 Siesta 发送那些原始的 JSON 数组?它们真的很容易修改和阅读!我浏览了午睡文档和 github 问题但没有成功...
最佳答案
你的问题是 SwiftyJSON 和 Foundation 的 JSONSerialization 不匹配;午睡恰好在其中。
InvalidJSONObject
是 Siesta 告诉你 Foundation 不理解你给它的东西——这将是你的 toDictionary()
方法返回的值。该字典中的大部分内容看起来都不错:字符串、整数、 float 。 (小心使用 float 货币,顺便说一句。)
罪魁祸首是 products
数组:它是 [JSON]
,其中 JSON
是 Foundation 不知道要做什么的 SwiftyJSON 类型做。如果您将 JSON
值转换回简单的字典,您应该是清楚的:
dictionary["products"] = (products ?? []).map { $0.dictionaryObject }
如果这样做不起作用,或者如果您需要在将来诊断类似的错误,请从有问题的字典中删除所有值,然后一次将它们添加回一个看看是哪个导致了 JSONSerialization 的问题。
关于json - Swift Siesta 编辑获取的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40980450/
在我的应用程序中,我有一个封装 Service 的类并具有返回资源和请求的方法。在我的测试中,我想在不进行任何实际网络调用的情况下模拟请求和资源的成功/失败。因为 Request是一个协议(proto
是否可以使用 Siesta 管道,接收成功响应,解析它,并根据返回结果,将其重定向到失败响应? 我的服务器响应多次返回 HTTP 200,但带有错误消息/标志。 最佳答案 如果“重定向”的意思是“将
我的 API 中有一个返回 PDF 文件内容的方法。 如何在成功回调中获取响应的原始数据? 最佳答案 所有 Siesta 响应均以原始数据开始(以 Foundation 类型 Data 的形式),然后
我刚开始使用 Bryntum Siesta 和 ExtJs 进行自动化测试。我的第一个非常简单的测试工作如我所料。现在我遇到了 DRY-Code 的问题。 我正在尝试为登录测试编写 DRY 代码。 这
当我在一段时间后(例如几个小时)启动我的应用程序(模拟器或手机)时,Siesta 不会加载我的资源并且 statusOverlay() 将无限期显示。 详细地说,我有一个 HomeViewContro
我正在玩 Siesta 和一些内置断言。 我遇到了 elementIsNotEmpty() 断言的问题。我想检查在登录字段中输入空字符串后,该字段是否真的是空的并且其中没有显示任何内容。 所以我的测试
我检查了很多关于运行外部程序的线程,但它们无法解决我的问题。为了运行 Siesta(DFT 计算),我必须使用类似这样的东西(Si.fdf 是输入文件):午睡 " + fileName + ".o
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我已经设置了 siesta lite 来测试我的 ExtJs 4 应用程序。我想根据我的应用程序的 window.xxx 和 window.yyy 的值运行测试。所以如果 xxx= 1 和 yyy=
我无法在 Swift 中为 Siesta 成功设置本地数据。我的目标是在本地为 URL 设置一个 UIImage,这样就可以在没有下载时间的情况下显示这个本地镜像。 为此,我将 URL 的图像数据设置
我有这个 api,其中登录通过 post 进行,而大多数其他请求使用 get。现在我正在使用 siesta 将登录 url 定义为资源。 func login(username: String, pa
有人知道如何将参数传递给无法更改的回调函数吗? 所以这是我试图实现的代码(这是一个午睡测试方法): Base.js: waitForComponentQueryVisible: function (p
在请求发生之前更改执行异步任务的请求的正确方法是什么? 因此任何请求 Rn 都需要透明地变成 Tn 然后是 Rn。 这里有一些背景知识:任务是一个第 3 方 SDK,它发送一个 token ,我需要将
我刚刚使用 cocoapods 安装了 Siesta (1.0-beta.4),但是当我尝试在 swift 文件中使用 import Siesta 导入它时,我收到此错误:No such module
在我的类(class)中,我有多个 Resource Siesta 对象,我希望在填充 TableView 并启用用户输入之前将这些对象全部加载数据。 代码如下: var trainees: Reso
我正在集成 Siesta,我喜欢它,它解决了我们在使用 RestKit 等框架时遇到的很多问题。 我无法理解的是如何使用内容转换器?我查看了文档和示例,但我不太明白它是如何工作的,我对 Swift 也
我正在使用 Siesta 构建 API 客户端和 Xcode 8 上的 Swift 3。我希望能够使用 Siesta 资源获取实体,然后更新一些数据并对 API 进行补丁。 问题是拥有一个实体,如果我
我正在使用(并且喜欢)Siesta 与我的 Swift 应用程序中的 REST Web 服务进行通信。我已经实现了一系列 ResponseTransformer 来将 API 调用响应映射到模型类,以
我正在使用 Siesta 测试 Ext JS 前端。这是我的登录/注销测试: StartTest(function(t) { t.diag("Login/Logout"); t.cha
我正在尝试使用参数为端点配置转换器。 我成功地为不包含任何参数的端点配置了转换器。但似乎当我尝试使用参数对资源执行相同操作时,它不起作用。 这是我配置变压器的方式: var getExampleDat
我是一名优秀的程序员,十分优秀!