我正在研究在GET请求中为同一参数名传递多个值的正确方法是什么.
我见过这样的网址:
http://server/action?id=a&id=b
Run Code Online (Sandbox Code Playgroud)
我看过这样的网址:
http://server/action?id=a,b
Run Code Online (Sandbox Code Playgroud)
我的理解是第一个是正确的,但我找不到任何参考.我查看了http规范,但是看不出有关如何构成URL的'query'部分的任何信息.
我不想要一个说"要么很好"的答案 - 如果我正在构建一个Web服务,我想知道这些方法中的哪一个是标准的,以便使用我的web服务的人知道如何为同一个名称传递多个参数.
那么,有人能指出我的官方参考资料来确认哪个选项是正确的吗?
我PUT在我的Rails应用程序中使用了一个请求.现在,PATCH浏览器已经实现了一个新的HTTP动词.所以,我想知道PATCH和PUT请求之间的主要区别是什么,以及什么时候应该使用其中一个.
我有一个可以访问的在线HTTP目录.我试图通过下载所有子目录和文件wget.但问题是,当wget下载子目录时,它会下载index.html包含该目录中文件列表的文件,而无需自行下载文件.
有没有办法下载没有深度限制的子目录和文件(好像我要下载的目录只是一个我要复制到我的计算机的文件夹).

