2017-02-16 3 views
0

Я запрашивает веб-службу в Android с помощью MultiPartUtility и отправлен запрос является:Multipart запрос получает код ошибки 400 ява

POST/HTTP/1.1 
connection: Keep-Alive 
enctype: multipart/form-data 
content-type: multipart/form-data;charset=UTF-8;boundary=--===1487292689114=== 
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
accept-encoding: gzip, deflate, br 
accept-language: es-419,es;q=0.8,en-GB;q=0.6,en;q=0.4 
cache-control: max-age=0 
upgrade-insecure-requests: 1 
user-agent: Dalvik/1.6.0 (Linux; U; Android 4.4.4; 5042A Build/KTU84P) 
host: 192.168.10.171:8080 
content-length: 990 
payload: ----===1487292689114=== 
Content-Disposition: form-data; name="new_id" 

171 
----===1487292689114=== 
Content-Disposition: form-data; name="file"; filename="IMG_20170216_195118.jpg" 
Content-Type: image/jpeg 
Content-Transfer-Encoding: binary 

���� 
(
----===1487292689114===-- 

Это услуга:

@POST 
    @Path("/reportNewImage") 
    @Consumes(MediaType.MULTIPART_FORM_DATA+"; charset=UTF-8") 
    @Produces(MediaType.TEXT_PLAIN) 
    public Response setImage(
      @FormDataParam("new_id") String new_id, 
      @FormDataParam("file") InputStream uploadedInputStream, 
      @FormDataParam("file") FormDataContentDisposition fileDetail, @Context HttpHeaders headers) { 
     ... 
    } 

Но я m получить то же самое error 400 Bad Requesting как раз когда соединение сделано от java android кода. Когда я делаю соединение из html-формы, результат будет успешным. Пожалуйста, помогите мне, что может быть причиной?

EDIT:

запрос, сделанный с использованием HTML формы:

POST/HTTP/1.1 
Host: example.com 
Connection: keep-alive 
Content-Length: 6564 
Cache-Control: max-age=0 
Origin: http://localhost 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/55.0.2883.87 Chrome/55.0.2883.87 Safari/537.36 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryNt8QJSIDDDgznij8 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Referer: http://localhost/form.html 
Accept-Encoding: gzip, deflate, br 
Accept-Language: es-419,es;q=0.8,en-GB;q=0.6,en;q=0.4 

------WebKitFormBoundaryNt8QJSIDDDgznij8 
Content-Disposition: form-data; name="new_id" 

109 
------WebKitFormBoundaryNt8QJSIDDDgznij8 
Content-Disposition: form-data; name="file"; filename="apple.jpg" 
Content-Type: image/jpeg 

����JFIFHH��C 
... 
        �������1s�����K�"T�I)���ti6>�d 
���� 
------WebKitFormBoundaryNt8QJSIDDDgznij8-- 

И это HttpURLConnection Android:

URL url = new URL(requestURL); 
      httpConn = (HttpURLConnection) url.openConnection(); 
      httpConn.setRequestMethod("POST"); 
      httpConn.setUseCaches(false); 
      httpConn.setDoOutput(true); // indicates POST method 
      httpConn.setDoInput(true); 
      httpConn.setRequestProperty("Content-Type", 
        "multipart/form-data; boundary=" + boundary); 
      outputStream = httpConn.getOutputStream(); 
      writer = new PrintWriter(new OutputStreamWriter(outputStream, charset), 
        true); 
writer.flush(); 
writer.close(); 
     // checks server's status code first 
     int status = httpConn.getResponseCode(); 
     if (status == HttpURLConnection.HTTP_OK) { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        httpConn.getInputStream())); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       response.append(line); 
      } 
      reader.close(); 
      httpConn.disconnect(); 
     } else { 
      throw new IOException("Server returned non-OK status: " + status); 
     } 

EDIT 2:

Я понял, что ошибка появляется только если эта строка компилируется:

httpConn.setRequestProperty("Content-Type", 
         "multipart/form-data; boundary=" + boundary); 

иначе код ошибки 415, потому что нет Content-Type заголовка определен.

+0

Что еще он сказал? Плохой запрос и никаких дополнительных данных? – efekctive

+0

Just Bad request –

+0

Можете ли вы разместить точку останова на стороне сервера? – efekctive

ответ

0

Проблема была в границе. Я нашел в документации, что граница может быть составлена ​​этой группой персонажей:

Единственный обязательный параметр для многочастного Content-Type является параметром граница, которая состоит из 1 до 70 символов из набора символы, которые, как известно, очень надежны через шлюзы электронной почты, а НЕ , заканчивающиеся пробелом. (Если граница появляется до конца с белым пространства, белое пространство должно быть предположительно было добавлено в шлюзе, и должно быть удалено.) Это формально задается следующего BNF:

границы: = 0 * 69 bcharsnospace

bchars: = bcharsnospace/""

bcharsnospace: = ЦИФРА/ALPHA/"'"/"("/")"/"+"/"_" /","/"-"/"." знак равно Reference

Тем не менее, так как я удалил "=" характер все стало работать нормально.

OLD BUNDARY: - === 1487292689114 ===

NEW ГРАНИЦЫ: --X1487292689114x

Смежные вопросы