2016-12-09 1 views
0

Помогите понять, где искать, кажется, что описание объекта правильно, xml-вход правильно, как исправить ошибку и получить данные?Retrofit2 + YII2 Rest API (org.xmlpull.v1.XmlPullParserException: Неожиданный токен)

Серверный интерфейс API YII2 для серверов, клиентское приложение для Android. Ниже - входные XML, классы моделей, код использования retrofit2.

/API/v1/книги

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <item> 
     <id>1</id> 
     <title>Test</title> 
     <description>test</description> 
     <thumbnail>1</thumbnail> 
     <path>1</path> 
    </item> 
    <item> 
     <id>2</id> 
     <title>Test 2</title> 
     <description>2</description> 
     <thumbnail>2</thumbnail> 
     <path>2</path> 
    </item> 
</response> 

Books.java

@Root (name = "response") 
public class Books { 

    @ElementList (name = "item") 
    List<Book> items; 
} 

Book.java

@Root(name = "item") 
public class Book { 

    @Element(name = "id") 
    private int id; 

    @Element(name = "title") 
    private String title; 

    @Element(name = "description") 
    private String description; 

    @Element(name = "thumbnail") 
    private String thumbnail; 

    @Element(name = "path") 
    private String path; 

} 

дооснащения использование

Retrofit retrofit = new Retrofit.Builder().baseUrl(API_PATH).client(new OkHttpClient()).addConverterFactory(SimpleXmlConverterFactory.create()) .build(); 

API sAPI = retrofit.create(API.class); 

Call<Books> call = sAPI.loadBooks(); call.enqueue(b); 

стек Ошибка

W/System.err: java.lang.RuntimeException: org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT [{"id":1,"title"[email protected]:145 in [email protected]) 
    at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:44) 
    at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:23) 
    at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:117) 
    at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211) 
    at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:106) 
    at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133) 
    at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:818) 
Caused by: org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT [{"id":1,"title"[email protected]:145 in [email protected]) 
    at org.kxml2.io.KXmlParser.next(KXmlParser.java:432) 
    at org.kxml2.io.KXmlParser.next(KXmlParser.java:313) 
    at org.simpleframework.xml.stream.PullReader.read(PullReader.java:105) 
    at org.simpleframework.xml.stream.PullReader.next(PullReader.java:89) 
    at org.simpleframework.xml.stream.NodeReader.readElement(NodeReader.java:111) 
    at org.simpleframework.xml.stream.NodeReader.readRoot(NodeReader.java:85) 
    at org.simpleframework.xml.stream.NodeBuilder.read(NodeBuilder.java:84) 
    at org.simpleframework.xml.stream.NodeBuilder.read(NodeBuilder.java:71) 
    at org.simpleframework.xml.core.Persister.read(Persister.java:562) 
    at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:36) 
    ... 9 more 
+0

Добро пожаловать в переполнение стека! Сначала вы можете взять [тур] и узнать [спросить] хороший вопрос и создать [mcve]. Это облегчает нам помощь. – Katie

ответ

0

мне так жаль. Это просто вернуть мне JSON ответ не XML (см положение: текст [{ «ID»: 1, "название).. Так что просто нужно использовать GsonConverterFactory, не SimpleXmlConverterFactory

Я должен был читать другие вопросы по StackOverflow более тщательно.

0

Вы должны указать тип содержимого ответа (XML или JSON) в заголовке, так что ваш интерфейс будет более или менее как этот

общедоступный интерфейс ApiClient {

@GET("/books") 
@Headers({"Content-Type: application/xml", "Accept: application/xml"}) 
Call<Books> loadBooks(); 

}