2017-02-15 6 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 Monitor」で正しい返信が表示されます。しかし、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); 

私のインターフェイスメソッドを追加すること

更新 私は、サーバーからのコードスニペットの一部を得ることができました。バックエンドがJSON形式のデータであなたを返信しない

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

ポスト 'MyResponseModel'を。おそらくそれは正しい形式ではありません。 – azizbekian

+0

サーバ(JSONデータ)から返されたキー値のペアがないので空です。クラス内に文字列変数を定義する必要がありますか? – Android

+0

*私の問題はかなり具体的です*どのようにそうですか?これらの問題はすべて同じです:jsonデータはコンバータが期待したものではありません。 gsonコンバーターが唯一の有効なjsonを見つけられない(可能ですが) –

答えて

0

ので、カスタムコンバータとそれを処理する必要があります。これは彼らの応答がどのように見えるかです。

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インスタンスごとに1つのコンバータを持つことができます。動的に変更することはできません。異なるコンバータを使用する場合は、そのコンバータを使用して異なるRetrofitインスタンスを初期化する必要があります。 – azizbekian

+0

私は輸入に問題があります。これらのクラスは改造に属していますか? 'retrofit2.Converter; import 'のようなパッケージ – Android

関連する問題