我有一个在REST架构中设计的Web服务。
我希望有一个允许用户上传图片的终点。
我正在使用AWS,我希望以一个服务器获取请求的方式创建整个服务,然后(如果需要)它将重定向到相关服务器以处理请求。
例如: 使用包含图片的参数发送HTTP Post请求: rest.myservice.com/picture/upload会将请求重定向到正确的服务器(甚至直接重定向到正确的S3路径)。
为了澄清,重定向不是问题,但我希望它在收到整个图片之前重定向路由(为了节省性能和时间)。
这可能吗?
答案 0 :(得分:1)
如果您重新考虑此要求并使用可以负责将请求传递到正确服务器的前端层设计您的系统,可能会更好。
使用反向代理服务器很容易。这方面的一个例子是HAProxy,它可以根据您定义的URL模式匹配,cookie和其他规则将请求路由到后端服务器,并且极其资源使用率低(甚至是t2。微实例可以处理数百个同时连接。)
我说这一切都是因为重定向除GET
个请求之外的请求可以让您进入不一致/错误的浏览器/用户代理行为区域,其中重定向可能在一个浏览器(或版本)上失败,同时正常工作在另一个。
类似地,在发送有效负载之前允许在飞行中的请求被中断以进行重定向(或错误响应)的机制中存在不一致的行为:
http://tools.ietf.org/html/rfc7231#section-5.1.1
如果用户代理在请求中包含Expect: 100-continue
标头,则用户代理应等待您的服务在实际发送有效负载之前发送100 Continue
响应,这样您就可以交替发送重定向响应或告诉它继续使用有效负载...但这取决于用户代理在请求中设置它并正确处理响应。对于用户代理来说发送Expect:
标头然后发送有效负载而不实际等待并不是闻所未闻,这应该仍然“工作”位不能始终如一地执行。
然而,如果那个“足够接近”,那么它可能值得尝试...这个实际实现的一个例子是在S3本身,它支持Expect:
标题......至少对PUT object个请求。基于浏览器的POST上传文档没有提到这一点,但他们确实有一个关于POST重定向的警告,这只能在创建存储桶后不久发生,之后在DNS中更新“bucket.s3.amazonaws.com”主机名(由S3本身:将请求发送到正确的区域端点。
如果您的存储桶是使用
<CreateBucketConfiguration>
创建的,则最终用户可能需要重定向。如果发生这种情况,某些浏览器可能会错误地处理重定向。这种情况相对较少,但最有可能在创建存储桶后立即发生。
我提到这最后一部分,只是因为它支持我的断言,不幸的是,浏览器和其他用户代理不能被信任以一致或优雅地处理重定向。