我正在构建一个基于Dart的Web应用程序(使用聚合物框架,但这与问题无关)。我的应用正在与HTTP RESTful服务器进行通信。
问题是我试图在多部分中发送HTTP Post请求,但我找不到设置“内容类型”的方法。对于身体的每个部分(而不是主HTTP标头,这是由dart正确设置为&multi39 / 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被包裹了#39;作为blob(由dart框架转换为Base64?)并且无法由服务器解析。
一旦我使用Blob类型,就会设置 filename 属性,服务器也会拒绝该请求。
有什么想法吗?
提前致谢!
答案 0 :(得分:1)
我可以找到解决方案。 诀窍是在将blob附加到表单时指定扩展名为.json的文件名。
import 'dart:html';
import 'dart:convert';
main(){
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, "whatever.json");
HttpRequest.request("www.google.com", method: "POST", sendData: form);
}
但是,在使用文本部分时,我仍然不知道如何指定Content-Type。
感谢大家的帮助!