2016-11-10 4 views
3

У меня есть настройка OkHttpClient и успешная отправка запроса GET на сервер. А также я смог отправить запрос POST на сервер с пустым тегом body.Отправка тела JSON через запрос POST в OKhttp в Android

Теперь я пытаюсь отправить следующий объект JSON на сервер.

{ 
"title": "Mr.", 
"first_name":"Nifras", 
"last_name": "", 
"email": "[email protected]", 
"contact_number": "75832366", 
"billing_address": "", 
"connected_via":"Application" 
} 

Для этого я пытаюсь добавления библиотеки классов OkHttpClient RequestBody, но я не посылая объект JSON в теле запроса HTTP POST. Следующим образом я пытаюсь создать тело и обработать почтовый запрос.

OkHttpClient client = new OkHttpClient(); 

    RequestBody body = new RequestBody() { 
     @Override 
     public MediaType contentType() { 
      return ApplicationContants.JSON; 
     } 

     @Override 
     public void writeTo(BufferedSink sink) throws IOException { 
       // This is the place to add json I thought. But How could i do this 
     } 
    }; 

    Request request = new Request.Builder() 
      .url(ApplicationContants.BASE_URL + ApplicationContants.CUSTOMER_URL) 
      .post(body) 
      .build(); 

Каким образом я отправляю объект JSON на сервер через запрос POST.

Заранее спасибо.

+1

Вы могли бы просто использовать очень популярную библиотеку дооснащения для этого. Используя его, вам нужно просто создать класс POJO с полями, представляющими поля JSON, и отправить его как Тело запроса. –

ответ

3

Попробуйте

Добавить Gradle зависит compile 'com.squareup.okhttp3:okhttp:3.2.0'

public static JSONObject foo(String url, JSONObject json) { 
     JSONObject jsonObjectResp = null; 

     try { 

      MediaType JSON = MediaType.parse("application/json; charset=utf-8"); 
      OkHttpClient client = new OkHttpClient(); 

      okhttp3.RequestBody body = RequestBody.create(JSON, json.toString()); 
      okhttp3.Request request = new okhttp3.Request.Builder() 
        .url(url) 
        .post(body) 
        .build(); 

      okhttp3.Response response = client.newCall(request).execute(); 

      String networkResp = response.body().string(); 
      if (!networkResp.isEmpty()) { 
       jsonObjectResp = parseJSONStringToJSONObject(networkResp); 
      } 
     } catch (Exception ex) { 
      String err = String.format("{\"result\":\"false\",\"error\":\"%s\"}", ex.getMessage()); 
      jsonObjectResp = parseJSONStringToJSONObject(err); 
     } 

     return jsonObjectResp; 
    } 

Анализировать Response

private static JSONObject parseJSONStringToJSONObject(final String strr) { 

    JSONObject response = null; 
    try { 
     response = new JSONObject(strr); 
    } catch (Exception ex) { 
     // Log.e("Could not parse malformed JSON: \"" + json + "\""); 
     try { 
      response = new JSONObject(); 
      response.put("result", "failed"); 
      response.put("data", strr); 
      response.put("error", ex.getMessage()); 
     } catch (Exception exx) { 
     } 
    } 
    return response; 
} 
+0

Спасибо, друг. Это работает. :) +1 – nifCody

+0

Рад, что это помогло :) – young

1

Просто сделай это:

@Override 
public void writeTo(BufferedSink sink) throws IOException { 
    sink.writeUtf8(yourJsonString); 
} 

И это должно работать нормально :-) Если я правильно понял документацию правильно, sink представляет собой контейнер, в который можно записать данные, которые вы хотите отправить. Метод writeUtf8 является удобством для превращения String в байты с использованием кодировки UTF-8.

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