我是REST的新手,我发现在一些RESTful服务中,他们使用不同的资源URI进行更新/获取/删除和创建.如
我对这个URI命名约定有点困惑.我们应该使用复数或单数来创建资源?决定时应该有什么标准?
我正在使用jQuery和Ajax为我的表单提交数据和文件,但我不确定如何以一种形式发送数据和文件?
我目前对这两种方法的做法几乎相同,但数据收集到数组的方式不同,数据使用.serialize();
但文件使用= new FormData($(this)[0]);
是否可以将两种方法结合起来,以便能够通过Ajax以一种形式上传文件和数据?
数据jQuery,Ajax和html
$("form#data").submit(function(){
var formData = $(this).serialize();
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="data" method="post">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<button>Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)
文件jQuery,Ajax和html
$("form#files").submit(function(){
var formData = new FormData($(this)[0]);
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data) …
Run Code Online (Sandbox Code Playgroud) 我有一个REST Web服务,目前公开此URL:
用户可以POST
使用以下JSON:
{
"Name": "Test",
"Latitude": 12.59817,
"Longitude": 52.12873
}
Run Code Online (Sandbox Code Playgroud)
为了创建新的媒体元数据.
现在我需要能够在媒体元数据的同时上传文件.解决这个问题的最佳方法是什么?我可以引入一个名为file
base64 的新属性编码文件,但我想知道是否有更好的方法.
还有multipart/form-data
像HTML表单一样使用,但我正在使用REST Web服务,我想尽可能坚持使用JSON.
我们正在使用REST API开发服务器,它接受并使用JSON进行响应.问题是,如果您需要将图像从客户端上传到服务器.
另请注意,我在讨论用例,其中实体(用户)可以拥有文件(carPhoto,licensePhoto),还有其他属性(名称,电子邮件...),但是当您创建新用户时,您不会发送这些图像,它们是在注册过程后添加的.
我所知道的解决方案,但每个都有一些缺陷
1.使用multipart/form-data而不是JSON
好:POST和PUT请求尽可能是RESTful,它们可以包含文本输入和文件.
缺点:它不再是JSON,与multipart/form-data相比,它更容易测试,调试等
2.允许更新单独的文件
用于创建新用户的POST请求不允许添加图像(在我们的用例中我在开始时的说法是可以的),上传图片是通过PUT请求作为multipart/form-data完成的,例如/ users/4/carPhoto
好的:一切(除了文件上传本身)都保留在JSON中,它很容易测试和调试(你可以记录完整的JSON请求而不用担心它们的长度)
缺点:它不直观,您不能一次POST或PUT实体的所有变量,并且此地址/users/4/carPhoto
可以更多地被视为一个集合(REST API的标准用例看起来像这样/users/4/shipments
).通常你不能(也不想)GET/PUT实体的每个变量,例如users/4/name.您可以使用GET获取名称,并在用户/ 4处使用PUT进行更改.如果在id之后有什么东西,它通常是另一个集合,比如users/4/reviews
3.使用Base64
将其作为JSON发送,但使用Base64编码文件.
good:与第一个解决方案相同,它尽可能地提供RESTful服务.
缺点:再次,测试和调试更糟糕(正文可以有兆字节数据),大小和处理时间都有所增加 - 客户端和服务器
我真的很想使用解决方案.2,但它有它的缺点...任何人都可以让我更好地了解"什么是最好的"解决方案?
我的目标是使用尽可能多的标准来提供RESTful服务,同时我希望尽可能简化它.
我知道如何创建使用MediaType.MULTIPART_FORM_DATA
和处理文件的端点@FormDataParam("file") FormDataBodyPart bodyPart
,但我想知道我是否也可以在该请求中拥有JSON数据?就像是:
@POST
@Path("somepath")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFileAndJSON(@RequestBody SomeModel someModel,
@FormDataParam("file") FormDataBodyPart bodyPart) {
return null;
}
Run Code Online (Sandbox Code Playgroud)
目前,如果我在以下邮递员请求的"原始"选项卡上添加一些JSON数据,我HTTP 415 Unsupported Media Type
可能因为我指定我消费MULTIPART_FORM_DATA
但我也在使用@RequestBody
哪个正在寻找JSON内容APPLICATION_JSON
.那么如何在同一个请求中处理JSON数据和文件呢?我知道可以在两个请求中执行此操作,如果可能,我只想在一个请求中执行此操作?
我正在构建一个Spring rest服务来上传文件.有一个表单由各种字段和一个字段组成,用于上传文件.在提交这种形式,我送一个,即多形式要求Content-Type
作为multipart/form-data
.
所以我尝试了以下
@RequestMapping(value = "/companies", method = RequestMethod.POST)
public void createCompany(@RequestBody CompanyDTO companyDTO, @RequestParam(value = "image", required = false) MultipartFile image){
.................
Run Code Online (Sandbox Code Playgroud)
但是,上述方法无效.所以暂时,我将JSON数据作为String发送,并在休息服务中从该String形成公司对象
@RequestMapping(value = "/companies", method = RequestMethod.POST)
public void createCompany(@RequestParam("companyJson") String companyJson, @RequestParam(value = "image",required = false) MultipartFile image) throws JsonParseException, JsonMappingException, IOException{
CompanyDTO companyDTO = new ObjectMapper().readValue(companyJson, CompanyDTO.class);
.............................
Run Code Online (Sandbox Code Playgroud)
我不能在不将JSON作为String传递的情况下使用@RequestBody发送JSON数据吗?
我正在尝试上传图像,但 FastAPI 返回时出现一个我无法弄清楚的错误。
file: UploadFile = File(...)
如果我从函数定义中省略“ ”,它就会正常工作。但是当我将 the 添加file
到函数定义中时,它会抛出错误。
这是完整的代码。
@router.post('/', response_model=schemas.PostItem, status_code=status.HTTP_201_CREATED)
def create(request: schemas.Item, file: UploadFile = File(...), db: Session = Depends(get_db)):
new_item = models.Item(
name=request.name,
price=request.price,
user_id=1,
)
print(file.filename)
db.add(new_item)
db.commit()
db.refresh(new_item)
return new_item
Run Code Online (Sandbox Code Playgroud)
Pydantic模型Item
只是
class Item(BaseModel):
name: str
price: float
Run Code Online (Sandbox Code Playgroud)
错误是:
代码 422 错误:无法处理的实体
{
"detail": [
{
"loc": [
"body",
"request",
"name"
],
"msg": "field required",
"type": "value_error.missing"
},
{
"loc": [
"body",
"request",
"price"
],
"msg": "field required", …
Run Code Online (Sandbox Code Playgroud) 我在Microsoft Web API中实现了REST API.
在我的客户端,我使用HttpRequestMessage和HttpResponseMessage.
当我发送一个小类时,我将它序列化为JSON然后发送它.
很快,我的班级变得更大,我需要JSON这个类,压缩它(在内存中)并发送到服务器.我不能再使用相同的技术,我需要发送块的zip.
实现它的正确方法是什么?我已经阅读了这篇文章,将文件和相关数据发布到RESTful WebService,最好是JSON
需要一些好文章,我不知道从哪里开始.
有没有办法将字符串转换为ActionDispatch::Http::UploadedFile
我需要它能够在 API 请求中传递文件路径来处理将 Excel 插入数据库的操作,因为我想使用 REST API 而不是浏览器来上传文件。
谢谢
rest ×7
json ×4
file-upload ×2
java ×2
spring ×2
.net ×1
ajax ×1
api ×1
c# ×1
fastapi ×1
forms ×1
javascript ×1
jquery ×1
python ×1
python-3.x ×1
resources ×1
ruby ×1
uri ×1
web-services ×1