小编And*_*ist的帖子

自定义MarshalJSON()永远不会在Go中调用

我写了MarshalJSON和的自定义版本UnmarshalJSON.我UnmarshalJSON被称为我想要的方式,但我不能让它与之合作MarshalJSON.这是代码总结了我的问题:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "log"
    "os"
)

type myStruct struct {
    Data string `json:"data"`
}

func (s *myStruct) MarshalJSON() ([]byte, error) {
    return []byte(`{"data":"charlie"}`), nil
}

func (s *myStruct) UnmarshalJSON(b []byte) error {
    // Insert the string directly into the Data member
    return json.Unmarshal(b, &s.Data)
}

func main() {
    // Create a struct with initial content "alpha"
    ms := myStruct{"alpha"}

    // Replace content with "bravo" using custom UnmarshalJSON() …
Run Code Online (Sandbox Code Playgroud)

json marshalling go

30
推荐指数
1
解决办法
9922
查看次数

基于用户查看权限的不同REST资源内容

我想根据访问权限为不同的用户提供相同问题的不同答案.我读了这个问题:

在RESTful响应中排除私有数据

但我不接受的答案,其中指出,应同时提供一致/people.xml/unauthenticated/people.xml,因为我的REST的理解是,特定资源应该生活在一个特定的位置,而不是几个要看你如何其信息多有兴趣在.

我正在设计的系统比那个系统复杂得多.假设用户创建了许多朋友圈,并为他们分配了不同的访问权限.例如,我的"熟人"圈可能可以访问我的生日,而我的"专业"圈子可能可以访问我的工作经历,但不是相反.为了从我所提到的问题,适用的答案,我需要让所有的用户的圈子(我可能要保持出于安全原因的秘密)的一种方式,然后经过/circles/a/users/42,/circles/b/users/42,/circles/c/users/42等等,然后合并结果以显示可用的最大信息量.显然,没有一个圆圈可以获得任何其他圈子获得的所有信息.我认为这很棘手(请注意,我可能需要使用几种对象来执行此操作,未来版本可能需要不同的过程),但如果我想对特定用户施加安全限制,尽管他也是在我的一些圈子里?这个问题甚至可以解决吗?即使我拒绝回复上述任何一个问题并提出一个可以给我答案的新查询,它仍然会揭示这样一个事实,即由于个人访问限制,这个特定用户的处理方式不同.

我在这里错过了什么?我甚至可以开发RESTful Web服务吗?

如果结论是行为不是RESTful,那么这仍然会构成违反REST合同在道德上可行的情况吗?如果是这样,有什么负面影响?例如,我是否存在代理缓存问题的风险?

api rest web-services access-rights restful-architecture

22
推荐指数
2
解决办法
5457
查看次数

RESTful设计的社交网络

我试图围绕RESTful设计,我想从社交网络的角度来理解它.我已阅读REST API设计规则手册,查看了其他一些书籍并阅读了大量在线资源.然而,当将规则应用于现实世界的问题时,我意识到我并不完全理解一切.我想通过指定一些问题来了解我是否对REST有正确的理解:

层次结构与平面设计

我们假设我用一个特定的用户来识别

/users/42
Run Code Online (Sandbox Code Playgroud)

现在,该用户上传的照片最终会进入

/users/42/photos
Run Code Online (Sandbox Code Playgroud)

如果他/她在照片中标记他/她的朋友,那么这些标签就会结束

/users/42/photos/1337/tags
Run Code Online (Sandbox Code Playgroud)

但这无法找到特定用户被标记的所有照片.我应该为此提出不同的层次结构吗?这看起来有点尴尬.我是否可以完全忽略层次结构,并提供与此类查询相结合的照片?

/photos?owner=42
/photos?tagged=42
Run Code Online (Sandbox Code Playgroud)

当内容因不同用户而异时缓存

一个Web服务的设计应提供缓存数据(以便客户端可以决定使用本地副本,如果它认为什么也没有发生变化),但如何影响针对不同用户的隐私设置?登录的两个用户可能有权查看关于例如用户42的不同信息.这是否意味着我以某种方式需要为访问同一用户的配置文件信息的不同用户请求不同的URI,或者缓存不是问题只要用户提供不同的凭据?

从同一资源提供HTML和JSON/XML

我提到的那本书指出了一个规则,即api在他们的示例中,应该从子域开始访问API http://api.soccer.restapi.org.我曾计划为用户访问和机器访问使用相同的控制器(例如移动应用程序).该控制器将决定哪个视图,以提供(text/html,application/jsonapplication/xml通过)Accept在HTTP请求报头字段.我认为由于某种原因这是一个坏主意(因为用户希望看到子域www,而不是api),但我不明白为什么.能wwwapi指向同一个服务器,或者我应该尝试到HTML视图移动到不同的虚拟主机?为什么?

我相信Ruby on Rails(Convention over Configuration)会从同一个控制器提供HTML和JSON,因此我认为HTML和JSON只是同一数据的不同表示.

换句话说,我的书说某个资源应该只有一个URI,并且应该根据Accept字段提供不同的表示.在不同子域之间重定向用户将违反关于从同一资源提供任何表示的规则,并且复制信息(即,将两个子域指向同一虚拟主机)违反了关于不为同一资源提供多个URI的规则.不提供api子域违反了另一个设计规则.如何在不违反任何规则的情况下解决这个问题?

限制发回的数据

查询组件应该用于分页,但是我是否可以拒绝遵守缺少搜索条件的列表请求并限制项目数量而不违反REST?我想减少数据库负载,避免让某人映射整个用户目录.我想要

/users
Run Code Online (Sandbox Code Playgroud)

是非法请求,而

/users?name=leet+hacker
Run Code Online (Sandbox Code Playgroud)

将是有效的,但只返回例如100项.

我还想知道,只有在使用查询专门请求时,返回数据库列的子集以及更多/所有数据列是否合法.

控制器提供冗余数据

我认为提供像这样的控制器是合法的

/users/me
Run Code Online (Sandbox Code Playgroud)

但是它应该提供与文档URI完全相同的信息

/users/42
Run Code Online (Sandbox Code Playgroud)

还是应该重定向到它?

某些用户的扩展权限

哪种RESTful方式可以提供其他功能,例如管理权限?我现在假设管理员(照片,一组用户或整个网站的管理员)将能够看到有关特定对象的更多信息,而不是其他用户.如果这些信息被保存在完全相同的URI,并自动向管理员,但不发送给其他人,应该把它存放在不同的位置,应该是使用某种管理员查询请求或以其他方式提供?

本地化和设置更新

尽管视图应提供用户可见的大多数字符串,但仍有一些可能涉及API的设计决策.最明显的是名字.社交网络有时允许用户输入要在不同语言环境中显示的不同名称.某些语言的名称(如俄语和阿拉伯语)不易自动转录.在其他语言中,如中文,本地和国际名称可能完全不同,完全没有相似之处或联系.什么是RESTful处理方式?我有一种感觉,答案将是该Accept-Language领域,但有人认真考虑在他们所属的社交网络上切换语言吗?是否应该每次都将所有这些信息返回给呼叫者,还是可以依赖设置?这可以用缓存吗?

api rest web-services social-networking

16
推荐指数
1
解决办法
3240
查看次数

URI弃用/到期的HTTP头字段

我正在构建一个REST服务,我想实现一种方法来弃用某些URI,因为这些URI因为某种原因而不再受支持.由于函数已弃用,它们将被替换为以类似(但不完全相同)方式工作的新函数.这意味着在某些时候,我将不得不开始回应410 Gone.

我们的想法是应该更新所有客户端软件,并且在说了六个月之后,所有用户都应该有机会进行升级.此时,不推荐使用的URI将开始通知客户端它已过期,以便客户端可以向用户显示消息.但是这个时间不是事先知道的,并且不能明确地写在文档中.

我想解决的问题是:

是否有一个HTTP头字段我应该用来表明某个URI将在某个时间停止工作,如果是,那么?

这可能不是第一次有人想要解决这个问题.是否有一个非官方的标题字段已经在使用,或者我应该自己设计?请注意,我不想将此信息添加到内容本身,因为这意味着每个资源都已更改并且需要由客户端刷新,这当然不是发生的事情.

rest version-control http-headers

5
推荐指数
1
解决办法
1112
查看次数