The json int data type automatically change to double - huawei-mobile-services

When i set int json data to message, it automatically change to double type locally.
// The json send to HMS server.
{
"validate_only": false,
"message": {
"data": "{'int_type':0}",
...
}
// The data received locally.
{ int_type=0.0 }

Method 1: change all int type to string.
Method 2: pass the string in json, convert it to int locally.
"message": {
"data": "{'int_type':'0'}",
int_type.toInt()

Related

Swift-JWT decoding issue

I am using the Swift-JWT Cocoapod file, when I try to encode a particular claim struct, it gives me a cryptogram, when I check in this cryptogram on the https://jwt.io/ website, it is decoding successfully but the order of the claim struct object is changing. I don't know what to do right now?
any suggestions much appreciate
Note:- I need when we are going encode of the claim struct, that same struct need to decode with the same order.
for example, This is my claim struct with using private key, I am encoding the data
ClaimsRequest(
deviceId: "1D9B98D1-63FE-466B-99CB-A2CBDEB1612F",
amount: "32.00",
currency: "MUR",
debtorAccount: "1234567890",
creditorAccount: "255252522",
endToEndId: "CMCLMUM020220202000019",
consentId: "88379")
privateKey:
Printing description of privateKey:
"MIIEujANBgkqhkiG9w0BAQEFAAOCBKcAMIIEogIBAAKCAQEAotx6XajXdQFkn4LmqLhYgU0PVksLUc5X0eHpPicGoSsL7LtEY3Cp8x8iCZxdo0dxB+AUfl+deklS7alRkjgc5bp8Z2NCe5fNX4zeS2XVsk7W5wYQmUc2xnrX2yyTq81rnQ32SXppWEU/iGsUbWRTBaJYFxjIGM+qjcGnIHK9dvXkiN075uXyT8jVJOAbPUTSrtIcgpplxlhBprtyzl8A0FtRXRJOpv5MgJDn3nudIpTimFI6kgOjzVTLu1RhBIeDW5CwdgMPIQ1E3HyZ34wsqviY9q5BQ+2Q+d8NiL/NtxNEDoMm1+8L/BvPIZDJH5DXEXJOpkeEVFoC1Mo0xPAz9wIDAQABAoIBACwGBE/YCbHXuA8ET/yQpGADaB9v9rXc3NFfy3BhFUIwxC7waiqlNFODeWx2p7sw3yV9VZzZlNSPCIs051dqsqkI0YMTClAldz8acaaY9vyVojLd6VO9s9lQMJRPBvX8d9gDA63WGK7jPSrPozx0z5poyX4o1UIbtKNQEzDKw1tp6yTTm91ad4K+yH/yQuuLVA44VP1kfMNtmMIYqHyn5eeWRQiOTPvslByEqSd84YdQZyz2JFTDDrFpI13TDJpoMf2p4jsIYYliv2bvuG2dB8bFtNR0fVUSWVE1GBCag7k29kH8ieRodZR8Sa79J3teoEvC4+Czn9YxpN/3D07bSuECgYEA1cAzWj8b2adlVqsk5ePtzsVY8e/Kk2qDGVMu/QehMoi3gdXL8+0A/58d3m4KAjW4SX9qw+RQsq3+EDjx+m5g4wE8uLTy4EsrBNaZ1si0V63WiNUPSGNk5jzGpgT9qsbSFm1KhhH3CDcAm2cRy6NkG0fcQ3VX6aK0KnFMUg+q2VcCgYEAww1Dp64ZfXDJHynB/Ne219gZGk5aMP8/4UFirMVXZLJTiSRXTe1f/YYPSB+3AQmprJfXT4/jk3ubxCxJ7f1PP6EwPXrH76G/wm/sNR8aK04i4p3kR8qCLEmks5ZN+G29uoJ3S35loydk4iLjwxNGrzlo2O45gRNbInJN+HjQtmECgYBYN8L59CHiapwAcRIBb1iuhfR3pafNv5/ry9EQzR1SZeqWw04xlhdbaKhDLNckolc0vkmqH4jOtdCtkVMNMJD8H36YHNZAi8VtccR8SMllhnGMd6KfFaaG/35c9qJa4UPDzcd8Hd3+nfS6LofBq+Wc/MODc+KconIJMkl1dNHmcQKBgHwsY5fKVFvxg3idYuwOgE6lOkXu/6gVt5s1vxXyhBKNHHVAd3wa1HNX9z6ZQi4c8rH38JCsL9tiY+XdtCsYim0dttJM6h/6P1QPYLbo2AYdtkPC9ONnXrvHHl1eIME5TAICsOOU0iuuFqGISKuWB/fheogwENfFdM1XK6A1ednBAoGAGIqs9UdlLVtOPqT1EIxceyH3JpncIsFeh7jcIYu6aGI1KqaNz094Ex88p9q5dylqE6iblq+n4EIyvB6MvCTGH2iYBU5M7GAlSWqGbNloFFMB7nSlzPOfKu6bwWSNn7S+ywx9gXx3IMpB/zxpFupaccuNn1A0Bk2E8kBYqooPNRw="
var myJWT = JWT(claims: myClaims)
do {
if let privateKeyData = Data(base64Encoded: privateKey) {
let jwtSigner = JWTSigner.rs512(privateKey: privateKeyData)
let signedJWT = try myJWT.sign(using: jwtSigner)
return signedJWT
}
}
it is given cryptogram of the data
Printing description of cryptogram:
▿ Optional
some : "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJhbW91bnQiOiIzMi4wMCIsImRldmljZUlkIjoiMUQ5Qjk4RDEtNjNGRS00NjZCLTk5Q0ItQTJDQkRFQjE2MTJGIiwiY3JlZGl0b3JBY2NvdW50IjoiMjU1MjUyNTIyIiwiZW5kVG9FbmRJZCI6IkNNQ0xNVU0wMjAyMjAyMDIwMDAwMTkiLCJkZWJ0b3JBY2NvdW50IjoiMTIzNDU2Nzg5MCIsImN1cnJlbmN5IjoiTVVSIiwiY29uc2VudElkIjoiODgzNzkifQ.gjI_il7eu_topH2-i_UY_vFrD3rGpMe5a8R-mbO48MbKYaVcIJuNO4QxaqBR-nltBn5fPnZfWqxta6jqFJ4-W1CDIIVTDNI6vGZn8UTgn8TkZ21VA1wNb0Os067dGrDHtzlvJwrwOhLD2cND5F_YbN7v_cYMJEkTDKgTyi6w4HW3jqZPzMfEMfjQ36jlM8KlCf1_XeZ1V-OzNOmBhc6ToErHYJbM61fmV2DjVShGVqZ2dFu1Myw1FpaVvbp8YTA6_POq1kk3p8Ml6s6o0SQ3-c4cZ6f08z16fGGO7K-Tn7fDenZgX8oRQ0YvV3LeGzbbYgGFaqES_7KK1txLPOqTww"
So, when I paste this cryptogram in JWT.io it gives decoding Object, here you can see order changing of claim struct.
{
"amount": "32.00",
"deviceId": "1D9B98D1-63FE-466B-99CB-A2CBDEB1612F",
"creditorAccount": "255252522",
"endToEndId": "CMCLMUM020220202000019",
"debtorAccount": "1234567890",
"currency": "MUR",
"consentId": "88379"
}

Swift PKPass eror 'The pass cannot be read because it isn’t valid'

I'm creating a Ticket from my server and passing it into my ios app but I keep getting this error when I try to pass the JSON data into the PKPass model.
Error Domain=PKPassKitErrorDomain Code=1 "The pass cannot be read because it isn’t valid.
In my server it says that the ticket was created successfully and but I still get this error in Xcode. Am I decoding the data wrong? How can I create the PKPass using the JSON Response?
Server Side code:
exports.createTicket = functions.https.onRequest(async (req, res) => {
const passName = "Event"
try {
const examplePass = await createPass({
model: "./models/Event",
certificates: {
wwdr: "./models/certs/wwdrc.pem",
signerCert: "./models/certs/signerCert.pem",
signerKey: {
keyFile: "./models/certs/signerKey.pem",
passphrase: "54321"
}
},
overrides: {
// keys to be added or overridden
serialNumber: "AAGH44625236dddaffbda"
}
});
examplePass.barcode("36478105430"); // Random value
// Generate the stream, which gets returned through a Promise
const stream = examplePass.generate();
res.set({
"Content-Type": "application/vnd.apple.pkpass",
"Content-disposition": `attachment; filename=${passName}.pkpass`
});
stream.pipe(res);
console.log("Successfully created ticket", stream)
} catch (err) {
console.log("There was an error", err)
res.set({
"Content-type": "text/html",
});
res.send(err.message);
}
});
IOS Side:
AF.request(URLString, method: .post, parameters: requestData).responseString { response in
guard let data = response.data as? Data else { return }
do {
let pass = try PKPass(data: data)
print(pass)
} catch {
print("Error", error)
}
}
pass.json
{
"formatVersion": 1,
"passTypeIdentifier": "pass.com.CodyHost.Finder-Dev",
"teamIdentifier": "L9C6U8UKPB",
"organizationName": "Finder",
"description": "Rolling loud new york 2020",
"eventTicket": {}
}
Signature:
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
Looking at your signature and you pass.json, your pass is failing to load because the certificate that has been used to create the signature is:
PassTypeId: pass.com.apple.devpubs.example
TeamName: A93A5CM278
This doesn't match the passTypeIdentifier and teamName you have in your pass.json.
Replace ./models/certs/signerCert.pem and ./models/certs/signerKey.pem with the correct certificate and key for your PassTypeId Certificate and you should get past this error.
Any pass compiled with the pass.json above still will not load, but for a different reason. The eventTicket object cannot be empty.

Return JSON with an HTTP status other than 200 in Rocket

I want my Rocket API to have a route like this:
#[post("create/thing", format = "application/json", data="<thing>")]
When the client sends { "name": "mything" }, everything should be alright and I know how to do that, but when it sends { "name": "foo" } it should respond with something like this:
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
{
"errors": [
{
"status": "422",
"title": "Invalid thing name",
"detail": "The name for a thing must be at least 4 characters long."
}
]
}
How do I respond with a result like a JSON object and a HTTP status code different than 200 in Rocket?
This is what I tried so far:
impl FromRequest for my Thing type. This lets me choose a status code as I can write my own from_request function, but I can't return anything else.
Registering an error catcher like in this example, but this way I only can react to one HTTP status code without context. I have too many failure modes to reserve one HTTP status code for each.
With #hellow's help, I figured it out. The solution is to implement the Responder trait for a new struct ApiResponse, which contains a status code as well the Json. This way I can do exactly what I wanted:
#[post("/create/thing", format = "application/json", data = "<thing>")]
fn put(thing: Json<Thing>) -> ApiResponse {
let thing: Thing = thing.into_inner();
match thing.name.len() {
0...3 => ApiResponse {
json: json!({"error": {"short": "Invalid Name", "long": "A thing must have a name that is at least 3 characters long"}}),
status: Status::UnprocessableEntity,
},
_ => ApiResponse {
json: json!({"status": "success"}),
status: Status::Ok,
},
}
}
Here is the full code:
#![feature(proc_macro_hygiene)]
#![feature(decl_macro)]
#[macro_use]
extern crate rocket;
#[macro_use]
extern crate rocket_contrib;
extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
use rocket::http::{ContentType, Status};
use rocket::request::Request;
use rocket::response;
use rocket::response::{Responder, Response};
use rocket_contrib::json::{Json, JsonValue};
#[derive(Serialize, Deserialize, Debug)]
pub struct Thing {
pub name: String,
}
#[derive(Debug)]
struct ApiResponse {
json: JsonValue,
status: Status,
}
impl<'r> Responder<'r> for ApiResponse {
fn respond_to(self, req: &Request) -> response::Result<'r> {
Response::build_from(self.json.respond_to(&req).unwrap())
.status(self.status)
.header(ContentType::JSON)
.ok()
}
}
#[post("/create/thing", format = "application/json", data = "<thing>")]
fn put(thing: Json<Thing>) -> ApiResponse {
let thing: Thing = thing.into_inner();
match thing.name.len() {
0...3 => ApiResponse {
json: json!({"error": {"short": "Invalid Name", "long": "A thing must have a name that is at least 3 characters long"}}),
status: Status::UnprocessableEntity,
},
_ => ApiResponse {
json: json!({"status": "success"}),
status: Status::Ok,
},
}
}
fn main() {
rocket::ignite().mount("/", routes![put]).launch();
}
You need to build a response. Take a look at the ResponseBuilder. Your response might look something like this.
use std::io::Cursor;
use rocket::response::Response;
use rocket::http::{Status, ContentType};
let response = Response::build()
.status(Status::UnprocessableEntity)
.header(ContentType::Json)
.sized_body(Cursor::new("Your json body"))
.finalize();

Exception throw for null data with optional Int type in Realm

I am taking my first foray into using Realm (0.98.1 via Cocoapods, Xcode 7.2) and am running into a small problem that I am not sure how to solve.
I have a model class called Airport that declares a property
let elevationFt = RealmOptional<Int>()
I am creating a set of Airport objects and persisting them in the following way
public func cacheDataToPersistanceStore(data:NSArray) -> Bool {
var success = true
autoreleasepool {
do {
let realm = try Realm()
realm.beginWrite()
for object in data {
guard let dictionaryValues = object as? Dictionary<String, AnyObject> else {
debugPrint("Unable to convert data to correct type")
success = false
return
}
if(dictionaryValues["airportID"] as! Int == 6605) {
realm.create(Airport.self, value: dictionaryValues, update: true)
}
}
try realm.commitWrite()
}
catch(let e) {
debugPrint(e)
success = false
}
}
return success
}
For the airport entry in question, the dictionary that stores the relevant data looks to have a null value for the key "elevationFt", so I assume things will be OK for the optional Int property
Here is a string version of the dictionary:
["gps_code": 01MD, "ident": 01MD, "iata_code": , "local_code": 01MD, "keywords": , "elevationFt": , "type": seaplane_base, "municipality": Annapolis, "iso_country": US, "airportID": 6605, "longitudeDeg": -76.45600128173828, "latitudeDeg": 38.99919891357422, "iso_region": US-MD, "wikipedia_link": , "name": Annapolis Seaplane Base, "scheduled_service": no, "continent": NA, "home_link": ]
However once the create function starts for this set of data, an exception is thrown:
Terminating app due to uncaught exception 'RLMException', reason: 'Invalid value '' for property 'elevationFt''
I am guessing I have something set up incorrectly, but I am not quite sure how to fix this other than to clean my source data for that particular field.
The screenshot from the debugger shows that elevationFt is an empty string, which is not a number or null, so it is not a valid value for an optional int property.

Create NSDictionary format as per JSON Request in POST method

I need to POST datas to JSON. I don't know how to convert to NSDictionary for some complicated JSON format.
Format is below:
//1.JSON FORMAT
{
"username": "qqq_qq#qqq.qq",
"password": "******"
}
//In Swift:
var params = ["username": nameTxtFld.text, "password" : passTxtFld.text] as Dictionary<String, String>
//WORKING
//2. JSON FROMAT
{
"name":"qqq",
"emailId":"qqq_qq#qqq.qq",
"user":{
"password":"****",
"confirmPassword":"****"
}
}
//In Swift
var parameters = ["userName": nameTxtFld.text, "email": emailTxtFld.text, "user" : ["password" : passTxtFld.text, "confirmPassword" : confPassTxtFld.text]] as Dictionary<String, String, String>
//Error
//Unprintable ASCII character found in source file
Kindly guide me? How to covert this format in NSDictionary
When you want to send a JSON format request to web server, why don't you create a String with the formatted keys and values like #"username=xxxx&password=xxx" and then while adding this string to NSMUtableURLRequest class, convert this string to NSData and then add it.
This will be format we can use while sending POST type of request.