我想在没有浏览器的 nodejs 中发出 post 请求,因为它是后端代码。
const formdata = new FormData()
formdata.append('chartfile', file);
Run Code Online (Sandbox Code Playgroud)
但是上面的代码给了我错误为FormData not defined. 我正在使用 ES6。
任何人,谁能让我知道如何在 nodejs 中使用 FormData?
我正在编写测试来验证我可以在我们的API上发布通用表单.
我还添加了一些调试,但我注意到实际表单发布的数据; (邮差/ AngularJS或w/e)不同于做mockMVC测试,如:
MvcResult response = mockMvc
.perform(post("/some/super/secret/url") //
.param("someparam1", "somevalue") //
.param("someparam2", "somevalue") //
.contentType(MediaType.APPLICATION_FORM_URLENCODED) //
.accept(MediaType.APPLICATION_JSON)) //
.andExpect(status().isOk()) //
.andReturn();
Run Code Online (Sandbox Code Playgroud)
配置与生产中运行的配置完全相同,等等.但是当我的拦截器记录内容时,在实际测试(而不是mockMVC)中,内容的格式为"someparam1 = somevalue&etc = encore"
当我打印mockMVC内容时,我实际上似乎没有内容,但请求中有Params,我认为它们像GET参数一样被添加.
有谁知道如何正确测试这个?我遇到了这个问题,因为看起来我们的表单帖子似乎没有被Spring解析,即使我们已经将FormHttpMessageConverter添加到servlet上下文中.
我有一台服务器,我需要将文件和一些字段从客户端上传到服务器.我目前一直在使用标准的multipart/form-data.
然而,我发现使用multipart/form-data并不理想.我的服务器上的对象可能嵌套在其中的其他对象,因此表示为嵌入其他JSON对象的JSON对象.
我希望客户端能够以REST-ful方式使用JSON表示开始发出POST/PUT请求,就像它对服务器的GET请求所期望的那样.这样我就不必将可能嵌套在JSON对象中的几个层的字段展平,以便使用multipart/form-data.
问题是,JSON不代表二进制数据.Multipart/form-data似乎没有办法表示嵌套在其他字段值中的字段.但它确实有更好的文件上传处理.
我对如何设计它感到茫然.我应该让客户端上传带有base64编码的字段的JSON,并获得25%的命中率吗?或者我应该在Multipart/form-data请求中将JSON对象表示为某种"json"变量,并将二进制文件作为另一个变量上载?
我已经实现了这个脚本用于上传带有ajax的文件,它在浏览器以外的其他浏览器中工作得很完美,我注意到IE9不支持formData,更少,IE中的formData有什么替代品,我想用干净的javascript
function doObjUploadExplorer(url, lnk_id, file, progress, success, content, frm, div_dlg, start_func){
var file_input = null,
frm_data = new FormData(),
req;
try {
//firefox, chrome, safari etc
req = new XMLHttpRequest();
}
catch (e) {
// Internet Explorer Browsers
req = new ActiveXObject("Microsoft.XMLHTTP");
}
if (document.getElementById(file)) {
file_input = document.getElementById(file);
for (var i = 0; i < file_input.files.length; ++i) {
frm_data.append(file, file_input.files[i]);
}
}
req.upload.addEventListener('progress', function(e) { //Event called while upload is in progress
if (progress !== undefined
&& e.lengthComputable) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Retrofit 2发出POST请求.请求类型form-data 不是 application/x-www-form-urlencoded.
我只发布数据而不是请求中的文件,响应采用JSON格式.
我试过了@FormUrlEncoded, @Multipart但是没有用.
我试过以下请求
1.第一次尝试
@FormUrlEncoded
@POST("XXXX")
Call<PlanResponse> getPlanName(@Field(Constants.ACTION_ID) String actionId, @Field(Constants.OFFER_CODE) String offerCode);
Run Code Online (Sandbox Code Playgroud)
2.第二次尝试
@Headers({"Content-Type: multipart/form-data","Content-Type: text/plain"})
@FormUrlEncoded
@POST("XXXX")
Call<PlanResponse> getPlans(@Body @FieldMap(encoded = false) Map<String, String> data);
Run Code Online (Sandbox Code Playgroud)
3.第三次尝试
@Headers("Content-Type: multipart/form-data")
@Multipart
@POST("XXXX")
Call<PlanResponse> myPlans(@Part(Constants.ACTION_ID) String actionId, @Part(Constants.OFFER_CODE) String offerCode);
Run Code Online (Sandbox Code Playgroud)
我只是将身体变为空.它正在与POSTMAN合作.
我也搜索一下form-data,并application/x-www-form-urlencoded发现,如果数据是二进制的,然后使用form-data,如果数据是ASCII然后使用application/x-www-form-urlencoded
我正在尝试查找改造不支持表单数据吗?
POSTMAN请求
Cache-Control: no-cache
Postman-Token: XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX
Content-Type: multipart/form-data; boundary=---- WebKitFormBoundaryXXXXXXXXXXXX
----WebKitFormBoundaryXXXXXXXXXXXX
Content-Disposition: form-data; name="actionId"
1000
----WebKitFormBoundaryXXXXXXXXXXXX
Content-Disposition: form-data; name="offerCode"
MYCODE …Run Code Online (Sandbox Code Playgroud) 我试图使用jQuery的ajax方法从表单提交文件:
var ofile=document.getElementById('image').files[0];
var formdata = new FormData();
formdata.append("image",ofile);
$.ajax({
url:'elements/save_elements',
data:formdata,
type:'POST'
});
Run Code Online (Sandbox Code Playgroud)
这导致错误TypeError: 'append' called on an object that does not implement interface FormData.
是什么导致这个错误?它不会发生在实际的formdata.append,但在jQuery内部.
我设法发送一个FormData对象,如下所示:
var formData = new FormData();
formData.append('file', this.files[0]);
$.ajax({
url: urlUploadProductsFile,
type: 'POST',
data: formData,
cache: false,
contentType: false,
processData: false
}, 'json');
Run Code Online (Sandbox Code Playgroud)
现在我想要做的是添加一个额外CustomerId的发送到服务器.以下内容不起作用:
var formData = new FormData();
formData.append('file', this.files[0]);
$.ajax({
url: urlUploadProductsFile,
type: 'POST',
data: { "file": formData, "CustomerId": 2 },
cache: false,
contentType: false,
processData: false
}, 'json');
Run Code Online (Sandbox Code Playgroud)
我还尝试了以下变化:
data: { "file": formData, "CustomerId": 2 }, processData: true
data: JSON.stringify({ "file": formData, "CustomerId": 2 })
data: { "file": JSON.stringify(formData), "CustomerId": 2 }
data: { file: …
我正在尝试执行 http post 请求,我需要将正文指定为form-data,因为服务器不会将请求视为原始请求。
这就是我正在做的:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
postTest() async {
final uri = 'https://na57.salesforce.com/services/oauth2/token';
var requestBody = {
'grant_type':'password',
'client_id':'3MVG9dZJodJWITSviqdj3EnW.LrZ81MbuGBqgIxxxdD6u7Mru2NOEs8bHFoFyNw_nVKPhlF2EzDbNYI0rphQL',
'client_secret':'42E131F37E4E05313646E1ED1D3788D76192EBECA7486D15BDDB8408B9726B42',
'username':'example@mail.com.us',
'password':'ABC1234563Af88jesKxPLVirJRW8wXvj3D'
};
http.Response response = await http.post(
uri,
body: json.encode(requestBody),
);
print(response.body);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Container(
child: Center(
child: RaisedButton(
child: Text('Press Here'),
onPressed: …Run Code Online (Sandbox Code Playgroud) 我想使用类型的post请求上传多个文件,multipart/form-data并且我需要知道服务器端的文件大小(内容长度).
为了构造POST请求,javascript我使用一个FormData对象并将File对象附加到它上面.这样可以正常工作,但除了Content-type标题之外,每个部分只添加一个Content-Disposition标题,但没有Content-length标题,尽管可以从各个File对象获得此信息.
有没有办法实现在发送请求时Content-length为FormData对象的每个部分设置标头?
下面是我使用的代码,包括我对问题的解决方法.它实际上用于angular-js发送请求,但我认为这与问题无关.
var form = new window.FormData();
form.append('additional-field-1', new Blob(['some plain text'], {type : 'text/plain'}));
for (var file in fileList) {
var fileObj = fileList[file];
var count = 1 + parseInt(file, null);
form.append('file-size-' + count, new Blob([fileObj.size], {type : 'text/plain'}));
form.append('file-' + count, fileObj);
}
$http.post(url, form, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
}).success(.....
Run Code Online (Sandbox Code Playgroud) 我相信每个人都知道这种行为.您在网上填写表格,然后提交.提交后,您认识到您填写了一些错误的数据.所以,你点击浏览器后退按钮.然后,有时表单仍然包含您输入的数据(您希望在这种情况下),有时不会.
当它被清除时,我找不到任何连接.
我在internet/stackoverflow上找到的一些答案:
但他们两个都是绝对错误的.我看过网站(比如我自己的网站)确实在浏览器恢复之后保留了表单数据,并且正在使用https 并正在使用会话.
所以请:有人可以解释一下浏览器是如何处理这些东西的吗?
顺便说一句:我的任务是确保不清除表单数据.