Построение Multipart/form-data с Android

Я пытаюсь сделать HttpPost с multiPart/form-data через приложение для Android. У меня есть тест почтальона, который работает с моим API, и предварительный просмотр этого запроса в почтальоне выглядит так:

POST /api/0.1/content/upload HTTP/1.1
Host: 54.221.194.167
X-AUTHORIZATION: 166e649911ff424eb14446cf398bd7d6
Cache-Control: no-cache
Postman-Token: 2412eba9-f72d-6f3b-b124-6070b5b26644

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="file01"

{"mime_type":"image/jpeg","title":"IMG_20140131_111622"}
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="file01"; filename="addedaslib.jpg"
Content-Type: image/jpeg


----WebKitFormBoundaryE19zNvXGzXaLvS5C

Я пытаюсь воспроизвести это, используя multipart/form-data с моим Android HttpPost, но, похоже, это не работает. Есть ли способ «предварительно просмотреть» мой запрос и посмотреть, как он на самом деле отправляется в API? Что я делаю не так? мой код:

public HttpResponse invokeXAUTHPOSTService(String url, String token, File file) {


        client = new DefaultHttpClient();
        HttpPost request = new HttpPost(url);
        HttpResponse response = null; 
        MultipartEntity mpe = new MultipartEntity();
    try {


        Log.v("API", "URL:"+url);
        request.setHeader("Content-Type", "multipart/form-data");
        request.addHeader("X-AUTHORIZATION",token);
        request.addHeader("Cache-Control", "no-cache");

        DRPContentForUpload content = new DRPContentForUpload(file);
        String jsonObject = DRPJSONConverter.toJson(content);

        FormBodyPart part1= new FormBodyPart("file01", new StringBody(jsonObject));
        FormBodyPart part2= new FormBodyPart("file01", new FileBody(file)); 
        mpe.addPart(part1);
        mpe.addPart(part2);

        //

        request.setEntity(mpe);
        Log.v("RAW REQUEST", "request looks like:"+mpe.toString());
        response = client.execute(request);

ИЗМЕНИТЬ

Мне удалось поговорить с моей командой API, и они сказали, что мой пост на самом деле выглядит так:

--0ieMJK6PPwcrM_K3KQvl6eNDGqooZPzJcvHOm0
Content-Disposition: form-data; name="file01"
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 8bit

{"mime_type":"image/jpeg","title":"IMG_20140131_111622"}
--0ieMJK6PPwcrM_K3KQvl6eNDGqooZPzJcvHOm0
Content-Disposition: form-data; name="file01"; filename="IMG_20140131_111622.jpg"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

Тем не менее, он все еще не работает и выдает ошибку, что мне не хватает параметров.

вот скриншот библиотек, включенных в мой проект:

введите здесь описание изображения


person erik    schedule 04.02.2014    source источник


Ответы (2)


Итак, после поиска ответа по всему миру и почти отказавшись от этой ссылки наконец помогло

вот окончательный рабочий код:

 public HttpResponse invokeXAUTHPOSTService(String url, String token, File file) {

    client = new DefaultHttpClient();

    HttpPost request = new HttpPost(url);

    HttpResponse response = null;

    DRPContentForUpload content = new DRPContentForUpload(file);
    String jsonObject = DRPJSONConverter.toJson(content);
    String BOUNDARY= "--eriksboundry--";

    request.setHeader("Content-Type", "multipart/form-data; boundary="+BOUNDARY);
    request.addHeader("X-AUTHORIZATION",token);
    MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,BOUNDARY,Charset.defaultCharset());
    try {


        entity.addPart("file01", new StringBody(jsonObject));

        entity.addPart("file01", new FileBody(file));

        request.addHeader("Accept-Encoding", "gzip, deflate");

    } catch (UnsupportedEncodingException e) {
        Log.v("encoding exception","E::: "+e);
        e.printStackTrace();
    }
    request.setHeader("Accept", "application/json");
    request.setHeader("Content-Type", "multipart/form-data; boundary="+BOUNDARY);
    request.setEntity(entity);

    try {




        response = client.execute(request);



    } catch (ClientProtocolException e) {

        e.printStackTrace();
    } catch (IOException e) {

        e.printStackTrace();
    }


    return response;

}
person erik    schedule 07.02.2014
comment
Вы также можете использовать официальный порт httpclient для Android https://hc.apache.org/httpcomponents-client-4.3.x/android-port.html - person Octavian; 11.11.2014
comment
для чего ГРАНИЦА? - person backslashN; 06.06.2017

Проблема в том, что MIME-тип для вашего изображения не установлен должным образом? Попробуйте использовать альтернативный конструктор для FileBody:

FormBodyPart part2 = new FormBodyPart("file01", new FileBody(file, "image/jpeg"));

Давать обеим частям составного запроса одно и то же имя немного подозрительно, но, похоже, это не вызывает у вас проблем.

Если вы хотите увидеть, как выглядит ваше тело перед отправкой, попробуйте использовать EntityUtils.toString(Entity) в объекте, состоящем из нескольких частей, после добавления всех элементов. Изображение просто двоичное, поэтому не будет хорошо печататься, но заголовки должны быть читаемыми.

person antonyt    schedule 07.02.2014