wvteijlingen / spine Goto Github PK
View Code? Open in Web Editor NEWA Swift library for working with JSON:API APIs. It supports mapping to custom model classes, fetching, advanced querying, linking and persisting.
License: MIT License
A Swift library for working with JSON:API APIs. It supports mapping to custom model classes, fetching, advanced querying, linking and persisting.
License: MIT License
After upgrading to 0.3, date attributes are coming as <null>
from the server. Nothing else changed besides updating Spine.
I'm trying to debug what could be the issue.
Since I upgraded to the latest master (the big rewrite), I'm getting the following error in Spine.swift
:
EXC_BAD_ACCESS (code=1, address=0x18) in operationQueue
I don't reset Spine between tests, but it seems that something inside Spine one operation is leaking into another. I really don't know how to debug this...
Can you suggest some things I could do to debug this?
Hey,
I'm wondering if there is a way to parse subobject in attributes like :
{
"data": {
"type": "posts",
"id": "671",
"attributes": {
"id": 671,
"title": "funy place",
"location": {
"name": "La Sorbonne, Paris",
"short_name": "La Sorbonne",
"latitude": 52.377965,
"longitude": 4.912809,
"distance_from_me": 9125000
}
}
}
}
Thanks
Add support to load new pages of ResourceCollection
and LinkedResourceCollection
objects.
Add support for adding/removing individual related resources instead of replacing the whole link set.
I'm not 100% sure about this, but I think it will be right to set extractedMeta
to (resource as! MetaHoldable).meta
instead ofrepresentation["meta"]
, since http://jsonapi.org/format/#document-meta is defined in root object, not in the document itself?
https://github.com/wvteijlingen/Spine/blob/master/Spine/DeserializeOperation.swift#L161
Write documentation about adapters.
My API uses an amazon-like authentication system:
Each client has a session ID and a session key created upon authentication. The key is stored in the client and never transmitted again.
Each request then has the following headers:
x-request-time
(the time the request is sent in ISO-8601 format)
x-session-id
(the session ID from the authentication above)
x-signature
(HMAC digest with the session key of the string x-request-time
+ x-session-id
+ post-data
"(optional - only if present)
In ember data i do this by overriding ajaxOptions (yes, this is private. I haven't found a better place to do it where I can see the stringified data request)
I don't see an obvious way of doing this with Spine? Am I missing something?
I had a stab at getting this library going in Swift 2.0, but I don't understand enough of how it uses BrightFutures (the API of which has changed dramatically in the last few months it seems) to get it all going again.
Any idea when you will get it going in Swift 2.0?
Relationships are not being included in payloads when the request is an update (PUT
). If the request is a creation (POST
), the relationship hash is included normally.
Expected behavior: relationships should be included on both POST and PUT.
Given a Post
resource that has a Category
(dynamic public var category: Category?
).
spine.registerResource(Post.resourceType) { Post() }
spine.registerResource(Category.resourceType) { Category() }
var category = Category()
category.id = "some-uuid"
category.name = "Swift"
var post = Post()
post.id = "uuid-id"
post.title = "title"
post.body = "body"
post.category = category
spine.save(post)
In the case above, a PUT
operation takes place because id
was set. data.relationships
is NOT included in the call.
If we remove post.id = "uuid-id"
, then a POST
operation will take place and with that, data.relationships
is included in the payload.
I could very well tackle this issue but I have 5 PRs opened right now and I'd need to know if you'd accept this before starting, specially given the Swift 2 effort.
Hi there,
Is there any way to parse a local json file instead of calling a API endpoint?
Thanks, Wouter
In my project, I have a resource that has toMany relation with finite list of other resources (ids are known as well).
It would be nice to be able to have this func public as well as addResourcesAsExisting
since it helps me to manually assign resources that I know already persisted in order to properly track further changes and persist them later.
Let me know what you think and if you want me to make a change.
Hey,
Here is my json :
{
"data": {
"type": "ads",
"id": "671",
"attributes": {
"id": 671,
"title": "SONY TV (de 32 pouces)",
},
"relationships": {
"seller": {
"data": {
"type": "persons",
"id": "95vl7"
}
},
}
},
"included": [
{
"type": "persons",
"id": "95vl7",
"attributes": {
"hash": "95vl7",
"surname": "Prawidlo",
"given_name": "Marine",
"verified": true,
"gamification_level": 3,
"avatar_url_pattern": "/users/{id}/avatars/{width}x{height}/{cropped}"
},
"relationships": {
"friends": {
"data": [
{"type": "persons", "id": "87aY7"},
{"type": "persons", "id": "xN21b"}
]
}
}
},
{
"type": "persons",
"id": "87aY7",
"attributes": {
"hash": "87aY7",
"surname": "Abergel",
"given_name": "Arthur",
"verified": true,
"gamification_level": 3,
"avatar_url_pattern": "/users/{id}/avatars/{width}x{height}/{cropped}"
}
},
{
"type": "persons",
"id": "xN21b",
"attributes": {
"hash": "xN21b",
"surname": "Dubreuil",
"given_name": "Jeremy",
"verified": true,
"gamification_level": 3,
"avatar_url_pattern": "/users/{id}/avatars/{width}x{height}/{cropped}"
}
}
]
}
My query code :
let spine = Spine(baseURL: url)
// Registering entities
spine.registerResource(Ad)
spine.registerResource(User)
var query = Query(resourceType: Ad.self, resourceIDs: ["691"])
query.include("evaluations", "seller.friends")
spine.find(query).onSuccess(callback: { (resources, meta, jsonapi) -> Void in
print("success")
}).onFailure { (error) -> Void in
print(error)
}
my errors :
❕ Info - Cannot resolve to-many link persons:87aY7 - friends because the linked collection is not fetched.
❕ Info - Cannot resolve to-many link persons:xN21b - friends because the linked collection is not fetched.
I don't really understand why. Any idea?
Thanks.
I'm experiencing a problem. Once I instantiate a resource and call spine.save(user)
, the attributes
object is not sent to my server (POST /users
). The full details are below, under code.
I'm beginner in iOS dev, so I'm trying to look at Spine's source code to figure out what could be causing it. I realized there are zero tests covering the save()
method (I could be totally wrong, too). Once you help me out with this, I'd love to open a PR to add some documentation. There's none on how to set attributes (e.g user.setValue("Alex2", forField: "name")
).
The code
import Spine
class UserResource: Resource {
dynamic var name: String?
dynamic var email: String?
override class var resourceType: String {
return "users"
}
var fields: [Field] {
return fieldsFromDictionary([
"name": Attribute(),
"email": Attribute()
])
}
}
// in another place, when I hit a button
let baseURL = NSURL(string: "http://localhost:3000/")
let spine = Spine(baseURL: baseURL!)
spine.registerResource(UserResource.resourceType) { UserResource() }
var user = UserResource()
user.name = "Alex"
user.email = "[email protected]"
println(user.name) // outputs "Alex"
spine.save(user)
My server gets
{"data"=>{"type"=>"users"}}
The problem
It's not sending the attributes
it should.
isNew
status via other meansRight now top level metadata is deserialized, but it is not included in the promise that is returned from find operations.
We need to decide what to return from a FetchOperation. Right now it's a ResourceCollection, but for this it might need to become a (ResourceCollection, NSDictionary) or maybe even a whole JSONAPIDocument.
Add a travis.yml file to support automated testing.
I'm getting the following error
Here's the code:
let baseURL = NSURL(string: "http://localhost:3000/")
let spine = Spine(baseURL: baseURL!)
spine.registerResource(UserResource.resourceType) { UserResource() }
var user = UserResource()
user.name = "Alex"
spine.save(user).onSuccess {
println("saved")
}
Any idea how to fix that?
Allow developers to use a custom NSURLSession with HTTPClient.
I'm trying to build the dependencies with carthage update
to send a PR later, but can't build SwiftyJSON. It builds BrightFutures just fine, though. No error messages, no nothing.
→ carthage update
*** Fetching SwiftyJSON
*** Fetching BrightFutures
*** Checking out BrightFutures at "v1.0.1"
*** Checking out SwiftyJSON at "2.2.0"
*** xcodebuild output can be found in /var/folders/69/b9jl90x976v8w47171_qjpv00000gn/T/carthage-xcodebuild.76R0AN.log
*** Building scheme "BrightFutures-iOS" in BrightFutures.xcodeproj
*** Building scheme "BrightFutures-Mac" in BrightFutures.xcodeproj
→ tree Carthage/Build/
Carthage/Build/
├── Mac
│ └── BrightFutures.framework
│ ├── BrightFutures -> Versions/Current/BrightFutures
│ ├── Headers -> Versions/Current/Headers
│ ├── Modules -> Versions/Current/Modules
│ ├── Resources -> Versions/Current/Resources
│ └── Versions
│ ├── A
│ │ ├── BrightFutures
│ │ ├── Headers
│ │ │ └── BrightFutures-Swift.h
│ │ ├── Modules
│ │ │ ├── BrightFutures.swiftmodule
│ │ │ │ ├── x86_64.swiftdoc
│ │ │ │ └── x86_64.swiftmodule
│ │ │ └── module.modulemap
│ │ └── Resources
│ │ └── Info.plist
│ └── Current -> A
└── iOS
└── BrightFutures.framework
├── BrightFutures
├── Headers
│ └── BrightFutures-Swift.h
├── Info.plist
├── Modules
│ ├── BrightFutures.swiftmodule
│ │ ├── arm.swiftdoc
│ │ ├── arm.swiftmodule
│ │ ├── arm64.swiftdoc
│ │ ├── arm64.swiftmodule
│ │ ├── i386.swiftdoc
│ │ ├── i386.swiftmodule
│ │ ├── x86_64.swiftdoc
│ │ └── x86_64.swiftmodule
│ └── module.modulemap
└── _CodeSignature
└── CodeResources
18 directories, 20 files
The log file mentioned above has absolutely nothing, no string about SwiftyJSON being touched at all. In the end, it's simply not generating any .framework
file (except for BrightFutures).
Could there be a problem in the Cartfile or something? Any idea at all why this isn't building?
😁
Including a nested relationship on Query using include
fails because the Query class cannot resolve nested field names to their serialized names.
Hi,
Is there any sample project or tutorial showing how to setup a Spine backed application?
That would be really helpful to get a clearer picture of its features.
Thanks,
BQ.
Hi,
Thanks for the great work on Spine - it's fantastic 👍 .
The API I'm working with always uses underscored strings for serialization. Rather than specifying the serialized name every time with Attribute().serializedAs("underscored_name_here")
I'd instead like to override or subclass Attribute
to make this the default.
This seems tricky currently because none of the properties of the Field
class are public, and hence can't be overridden or accessed from a subclass inside a my project.
Could the name
and serializedName
properties be made public? I'm happy to provide a patch. I also tried to provide a different implementation of fieldsFromDictionary
, but a similar problem exists because the name
field is not accessible. Or perhaps there is a better way to do this?
I'm using the swift-2.0 branch.
Cheers.
The public API would be nicer if fields
directly returned a Dictionary instead of an Array. This removes the need for a public fieldsFromDictionary
function.
Hey,
I'm just started using Spine and I wonder if it is possible to use native Bool instead of NSNumber?
ATM it looks like this:
dynamic var demo: NSNumber?
Spine currently (0.4) depends on SwiftyJSON 2.3.3, which already exists on GitHub but has not yet been released to CocoaPods.
It also doesn't match the JSONAPI spec.
Routing.swift line 156 builds an ascending sort order with a prepended +
:
if descriptor.ascending {
return "+\(key)"
} else {
return "-\(key)"
}
However, this gets converted into a path that looks like /api/cameras/21/sleeps?sort=+started-at
, which without extra encoding is interpreted as a space character per https://www.w3.org/Addressing/URL/4_URI_Recommentations.html:
Within the query string, the plus sign is reserved as shorthand notation for a space. Therefore, real plus signs must be encoded. This method was used to make query URIs easier to pass in systems which did not allow spaces.
This plus sign is also not required by the JSONAPI spec, which says:
The sort order for each sort field MUST be ascending unless it is prefixed with a minus (U+002D HYPHEN-MINUS, "-"), in which case it MUST be descending.
(http://jsonapi.org/format/#fetching-sorting)
As-is, this implementation of ascending sort is not compatible with popular server-side frameworks like Rails' jsonapi-resources
, which returns a 400: Bad Request
since it interprets the +
sign as a leading space, not as a plus.
So, I had a hard time figuring out how to return error messages so I can show them in the UI. After hours of debugging, the answer is we can't do it currently until we redesign the entire error handling logic.
This is the centralization for any work towards this goal.
4xx-5xx aren't handled at all
Currently, only network errors are being handled; everything else triggers .onSuccess
(even 4xx
responses) #27
I have a fix for this in a PR, but it's impossible to unit test without a big rewrite in the CallbackHTTPClient
object, which completely replaces the Networking
object in tests. Instead of stubbing the server, it's stubbing the client.
To get make this rewrite not needed, we have to handle errors inside Operations
. I believe that'd be correct because a 4xx
is not an error, it's just a decline from the server in the API negotiation. An error is an exception, such as a network error.
Expose error response to .onFailure
block
Given the expectations inside the code, there's no way to return response body all the way up and expose it in the .onFailure
block. I need to show error messages in the UI, but I can't.
We need to stop returning NSError from Networking and return our own error object, one that supports not just error code (e.g 4xx
), but the entire JSON response (not string, actual dictionary) and the JSONAPI standard.
For example, in my code, inside Networking
's performRequest()
, I tried something like the following,
var serializationErr: NSError?
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &serializationErr) as! NSDictionary
// Trying to cramp jsonResult inside userInfo...
let userInfo = [NSLocalizedFailureReasonErrorKey: jsonResult]
operationError = NSError(domain: SpineServerErrorDomain, code: response!.statusCode, userInfo: userInfo)
Inside my .onFailure
block, I was able to output the dictionary above,
println(error.userInfo)
Optional([NSLocalizedFailureReason: {
errors = (
{
code = 11001;
source = {
pointer = "/data/attributes/email";
};
title = "Value not specified.";
}
);
}])
However, when calling println(error.localizedFailureReason)
, I get -[__NSDictionaryI length]: unrecognized selector sent to instance 0x7ffd148788c0
because clearly a String
was expected, not a dictionary.
The latest version of JSON:API puts all attributes under an attributes
key and all relationship links under an relationships
key.
The error I'm getting exactly is fatal error: unexpectedly found nil while unwrapping an Optional value
.
This happens on current master, on the following line:
Line 87 in 6fbb3ef
It's easy to reproduce, you just have to make a request when connection is not available (e.g. airplane mode). Basically this is something from a TODO list, so I just wanted to bring attention 😄
This is a nice-to-have. Currently we can explicitly call UIApplication.sharedApplication().networkActivityIndicatorVisible = true
before/after each request, but that becomes cumbersome and clutters the codebase with boilerplate. The preferred option is to just provide a boolean to toggle this behavior on/off globally for the Spine
instance or the HTTPClient
instance. Another option is to provide a hook in HTTPClient
for request began/ended so that we could implement this ourselves and/or possibly other behaviors around network activity.
Currently nextURL
, previousURL
are not encoded/decoded.
It would be nice if we had a Logger
protocol so developers can hoop up different loggers.
I'm wading into a a Java implementation and I'm curious what your findOne
or find
interface looks like for nested URLs. For example when fetch /articles/1/author
, as found in this section, how do you call findOne
such that you fetch the author from article 1?
Hi,
I get an error when I try to add pagination to my query.
The following code:
var query = Query(resourceType: Post.self)
query.paginate(OffsetBasedPagination(offset: 0, limit: 5))
results in the following error:
'OffsetBasedPagination' cannot be constructed because it has no accessible initializers
I have tried adding the initializer to struct myself but it doesn't seem to make a difference.
Cheers!
In the lib tests, the mock library is setting the Error just fine, therefore onFailure
is triggered correctly.
However, in my own app, the error
value from a request is never set, even if the status code is 4xx. Check this out:
Here's the console output.
I think the tests are broken (the mock code is mistakenly setting the error). Could you check in your own app with real requests whether this is true or not?
I think the solution is to actually rely on the status code, not on urlSession.error
.
E.g: warn when a data
key was expected but not present in the payload.
Currently we use NSError objects to represent errors returned in the API response. This makes it hard to access all the error fields that JSON:API specifies. It's probably better to use a custom struct for this,
When I compiled using the following line, I discovered that a Spine function is at the top of the list of things taking the longest.
xcodebuild -workspace myApp.xcworkspace -scheme myApp clean build OTHER_SWIFT_FLAGS="-Xfrontend -debug-time-function-bodies" | grep [1-9].[0-9]ms | sort -nr > culprits.txt
Not sure why it's duplicated, though, but the times are different...
3025.6ms /Users/MyUser/myApp/Pods/Spine/Spine/DeserializeOperation.swift:338:15 private func resolveRelations()
2933.1ms /Users/MyUser/myApp/Pods/Spine/Spine/DeserializeOperation.swift:338:15 private func resolveRelations()
Not sure how to fix it, just thought I'd share the finding.
This is really weird, but I ran into strange behavior which can be reproduced only when app is built in a release mode. Can't reproduce this in a debug mode at all.
I've tried as much as possible to make release mode to be close to debug, including turning off Swift compiler optimizations, with no luck unfortunately.
My app has a few models with String attributes as well as both types of relations. Here is a dump:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000018
Triggered by Thread: 9
Thread 9 name: Dispatch queue: NSOperationQueue 0x170428680 :: NSOperation 0x1740551b0 (QOS: LEGACY)
Thread 9 Crashed:
0 libobjc.A.dylib 0x000000019758fbd0 objc_msgSend + 16
1 Spine 0x0000000100324058 Spine.enumerateFields <A>(Spine.ResourceProtocol, A.Type, (A) -> ()) -> () (Spine.swift:403)
2 Spine 0x00000001002d1ae4 function signature specialization <Arg[0] = Owned To Guaranteed> of Spine.DeserializeOperation.main (Spine.DeserializeOperation)() -> () (DeserializeOperation.swift:340)
3 Spine 0x00000001002cf9e4 @objc Spine.DeserializeOperation.main (Spine.DeserializeOperation)() -> () (DeserializeOperation.swift:0)
4 Foundation 0x00000001866d81c8 -[__NSOperationInternal _start:] + 632
5 Spine 0x000000010031ea24 function signature specialization <Arg[0] = Owned To Guaranteed, Arg[1] = Owned To Guaranteed, Arg[2] = Owned To Guaranteed> of Spine.JSONSerializer.deserializeData (Spine.JSONSerializer)(ObjectiveC.NSData, mappingTargets : [Spine.ResourceProtocol]?) -> Spine.Failable<Spine.JSONAPIDocument> (Serializing.swift:107)
6 Spine 0x000000010031dbd0 Spine.JSONSerializer.deserializeData (Spine.JSONSerializer)(ObjectiveC.NSData, mappingTargets : [Spine.ResourceProtocol]?) -> Spine.Failable<Spine.JSONAPIDocument> (Serializing.swift:99)
7 Spine 0x00000001002ea88c Spine.FetchOperation.(execute <A : Spine.ResourceProtocol>(Spine.FetchOperation<A>) -> () -> ()).(closure #1) (Operation.swift:126)
8 Spine 0x00000001002de000 Spine.URLSessionClient.((performRequest in _A65F1CFD10DBD88413D97E892B017C13) (Spine.URLSessionClient) -> (ObjectiveC.NSURLRequest, callback : (statusCode : Swift.Int?, responseData : ObjectiveC.NSData?, networkError : ObjectiveC.NSError?) -> ()) -> ()).(closure #1) (Networking.swift:108)
9 Spine 0x00000001002dda10 partial apply forwarder for reabstraction thunk helper from @callee_owned (@in (ObjectiveC.NSData!, ObjectiveC.NSURLResponse!, ObjectiveC.NSError!)) -> (@out ()) to @callee_owned (@owned ObjectiveC.NSData!, @owned ObjectiveC.NSURLResponse!, @owned ObjectiveC.NSError!) -> (@unowned ()) (Networking.swift:0)
10 CFNetwork 0x000000018521b24c __49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 296
11 Foundation 0x00000001867971c0 __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 12
12 Foundation 0x00000001866e8600 -[NSBlockOperation main] + 92
13 Foundation 0x00000001866d81c8 -[__NSOperationInternal _start:] + 632
14 Foundation 0x0000000186799f24 __NSOQSchedule_f + 224
15 libdispatch.dylib 0x0000000197bf9950 _dispatch_client_callout + 12
16 libdispatch.dylib 0x0000000197c040a0 _dispatch_queue_drain + 1444
17 libdispatch.dylib 0x0000000197bfca58 _dispatch_queue_invoke + 128
18 libdispatch.dylib 0x0000000197c06314 _dispatch_root_queue_drain + 716
19 libdispatch.dylib 0x0000000197c07c48 _dispatch_worker_thread3 + 104
20 libsystem_pthread.dylib 0x0000000197dd9228 _pthread_wqthread + 812
21 libsystem_pthread.dylib 0x0000000197dd8eec start_wqthread + 0
Any ideas?
Adding github "wvteijlingen/Spine" to the Cartfile and executing the carthage update
command, the result is: No tagged versions found for github "wvteijlingen/Spine"
As workaround I have used github "wvteijlingen/Spine" "master"
Only save dirty variables to avoid overriding in case of sparse fieldsets.
Hi! Could you start tagging releases with SemVer for library clients who use things like Cocoapods to have stable version tags to point to? I noticed we were on the swift-2.0
branch, and now that that's on master
, I'd love to point to something more stable than the SHA du jour.
I am currently using a API that returns the following response:
{
"data": null
}
According to the JSONAPI spec, this is a valid format, but Spine returns the following serializer error:
Either 'data', 'errors', or 'meta' must be present in the top level.
I'm thinking about breaking up Spine into different public components. This allows you to for example just use the Serializer and handle all the networking yourself. The current monolithic structure might put people off if they're just looking for one part of the functionality.
First, I'd like to thank you for this library!
However, I'm trying to retrieve some data from my server but I got nothing and I can't figure out why because there should be data, and the log is even displaying it (I set all logs to Debug
).
Here is my resource :
class Device : Resource {
/////////////////////////////////////////////////////////////////////////
// Entity definition
dynamic var authId: String?
dynamic var macAddress: String?
dynamic var imei: String?
dynamic var imsi: String?
dynamic var creationDate: NSDate?
dynamic var updateDate: NSDate?
override class var resourceType: String {
return "devices"
}
override class var fields: [Field] {
return fieldsFromDictionary([
"authId": Attribute().serializeAs("auth_id"),
"macAddress": Attribute().serializeAs("mac_address"),
"imei": Attribute().serializeAs("imei"),
"imsi": Attribute().serializeAs("imsi"),
"creationDate": DateAttribute().serializeAs("creation_ts"),
"updateDate": DateAttribute().serializeAs("modif_ts")
])
}
/////////////////////////////////////////////////////////////////////////
}
And here is my code that initializes Spine and executes the first request that should retrieve all Device
// baseURL is defined above and is valid
let spine = Spine(baseURL: baseURL!)
Spine.setLogLevel(.Debug, forDomain: .Spine)
Spine.setLogLevel(.Debug, forDomain: .Networking)
Spine.setLogLevel(.Debug, forDomain: .Serializing)
// Registering entities
spine.registerResource(Device.resourceType) { Device() }
// tests
spine.find(Device.self).onSuccess { res in
NSLog("Count : " + String(res.count)) // Displays 0
for r in res {
if let device = r as? Device {
NSLog("Device : " + device.authId!) // Code not reached
}
}
}
Now, here are my logs :
❕ Info - Fetching resources using URL: http://myurl/devices/
❕ Info - GET: http://myurl/devices/
❕ Info - 200: Optional(http://myurl/devices/)
❔ Debug - {"device":[{"auth_id":"d9e87da5-d2bc-4d5c-a979-2527ee971b07","creation_ts":"2014-12-03 03:21:44.222516","id":"b60cb2cb-219b-41ae-8f68-f7e338407a0a","imei":"imei_test","imsi":"imsi_test","mac_address":"mac_test","modif_ts":"2014-12-03 03:21:44.222516"},{"auth_id":"0ef3f0b4-487e-40bf-bd03-cd12abc4c748","creation_ts":"2014-12-03 04:23:44.73796","id":"c1a2ac9b-a7bb-4fff-b1b8-d35e888ea89f","imei":"imei_test","imsi":"imsi_test","mac_address":"mac_test","modif_ts":"2014-12-03 04:23:44.73796"},{"auth_id":"b3e55323-464c-423c-bdd3-5f38515e22b4","creation_ts":"2014-12-03 04:29:53.680171","id":"18ce7709-0d3c-4746-a74b-80df1b8e1177","imei":"mac_test","imsi":"imei_test","mac_address":null,"modif_ts":"2014-12-03 04:29:53.680171"},{"auth_id":"8e7b2362-2a6c-4a38-81d5-d803ee0e26fa","creation_ts":"2014-12-03 04:41:35.734255","id":"84973337-3bf3-427d-acfa-849ef1136ecd","imei":"imei_test","imsi":"imsi_test","mac_address":"mac_test","modif_ts":"2014-12-03 04:41:35.734255"},{"auth_id":"f201c61f-e666-415a-8d0e-62798977f089","creation_ts":"2015-05-15 11:01:17.254469","id":"dfa0ff32-792f-4772-ad12-9fa9715b5c60","imei":"imei","imsi":"imsi","mac_address":"mac address","modif_ts":"2015-05-15 11:01:17.254469"},{"auth_id":"2074c964-00f1-4a77-a34d-2836f5f8b05a","creation_ts":"2015-05-15 11:24:33.866635","id":"9b83039c-2dba-4428-9d73-3af4ca95def5","imei":"imei","imsi":"imsi","mac_address":"macaddress","modif_ts":"2015-05-15 11:24:33.866635"},{"auth_id":"b66bbf06-cd3c-4d86-abcd-8abb95bce30f","creation_ts":"2015-05-15 12:01:25.74062","id":"7a58dc86-e3e0-4ae4-8576-f7b5f30f5110","imei":"imei","imsi":"imsi","mac_address":"macaddress","modif_ts":"2015-05-15 12:01:25.74062"}]}
2015-05-21 10:29:52.307 PROJECT[2335:889799] Count : 0
Did I do something wrong?
Thank you!
Query URLs are now built by te Query class. This is a leftover and should be moved to the router.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.