2016-06-12 2 views
1

В моем приложении для Android я использую волейбол Google для сетевых операций. Существует случай, когда мне нужно сделать запрос, но отправить тело как данные формы. Я пробовал все остальное, но я не могу сделать запрос как данные формы.Android: отправка форм-данных как органа Google Volley

Вот завиток

curl -X POST -H "Content-Type: multipart/form-data" -F "mobile_number=<XXXX>" "<server_url>" 

Как я могу достичь этой -F участия в залпе? Сервер бросает плохой запрос.

Это то, что я сделал:

final JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST, URLFactory.OTP_URL, 
       null, listener, errorListener){ 

      @Override 
      public byte[] getBody() { 
       final JSONObject jsonObject = new JSONObject(); 
       try { 
        jsonObject.put("mobile_number", mobileNumber); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
        return null; 
       } 
       return jsonObject.toString().getBytes(); 
      } 


      @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 
       final HashMap<String, String> headers = new HashMap<>(); 
       headers.put("Content-Type", "multipart/form-data"); 
       return headers; 
      } 
     }; 

Пожалуйста, помогите мне в этом.

+0

Вы читали http://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-httpentity?lq=1 ye т? – BNK

ответ

1

Это можно сделать в залпе, создав почтовый ящик самостоятельно. Пожалуйста, ознакомьтесь с приведенным ниже кодом.

Код для создания тела:

private String createPostBody(Map<String, String> params) { 
     StringBuilder sbPost = new StringBuilder(); 
     for (String key : params.keySet()) { 
       if (params.get(key) != null) { 
        sbPost.append("\r\n" + "--" + BOUNDARY + "\r\n"); 
        sbPost.append("Content-Disposition: form-data; name=\"" + key + "\"" + "\r\n\r\n"); 
        sbPost.append(params.get(key)); 
       } 
      } 

     return sbPost.toString(); 
    } 

доработанной getBody) (код:

@Override 
      public byte[] getBody() { 
       Map<String,String> params = new HashMap<>(); 
       params.add("mobile_number", mobileNumber); 
       String postBody = createPostBody(params); 

       return postBody.getBytes(); 
      } 

Вам нужно будет изменить getHeaders, а также сообщить серверу, что вы граница:

@Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 
       final HashMap<String, String> headers = new HashMap<>(); 
       headers.put("Content-Type", "multipart/form-data;boundary=" + BOUNDARY;); 
       return headers; 
      } 
+0

Что такое граница? sbPost.append ("\ r \ n" + "-" + GRUNDARY + "\ r \ n"); – Kaustubh

+0

Эта строка используется сервером для разделения различных параметров, полученных в теле сообщения. Вы можете ссылаться на приведенную ниже ссылку: http://stackoverflow.com/questions/3508338/what-is-the-boundary-in-multipart-form-data –

+0

Я также добавил функцию getHeader(). Вы можете определить любую строку как границу. Напр. private static final String BOUNDARY = "s2retfgsGSRFsERFGHfg"; –

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