У меня есть 4 дня, пытаясь сделать многопользовательский запрос с использованием Retrofit 1.8.0 в android с успехом. Мой интерфейс выглядит что-то вроде этогоМногопользовательский запрос с использованием Retrofit 1.8.0 не работает
@Multipart
@POST("/posts/add.json")
void addComment(
@Part("id") String id,
@Part("post[body]") String body,
@Part("post[attachment]") TypedFile attachment,
Callback<Map<String, String>> callback);
Но, на стороне сервера, я получаю следующее
Parameters: {"id"=># <File:/var/folders/z0/0ggjvvfj4t1fdsvbxf3lc9pw0000gn/T/RackMultipart9853-0>, "post"=>{"body"=>#<File:/var/folders/z0/0ggjvvfj4t1fdsvbxf3lc9pw0000gn/T/RackMultipart9853-1>, "attachment"=>#<File:/var/folders/z0/0ggjvvfj4t1fdsvbxf3lc9pw0000gn/T/RackMultipart9853-2>}, "controller"=>"posts", "action"=>"add", "format"=>"json"}
Как вы можете видеть, файл часть посылает его в каждой части, но и я отсутствует значение по параметрам с идентификатором и пост [тела]
Вот это то, что дооснащения пытается отправить
02-06 15:01:16.213 32545-822/com.myapp D/Retrofit﹕ --fe41634b-6826-4ee4-95cb-65efb0ca66c2
Content-Disposition: form-data; name="id"
Content-Type: text/plain; charset=UTF-8
Content-Length: 3
Content-Transfer-Encoding: binary
189
--fe41634b-6826-4ee4-95cb-65efb0ca66c2
Content-Disposition: form-data; name="post[body]"
Content-Type: text/plain; charset=UTF-8
Content-Length: 4
Content-Transfer-Encoding: binary
test
--fe41634b-6826-4ee4-95cb-65efb0ca66c2
Content-Disposition: form-data; name="post[attachment]"; filename="IMG_20140203_144358.jpg"
Content-Type: image/jpg
Content-Length: 1615460
Content-Transfer-Encoding: binary
����/�Exif����MM��*���������
Вот это то, что библиотека HttpMime посылает в многотомных, разница является «Content-Transfer-Encoding» заголовок против Модернизированный
Content-Disposition: form-data; name="id"
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 8bit
Content-Disposition: form-data; name=“post[body]"
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 8bit
Content-Disposition: form-data; name=“post[attachment]"; filename="images.jpg"
Content-Type: image/jpg
Content-Transfer-Encoding: binary
Любой ключ? Заранее заблаговременно
------------------------------- РЕШЕНИЕ ---------- ------------------------
В конце концов, я решил этот путь, на самом деле мой ответ довольно близок к @lazypig, это было хороший ориентир
Единственное, что я изменил был своим классом «ByteArrayTypedOutput»
Я создал класс под названием «MultipartTypedOutputCustom» http://pastie.org/10549360
И это, как он выглядит мой интерфейс Теперь
класс "PostsRetrofitAPI.java"
@POST("/posts/add.json")
void addComment(@Body MultipartTypedOutputCustom parts,
Callback<Map<String, String>> callback);
класс "PostsService.java"
//Properties
private PostsRetrofitAPI mApi;
...
@Override
public void addComment(ServiceResponseHandler<Map<String, String>> handler, String id, String body, TypedFile attachment) {
MultipartTypedOutputCustom parts = new MultipartTypedOutputCustom();
parts.addPart("id", new TypedString(id));
parts.addPart("post[body]", new TypedString(body));
parts.addPart("post[attachment]", attachment);
objectRetrofitCallback= new ObjectRetrofitCallback(handler, ServerError.class, ClientError.class);
mApi.addComment(parts, objectRetrofitCallback);
}
Вы можете разместить свой HTTP-конверт? Включить журналы в RestAdapter.Builder(). setLogLevel (LogLevel.FULL) –
Привет, я уже редактировал свой пост с вашим предложением – arh
Вы поняли это в конце? – Lion789