【发布时间】:2015-03-27 10:23:59
【问题描述】:
我正在构建一个基于 Dart 的 Web 应用程序(使用聚合物框架,但这与问题无关)。我的应用正在与 HTTP RESTful 服务器通信。
问题是我试图在多部分中发送 HTTP Post 请求,但我找不到为正文的每个部分设置“Content-Type”的方法(而不是主要HTTP 标头,由 dart 正确设置为 'multipart/form-data')
这是我的 http 请求的简单复制:
import 'dart:html';
import 'dart:convert';
main(){
print("je suis dans dart");
Map jsontosend = {
'business-context-id': "contexte1",
'metadatas': [
{"metadata-id" : "nom", "value" : "doe"},
{"metadata-id" : "prenom", "value" : "john"}],
};
FormData form = new FormData();
form.append("context", JSON.encode(jsontosend));
HttpRequest.request("www.google.com", method: "POST", sendData: form);
}
这是我的请求负载:
Remote Address:127.0.0.1:63342
Request URL:http://localhost:63342/http_test/web/www.google.com
Request Method:POST
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:263
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarym9PvtGzZDKOKiaH1
Host:localhost:63342
Origin:http://localhost:63342
Referer:http://localhost:63342/http_test/web/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.0 (Dart) Safari/537.36
Request Payload
------WebKitFormBoundarym9PvtGzZDKOKiaH1
Content-Disposition: form-data; name="context"
{"business-context-id":"contexte1","metadatas":[{"metadata-id":"nom","value":"doe"},{"metadata-id":"prenom","value":"john"}]}
------WebKitFormBoundarym9PvtGzZDKOKiaH1--
我试图调用的服务器无法解析“上下文”部分,因为没有提供内容类型。
我还尝试将我的 json “转换”为 blob 对象:
import 'dart:html';
import 'dart:convert';
main(){
print("je suis dans dart");
Map jsontosend = {
'business-context-id': "contexte1",
'metadatas': [
{"metadata-id" : "nom", "value" : "doe"},
{"metadata-id" : "prenom", "value" : "john"}],
};
FormData form = new FormData();
Blob blob = new Blob([JSON.encode(jsontosend)], 'application/json', 'native');
form.appendBlob("context", blob);
HttpRequest.request("www.google.com", method: "POST", sendData: form);
}
以及相关的有效载荷:
Remote Address:127.0.0.1:63342
Request URL:http://localhost:63342/http_test/web/www.google.com
Request Method:POST
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:312
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryjHxHOCKDpsp22rzQ
Host:localhost:63342
Origin:http://localhost:63342
Referer:http://localhost:63342/http_test/web/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.0 (Dart) Safari/537.36
Request Payload
------WebKitFormBoundaryjHxHOCKDpsp22rzQ
Content-Disposition: form-data; name="context"; filename="blob"
Content-Type: application/json
------WebKitFormBoundaryjHxHOCKDpsp22rzQ--
这一次,设置了上下文部分的 Content-Type,但是我的 json 被“包装”为一个 blob(通过 dart 框架转换为 Base64?),无法被服务器解析。
我一使用Blob类型,filename属性就设置好了,服务器也拒绝请求。
有什么想法吗?
提前致谢!
【问题讨论】:
-
我之前没有使用过多部分请求,但这可能对stackoverflow.com/a/22604319/217408有一些帮助
-
我在客户端使用相同类型的代码将数据发布到 java 后端并且效果很好。好像是服务器端的问题。
-
感谢您的回答。 @GünterZöchbauer MultipartRequest 对象有两种方法可以将“部分”添加到您的请求中:添加“文本”部分(json / xml ..)的字段和添加文件的文件。 file 方法允许您定义 Content-Type(如示例所示),但遗憾的是您无法使用 fields 方法进行设置。
-
@AlexandreArdhuin 这在服务器端不是问题。由于它同时接受 json 和 xml,它必须能够执行内容协商。他们要求所有前端应用程序指定他们的内容类型(没有默认值)
-
但是在您的最后一个代码 sn-p 中,Content-Type 很好地为“上下文”部分提供了。所以我不明白你的评论。
标签: rest http dart content-type multipart