2016-02-12 115 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); 
    } 

} 

注意有相同版本的Retrofit和它的轉換器。它導致錯誤!

+1

錯過了告訴你如何調用add方法。 –

+0

不明白爲什麼它得到downvoted,但這DEFN工作 – 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

你確定,你可以用@身體作爲下retrofit2 POST請求的一部分?我得到一個非常異常「產生的原因:java.lang.IllegalArgumentException異常:@車身參數不能與形式或多個部分組成的編碼一起使用(參數#2)。」 –

+0

是的,絕對。我給出的代碼來自我正在工作的項目。但是,如果您使用的是'@ Multipart'註解,你必須使用'@ Part'註釋以及MultipartBody.Part作爲帕拉姆,或者如果您使用的是'@ FormUrlEncoded',你必須使用'@ Field'註釋。 – VicVu

+0

不,我既不使用@ Multipart也不使用@ Part標籤。我正在使用@body和RequestBody。親切的問候 –