2017-02-15 27 views
0

У меня есть перекрестная проверка большого количества ссылок, прежде чем задавать вопрос. Как и большинство людей, я звоню в веб-службу и получаю вышеуказанный результат. Моя проблема заключается в гораздо более конкретно, поэтому, прежде чем просить позвольте мне добавить мой 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); 
    } 

Пожалуйста, игнорируйте переводчика. Это мой класс генератора услуг, через который вызывается весь веб-сервис. Я вызываю метод POST, который возвращает мне простой ответ.

Я могу видеть свой правильный ответ в «Android Monitor». Но когда он проходит через JsonConverterFactory, он дает мне ошибку выше. Одна вещь, которую я точно знаю, что веб-служба возвращает простой текстовый ответ, поскольку нет ничего конкретного для возврата в приложение. Есть ли способ, с помощью которого я могу преобразовать свой текстовый ответ в класс. Пожалуйста, откликните, если я пропущу что-нибудь.

добавления Кроме того, мой метод интерфейса

@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); 

Update мне удалось получить часть фрагмента кода с сервера. Это то, что их реакция выглядит следующим образом:

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 с этими преобразователями. – azizbekian

+0

У меня проблема с импортом. Являются ли эти классы пригодными для модернизации? Пакет как 'import retrofit2.Converter;' – Android