据我所知,RESTful API中使用了四种方法:
GET用于获取资源.用于更新资源的
POST.
PUT用于创建或替换资源.
DELETE用于删除资源.
假设我们有一个名为apple的资源,我们可以通过多种方式"更新"它.例如,削减它,切片,或使其成为苹果汁.
这三种不同的更新操作中的每一种都采用不同的参数,并且其API中的常见部分将是:
POST /apple HTTP/1.1
Host: www.example.com
<different combination of arguments>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,三个API共享相同的URI和相同的请求方法,它们的唯一区别是参数.我认为这迫使后端准备接受这些参数的联合集,并且为了区分实际请求的动作,后端需要检查参数的组合.它太复杂而且不优雅.
所以我的问题是:
在这个苹果案例中,如何设计出一套优雅的RESTful API,使后端可以轻松处理.
我想要得到的价值INT_MIN和INT_MAX,和我试过~0和~0 >> 1,因为最左边的位为符号位.我得到了他们两个-1.
它太混乱了,为什么不~0成为0xffffffff和~0 >> 1将来0x7fffffff?
在主机上,查找域速度非常快.但是在docker容器内部,它会
慢得多,有时会超时.
主机是一个虚拟主机,它的DNS服务器地址是127.0.0.1(奇怪但是真实).所以我试图修改容器内的/etc/resolv.conf并将dns服务器设置为172.x(主机的地址).结果,我没有看到任何好的效果.
我也尝试将容器的dns服务器设置为自构建的服务器(101.x),但是,查找域名的速度很慢.另一个奇怪的事情是ping 101.x非常快.
我对这种现象感到困惑,有谁能解释和帮助?
我有一个带有2个NIC的Linux虚拟服务器。
eth0 <IP1>
eth1 <IP2>
Run Code Online (Sandbox Code Playgroud)
arp_filter打开并rp_filter设置为2(宽松模式)。
策略路由配置如下:
table T1
default via <GW> dev eth0 src <IP1>
127.0.0.0/8 dev lo
<LAN> dev eth0 src <IP1>
table T2
default via <GW> dev eth1 src <IP2>
127.0.0.0/8 dev lo
<LAN> dev eth1 src <IP2>
ip rule add from <IP1> table T1
ip rule add from <IP2> table T2
Run Code Online (Sandbox Code Playgroud)
在那之后,我可以ping二者结合的floatingips <IP1>和<IP2>来自外部。但是没有用ping -I eth1 <some_domain>。tcpdump显示了当我从eth1外部ping时,Linux直接询问MAC外部地址,这是不正确的,因为它们不是相同的LAN。
这是tcpdump …
我的代码与gowiki中的代码相同
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
Run Code Online (Sandbox Code Playgroud)
但是,在我构建并运行此程序后,它立即退出而没有阻塞,因此当我尝试http://localhost:8080/monkey从Chrome 访问时,我没有得到任何响应.
环境:Ubuntu 14(在Windows7上的VirtualBox中)
为什么?
假设我们有一个处理HTTP请求的函数,例如:
func handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("first piece of data"))
// do something
w.Write([]byte("second piece of data"))
}
Run Code Online (Sandbox Code Playgroud)
我想知道如果第一次调用w.Write()被刷新到客户端?
如果它被刷新,那么我们实际上会对客户端做两次响应,这很奇怪,因为我们如何Content-Length在第二次调用写入之前确定?
如果没有刷新(比如数据在本地缓冲),那么如果我们在第一次调用时写入大量数据会怎么样?(堆栈会溢出吗?)
任何解释将不胜感激!:)
假设服务器需要向客户端响应一些数据,并且数据来自本地磁盘上的文件.然后我们写,
n, err := io.Copy(w, f) // w is the ResponseWriter and f is the *os.File
Run Code Online (Sandbox Code Playgroud)
我在想什么就是io.Copy()首先从写一个标题,然后将数据复制f到w.
如果err不是nil(比方说unexpected EOF),客户端仍然会获得状态代码200,尽管响应正文包含错误.
也许本地磁盘坏了,或者客户端网络坏了.我们怎样才能确定
是否err是由服务器或客户机引起的?
我知道在C/C++和Java中,程序的入口点就是函数main(),
现在我有以下两个问题,
用MASM,NASM和其他语言编写的程序入口点是什么?
什么是CPU知道在哪里找到程序入口点的惯例?
== - 编辑 - ==
问题2不是一个有意义的问题,因为CPU负责找到入口点是错误的.没有这样的惯例.见Eric Lippert澄清.
在Go中,如果我想创建一个T对象,我可以尝试这些方法:
t := T{} // t是在当前堆栈中创建的实际对象
p := &T{} // p是指向在当前堆栈中创建的实际对象
p := make(T) 的指针// p是指向在堆中创建的实际对象的指针
p := new(T) // p是指向在堆中创建的实际对象的指针
我想知道我的评论是否正确?