2017-02-15 178 views
0

在實際詢問問題之前,我已經交叉檢查了很多參考。正如大多數人所說,我正在調用Web服務並獲得上述結果。我的問題是,而更具體的,所以之前問我要補充我code snippet

public static WebService getRestService(String newApiBaseUrl, String accessToken) 
    { 
     OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 


     if (BuildConfig.DEBUG) { 
      HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
      logging.setLevel(HttpLoggingInterceptor.Level.BODY); 
      httpClient.addInterceptor(logging); 
     } 


     Gson gson = new GsonBuilder() 
       .setLenient() 
       .create(); 

     restBuilder = new Retrofit.Builder() 
       .baseUrl(newApiBaseUrl) 
       .client(httpClient.build()) 
       .addConverterFactory(GsonConverterFactory.create(gson)); 

     if (accessToken != null) { 
      AuthenticationInterceptor interceptor = 
        new AuthenticationInterceptor(accessToken); 

      if (!httpClient.interceptors().contains(interceptor)) { 
       httpClient.addInterceptor(interceptor); 

       restBuilder.client(httpClient.build()); 
      } 
     } 

     retrofit = restBuilder.build(); 
     return retrofit.create(WebService.class); 
    } 

請忽略的解釋。這是我的服務生成器類,通過它調用所有的Web服務。我正在調用一個POST方法,它會返回一個簡單的響應。

我可以在「Android監視器」中看到我的正確答案。但是當它通過JsonConverterFactory時,它給了我上面的錯誤。有一件事我確定Web服務正在返回一個簡單的文本響應,因爲沒有具體的東西返回到應用程序。有沒有一種方法可以將我的文本回復轉換爲類。如果我遺漏了任何東西,請免費回覆。

也增加了我的接口方法

@Headers({ 
      Constants.ApiHeader.CONTENT_TYPE_JSON 
    }) 

    @POST("POST_URL/{number}") 
    Call<MyResponseModel> getActualProductLocation(@Header("access_token") String accessToken, @Path("number") String number, @Body List<MyRequestModel> body); 

更新 我設法從服務器的代碼片段的一部分。這是他們的反應是什麼樣子:

Response.status(200).entity("Response Success").build() 
+0

帖子'MyResponseModel'。最有可能的是它的格式不正確。 – azizbekian

+0

它是空的,因爲服務器沒有返回鍵值對(JSON數據)。我必須在類中定義任何字符串變量嗎? – Android

+0

*我的問題更具體*如何?這些問題都是一樣的:json數據不是轉換器的預期。這是可能的gson轉換器不會找到一個單獨的字符串有效的json(它是,雖然) –

回答

0

因爲後端不與JSON格式的數據回覆你,你有一個自定義的轉換器來處理它。

Here's自定義轉換器的一個例子,可以滿足您的需求。

一個片段StringConverterFactory.java

... 
private static class StringConverter implements Converter<String> { 
    private static final MediaType PLAIN_TEXT = MediaType.parse("text/plain; charset=UTF-8"); 

    @Override 
    public String fromBody(ResponseBody body) throws IOException { 
     return new String(body.bytes()); 
    } 

    @Override 
    public RequestBody toBody(String value) { 
     return RequestBody.create(PLAIN_TEXT, convertToBytes(value)); 
    } 

    private static byte[] convertToBytes(String string) { 
     try { 
      return string.getBytes("UTF-8"); 
     } catch (UnsupportedEncodingException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
... 

,然後創建您的Retrofit時:

Retrofit retrofit = new Retrofit.Builder() 
    ... 
    .addConverterFactory(StringConverterFactory.create()); 
    ... 
    .build(); 
+0

嘿,感謝哥們,我會試試看。我有一個問題。如果我開始使用自定義轉換器,我認爲我仍然可以使用我的通用轉換器,並且它不會干擾我現有的轉換器。是對的嗎? – Android

+0

每個Retrofit實例可以有一個轉換器。你不能動態改變它們。如果你想有不同的轉換器,你必須用這個轉換器初始化不同的Retrofit實例。 – azizbekian

+0

我有進口問題。這些課程是否屬於改造? Package like'import retrofit2.Converter;' – Android

相關問題