现在,我有一个初始页面,其中有三个链接.点击最后的"朋友"链接后,会启动相应的朋友组件.在那里,我想获取/获取我的朋友的列表进入friends.json文件.直到现在一切正常.但我仍然是使用RxJs的observables,map,subscribe concept的angular2的HTTP服务的新手.我试图理解它并阅读一些文章,但在我开始实际工作之前,我不会理解这些概念.
在这里,我已经制作了除HTTP相关工作之外的plnkr.
myfriends.ts
import {Component,View,CORE_DIRECTIVES} from 'angular2/core';
import {Http, Response,HTTP_PROVIDERS} from 'angular2/http';
import 'rxjs/Rx';
@Component({
template: `
<h1>My Friends</h1>
<ul>
<li *ngFor="#frnd of result">
{{frnd.name}} is {{frnd.age}} years old.
</li>
</ul>
`,
directive:[CORE_DIRECTIVES]
})
export class FriendsList{
result:Array<Object>;
constructor(http: Http) {
console.log("Friends are being called");
// below code is new for me. So please show me correct way how to do it and please explain about .map and .subscribe functions and observable pattern.
this.result = http.get('friends.json')
.map(response => …Run Code Online (Sandbox Code Playgroud) 我正在尝试DELETE使用CURL 发送带有url参数的请求.我在做:
curl -H application/x-www-form-urlencoded -X DELETE http://localhost:5000/locations` -d 'id=3'
Run Code Online (Sandbox Code Playgroud)
但是,服务器没有看到参数id = 3.我尝试使用一些GUI应用程序,当我将URL传递为:时http://localhost:5000/locations?id=3,它可以工作.我真的宁愿使用CURL而不是这个GUI应用程序.任何人都可以指出我做错了什么?
如何生成"304 Not Modified"?
浏览器如何确定对http请求的响应是否为304?
是由浏览器设置还是从服务器发送?
如果由服务器发送,服务器如何知道缓存中可用的数据,它如何将304设置为图像?
我的猜测,如果由浏览器生成
function is_modified()
{
return get_data_from_cache() === get_data_from_url();
};
function get_data_from_cache()
{
return some_hash_or_xxx_function(cache_data);
}
function get_data_from_url()
{
return some_hash_or_xxx_function(new_data);
}
function some_hash_or_xxx_function(data)
{
// do something with data
// what is that algorithm.?
return result;
}
console.log(is_modified());
Run Code Online (Sandbox Code Playgroud)
我依靠第三方API提供程序来获取数据,解析并将其推送到数据库.在每个请求期间数据可能会也可能不会发生变化,但是标题总是发送200,我不想解析,检查DB中的最后一个唯一ID等等来确定数据的变化,也不直接比较结果而是我md5(),sha1()&crc32()HASHed结果和工作正常,但想知道算法来确定304.
我想使用相同类型的算法来确定数据的变化.
来自RFC 2616
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1
无缓存
如果no-cache指令没有指定字段名,那么缓存绝不能使用响应来满足后续请求,而不能成功地与源服务器重新验证.这允许源服务器甚至通过已配置为返回对客户端请求的陈旧响应的缓存来防止缓存.
因此它指示代理重新验证所有响应.
比较这个
必重新验证
当高速缓存接收到的响应中存在must-revalidate指令时,该高速缓存必须在该条目变为陈旧后才能响应后续请求而不首先使用源服务器重新验证它
因此,它指示代理重新验证陈旧的响应.
特别是关于no-cache,用户代理实际上是如何根据经验处理这个指令的?
什么是点no-cache,如果有must-revalidate和max-age?
看到这个评论:
http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/
无缓存
虽然这个指令听起来像是指示浏览器不缓存页面,但是有一个微妙的区别.根据RFC,"no-cache"指令告诉浏览器它应该在从缓存提供页面之前重新验证服务器.重新验证是一种简洁的技术,可以让应用程序保留带宽.如果浏览器缓存的页面没有更改,则服务器只向浏览器发出信号,并从缓存中显示该页面.因此,浏览器(理论上至少)将页面存储在其缓存中,但仅在与服务器重新验证后才显示该页面.在实践中,IE和Firefox已经开始处理no-cache指令,就像它指示浏览器甚至不缓存页面一样.我们大约一年前开始观察这种行为.我们怀疑这种变化是由于该指令广泛(和不正确)使用以防止缓存而引起的.
有没有人在这方面有更多的官方?
更新
当且仅当无法验证对表示的请求可能导致不正确的操作(例如无声的未执行的金融交易)时,服务器才应使用必须重新验证的指令.
这是我从未想到的事情.RFC表示不要轻易使用must-revalidate.问题是,对于Web服务,您必须采取负面视图并假设您的未知客户端应用程序最糟糕.任何陈旧的资源都有可能导致问题.
我刚才考虑的其他事情,没有Last-Modified或ETags,浏览器只能再次获取整个资源.但是对于ETags,我发现Chrome至少似乎在每次请求时重新验证.这使得这两个指令都没有实际意义或至少命名不佳,因为它们无法正确地重新验证,除非请求还包含其他标题,然后导致"始终重新验证".
我只是想让最后一点更清楚.通过设置must-revalidate但不包括ETag或Last-Modified,代理只能再次获取内容,因为它没有任何内容可以发送到服务器进行比较.
但是,我的经验测试表明,当ETag或修改后的头数据包含在响应中时,代理总是会重新验证,无论是否存在must-revalidate头.
所以点must-revalidate是强制"旁路缓存"时,它会过时,如果当您设置了一生/年龄这只能发生,从而must-revalidate设置上,没有年龄或其他头的响应,它实际上就变成等同于no-cache自响应将立即被视为陈旧.
- 所以我要终于标记Gili的答案了!
我正在玩Nodejs并通过构建一个小的rest API来表达.我的问题是,设置代码状态的好方法/最佳方法是什么,以及响应数据?
让我解释一下代码(我不会把节点和快速代码放到启动服务器,只关注路由器方法):
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
res.json(user);
});
exports.getUserById = function(id) {
for (var i = 0; i < users.length; i++) {
if (users[i].id == id) return users[i];
}
};
Run Code Online (Sandbox Code Playgroud)
下面的代码工作正常,当使用Postman发送请求时,我得到以下结果:

如您所见,状态显示200,即可.但这是最好的方法吗?有没有我应该自己设置状态,以及返回的JSON?或者总是由快递处理?
例如,我刚刚进行了快速测试并略微修改了上面的get方法:
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
if (user == null || user == 'undefined') {
res.status(404);
}
res.json(user);
});
Run Code Online (Sandbox Code Playgroud)
如您所见,如果在阵列中找不到用户,我将只设置404状态.
有关此主题的更多信息的资源/建议非常受欢迎.
我是python的新手并使用Python Flask并生成REST API服务.
我想检查发送给客户端的授权标头.
但我无法找到获取HTTP标头的方法.
任何有关获取HTTP标头授权的帮助都表示赞赏.
HTTP有HTTP Cookie.Cookie允许服务器跟踪用户状态,连接数,最后连接数等.
HTTP具有持久连接(Keep-Alive),其中可以从同一TCP连接发送多个请求.