2016-02-12 1 views
1

я обновлял Дооснащение использовать Retrofit2, и я уже успел много вещей GET, POST, PUT ...Retrofit2 Сообщение тело, как Json

Но я имел просьбу о том, что я должен послать весь JSON Мне удалось это сделать в Retrofit 1.9, но в Retrofit2 нет поддержки.

import retrofit.mime.TypedString; 

public class TypedJsonString extends TypedString { 
    public TypedJsonString(String body) { 
     super(body); 
    } 

    @Override 
    public String mimeType() { 
     return "application/json"; 
    } 
} 

Как сделать retrofit2?

ответ

4

Я Исправлена ​​проблема со следующим кодом

public interface LeadApi { 
    @Headers("Content-Type: application/json") 
    @POST("route") 
    Call<JsonElement> add(@Body JsonObject body); 
} 

Обратите внимание на разницу я использую Gson JSONObject. А при создании адаптера я использую конвертер GSON.

import okhttp3.OkHttpClient; 
import okhttp3.logging.HttpLoggingInterceptor; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

public class APIAdapter { 
    public static final String BASE_URL = "BaseURL"; 

    private static Retrofit restAdapter; 
    private static APIAdapter instance; 

    protected APIAdapter() { 
     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
     OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); 
     restAdapter = new Retrofit.Builder().baseUrl(BASE_URL).client(client).addConverterFactory(GsonConverterFactory.create()).build(); 
    } 

    public static APIAdapter getInstance() { 
     if (instance == null) { 
      instance = new APIAdapter(); 
     } 
     return instance; 
    } 

    public Object createService(Class className) { 
     return restAdapter.create(className); 
    } 

} 

Позаботьтесь о том, чтобы иметь такую ​​же модификацию версии и ее покрытие. Это приводит к ошибкам!

+1

Пропущенный вы показываете, как вы называете метод добавления. –

+0

не понимаю, почему он получил downvoted, но это defn works – Sree

5

Вы можете буквально заставить заголовок быть application/json (как вы сделали) и отправить его в виде строки ...

..

Call call = myService.postSomething(
    RequestBody.create(MediaType.parse("application/json"), jsonObject.toString())); 
call.enqueue(...) 

Тогда ..

interface MyService { 
    @GET("/someEndpoint/") 
    Call<ResponseBody> postSomething(@Body RequestBody params); 
} 

Или я что-то упустил?

+0

Вы уверены, что можете использовать @ Body в качестве части запроса на сообщение в retrofit2? Я получаю красивое исключение "Caused by: java.lang.IllegalArgumentException: @ Параметры тела нельзя использовать с формой или многочастной кодировкой (параметр # 2)" –

+0

Да, абсолютно. Код, который я дал, - это мой проект, который работает. Но если вы используете аннотацию '@ Multipart', вы должны использовать аннотацию' @ Part', а также MultipartBody.Part в качестве параметра, или если вы используете '@ FormUrlEncoded', вы должны использовать Аннотации '@ Field'. – VicVu

+0

Нет, я не использую ни теги @ Multipart, ни @ Part. Я использую @body и RequestBody. С уважением –