我是 Go 的新手,几乎尝试了所有方法来获取由 Go 运行的 Google Endpoint,接收带有 JSON 的 POST 以进行验证,然后将其存储在 Google Datastore 中。
Golang 端点包 https://github.com/GoogleCloudPlatform/go-endpoints
这是我尝试 POST 到我的 Go 端点的 JSON 示例:
{\"json\": {\"orderId\": \"123456789.12341234\",\"packageName\":\"com.company.name\",\"productId\":\"productName\",\"purchaseTime\": 1410655975266,\"purchaseState\": 0,\"purchaseToken\": \"tokenData\"},\"signature\": \"signatureData\"}
这是我的 Google 端点的 Golang 代码示例:
type RawReceipt struct {
Key *datastore.Key `json:"id" datastore:"-"`
Receipt json.RawMessage `json:"json"`
}
func ReceiveJson(c endpoints.Context, rec *RawReceipt) error {
k := datastore.NewIncompleteKey(c, "DatastoreTest", nil)
_, err := datastore.Put(c, k, rec)
return err
}
我要完成的伪代码:
var data below will need to contain {\"orderId\": \"123456789.12341234\",\"packageName\":\"com.company.name\",\"productId\":\"productName\",\"purchaseTime\": 1410655975266,\"purchaseState\": 0,\"purchaseToken\": \"tokenData\"},\"signature\": \"signatureData\"}
func Json(rawJson *RawJson) {
data := rawJson["json"]
signature := rawJson["signature"]
if Verify(jsonData, jsonSignature) {
// Store into Datastore
// The storing part works, just need to get the right data into it
k := datastore.NewIncompleteKey(c, "DatastoreTest", nil)
_, err := datastore.Put(c, k, rec)
return err
}
}
func Verify (jsonData *JData, jsonSignature, *Jsig) bool {
//I got this part working just fine.
if fail or err return false, else true
}
我需要能够从键 json 和 signature 中获取值,这样我才能通过
{\"json\": {\"orderId\": \"123456789.12341234\",\"packageName\":\"com.company.name\",\"productId\":\"productName\",\"purchaseTime\": 1410655975266,\"purchaseState\": 0,\"purchaseToken\": \"tokenData\"}
验证方法和签名
\"signature\": \"signatureData\"
作为验证方法的另一个参数。
奇怪的是,如果我查看值 rec.Receipt,JSON 是乱序的,例如productId 现在位于底部,而不是原来的位置。
我需要做的最后一件事是获取整个 JSON 并将其存储在 Google 数据存储中。
作为旁注,我已经花了大约 3 天的时间来阅读文档,查看其他 stackoverflow 问题,并一直在尝试任何事情来完成这项工作。
非常感谢您的帮助!
最佳答案
我没有使用 Google App Engine 的经验,但您的核心问题似乎是反序列化 JSON,以便您可以只获取“签名”字段?
您可以将数据json.Unmarshal 放入map[string]interface{} 并引用该映射的signature 字段,例如所以:
package main
import (
"encoding/json"
"fmt"
)
const data = `{
"json": {
"orderId": "123456789.12341234",
"packageName": "com.company.name",
"productId": "productName",
"purchaseState": 0,
"purchaseTime": 1410655975266,
"purchaseToken": "tokenData"
},
"signature": "signatureData"
}`
func main() {
receipt := make(map[string]interface{})
json.Unmarshal([]byte(data), &receipt)
signature, ok := receipt["signature"].(string)
if !ok {
fmt.Println("type assertion failed")
return
}
fmt.Println(signature)
}
在同一个示例中,您可以执行 fmt.Printf("%#v\n", receipt) 这将向您显示 receipt["json"] 是另一个 map[string]interface{}。有了这个,您可以将 json 中的字段引用为:
foo, ok := receipt["json"].(map[string]interface{})
// ... assertion checking, etc.
orderId, ok := foo["orderId"].(string)
// ... assertion checking again
不确定将 JSON 存储在 Google 数据存储中。看看他们的例子 here。
顺便说一句,我认为 Go 不会对键值对的顺序做出任何保证,因此您不应该假设它们会保留它们的顺序。
关于json - golang Google 端点接收 JSON 以进行 Google IAB 验证并存储到 Google Datastore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30022002/
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'
我正在学习如何使用JSONgem解析和生成JSON。我可以轻松地创建数据哈希并将其生成为JSON;但是,在获取一个类的实例(例如Person实例)并将其所有实例变量放入哈希中以转换为JSON时,我脑袋放屁。这是我遇到问题的例子:require"json"classPersondefinitialize(name,age,address)@name=name@age=age@address=addressenddefto_jsonendendp=Person.new('JohnDoe',46,"123ElmStreet")p.to_json我想创建一个.to_json方法,这样我就可以获
我很难理解Ruby中sender和receiver的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的调用。但是,我知道我的理解还远远不够。谁能给我一个Ruby中发送者和接收者的具体解释? 最佳答案 面向对象中的一个核心概念是消息传递和早期概念化,这在很大程度上借鉴了计算的Actor模型。艾伦·凯(AlanKay)创造了面向对象一词并发明了最早的OO语言之一SmallTalk,他拥有voicedregretatusingatermwhichputthefocusonobjectsinsteadofo
我正在构建一个带有Rails后端的JS应用程序,为了不混淆snake和camelcases,我想通过从服务器返回camelcase键名来规范化这一切。因此,当从API返回时,user.last_name将返回user.lastName。我如何实现这一点?谢谢!编辑:添加Controller代码classApi::V1::UsersController 最佳答案 我的方法是使用ActiveModelSerializer和json_api适配器:在你的Gemfile中,添加:gem'active_model_serializers'创建
我有以下内容:@array.inspect["x1","x2","adad"]我希望能够将其格式化为:client.send_message(s,m,{:id=>"x1",:id=>"x2",:id=>"adad"})client.send_message(s,m,???????)如何在????????中获得@array输出?空间作为ID?谢谢 最佳答案 {:id=>"x1",:id=>"x2",:id=>"adad"}不是有效的散列,因为您有键冲突它应该是这样的:{"ids":["x1","x2","x3"]}更新:@a=["x1