Я создаю веб-приложение, основанное на Dart (с полимерной структурой, но это не относится к вопросу). Мое приложение взаимодействует с сервером HTTP RESTful.Как настроить Content-Type для каждой части многочастного запроса в Dart?
Проблема в том, что я пытаюсь отправить запрос HTTP-сообщения в multipart, но я не смог найти способ установить «Content-Type» для каждой части тела (, а не для основного HTTP заголовок, который по праву устанавливается дротика в «многочастного/форм-данных»)
Вот простой репро моего запроса 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 в качестве двоичных объектов объекта:
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 (преобразован в Base64 по dart framework?) и не может быть проанализирован сервером.
Как только я использую тип Blob, устанавливается атрибут filename, и сервер также отклоняет запрос.
Любая идея?
Заранее благодарен!
Я не использовал многопрофильные запросы раньше, но mabe это может помочь http://stackoverflow.com/a/22604319/217408 –
Я использую тот же тип кода на стороне клиента, чтобы публиковать данные на базе Java и он работает хорошо. Кажется, это проблема на стороне сервера. –
Спасибо за ваши ответы. @ GünterZöchbauer Объект MultipartRequest имеет два метода добавления «детали» в ваш запрос: поля для добавления «текстовой» части (json/xml ..) и файла для добавления файла. Метод файла позволяет вам определить Content-Type (как показано в примере), но, к сожалению, вы не можете установить его с помощью метода fields. –