http解析异常阿波罗Graphql
Posted
技术标签:
【中文标题】http解析异常阿波罗Graphql【英文标题】:http parse exception apollo Graphql 【发布时间】:2019-02-09 13:21:09 【问题描述】:我在使用 Apollo GraphQL Client for android 时遇到 http 解析异常,但在使用 HttpLoggingInterceptor 进行调试时,我可以看到状态码为 200 的 json 数据
有人解决过这个问题吗?
下面是调用graphql查询的方法
private void getData()
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build();
ApolloClient apolloClient = ApolloClient.builder()
.serverUrl(UrlUtils.GRAPHQL_URL)
.okHttpClient(httpClient)
.build();
apolloClient.query(DataQuery.builder().updated_at("0").build())
.enqueue(new ApolloCall.Callback<DataQuery.Data>()
@Override
public void onResponse(@Nonnull Response<DataQuery.Data> response)
Log.d(Utils.CYBERBYTES_LOG,response.data().cyberNews().toString());
@Override
public void onFailure(@Nonnull ApolloException e)
Log.d(Utils.CYBERBYTES_LOG,"Exception "+e.toString());
);
下面是apollo客户端使用的graphql查询
query DataQuery($updated_at: String!)
cyberNews (updated_at:$updated_at)
_id
heading
description
image
created_at
cyberAlerts(updated_at:$updated_at)
_id
title
description
created_at
afnetSecurity(updated_at:$updated_at)
_id
heading
description
image
created_at
internetSecurity(updated_at:$updated_at)
_id
heading
description
image
created_at
cyberToons(updated_at:$updated_at)
_id
title
video
image
created_at
cyberCases(updated_at:$updated_at)
_id
title
file
created_at
certContacts(updated_at:$updated_at)
_id
details
created_at
OnFailure 回调被调用,我得到 http
ApolloParseException: Failed to parse http response
但我可以在 HttpLoggingInterceptor
中看到所需的 json 数据我正在使用依赖com.apollographql.apollo:apollo-runtime:1.0.0-alpha2
Logcat
09-05 09:31:23.594 6611-6611/cert.iaf.in.certindia D/CERTBYTES_LOG: Before Network Check
09-05 09:31:23.604 6611-6611/cert.iaf.in.certindia D/CERTBYTES_LOG: Get Graphql data
URL: http://172.20.10.4:3000/graphql
09-05 09:31:23.744 6611-6611/cert.iaf.in.certindia D/ViewRootImpl: #1 mView = com.android.internal.policy.PhoneWindow$DecorViewf3d4712 I.E...... R.....ID 0,0-0,0
09-05 09:31:23.754 1682-2188/? D/ActivityManager: post active user change for 0 fullscreen true isFloatingActivity() false isHomeActivity() false
09-05 09:31:23.754 1682-2188/? D/KnoxTimeoutHandler: postActiveUserChange [MsgParam] userId: 0 fullscreen is true showWhenlocked is false
09-05 09:31:23.754 1682-1682/? D/KnoxTimeoutHandler: handleActiveUserChange [MsgParam] userId: 0 fullscreen is true showWhenlocked is false
09-05 09:31:23.754 1682-1682/? I/KnoxTimeoutHandler: Shared devices show user statefalse
09-05 09:31:23.774 6611-6611/cert.iaf.in.certindia D/ViewRootImpl: #3 mView = null
09-05 09:31:23.794 340-340/? I/SurfaceFlinger: id=622 createSurf (720x1280),1 flag=404, Eashboard
09-05 09:31:23.794 1682-1866/? D/StatusBarManagerService: manageDisableList userId=0 what=0x0 pkg=Window5c546c6 u0 d0 p6611 cert.iaf.in.certindia/cert.iaf.in.certbytes.Dashboard
09-05 09:31:23.794 6611-6717/cert.iaf.in.certindia D/OkHttp: --> POST http://172.20.10.4:3000/graphql http/1.1
Content-Type: application/json; charset=utf-8
Content-Length: 817
Accept: application/json
CONTENT_TYPE: application/json
X-APOLLO-OPERATION-ID: f11eba08c2592c446cbb82aa6661d864281fc50492d38f76bd5a34d4356816ce
X-APOLLO-CACHE-KEY: baf6df501ed2bf2484141c8b0754e110
X-APOLLO-CACHE-FETCH-STRATEGY: NETWORK_ONLY
X-APOLLO-EXPIRE-TIMEOUT: 0
X-APOLLO-EXPIRE-AFTER-READ: false
X-APOLLO-PREFETCH: false
"query":"query DataQuery($updated_at: String!) cyberNews(updated_at: $updated_at) __typename _id heading description image created_at cyberAlerts(updated_at: $updated_at) __typename _id title description created_at afnetSecurity(updated_at: $updated_at) __typename _id heading description image created_at internetSecurity(updated_at: $updated_at) __typename _id heading description image created_at cyberToons(updated_at: $updated_at) __typename _id title video image created_at cyberCases(updated_at: $updated_at) __typename _id title file created_at certContacts(updated_at: $updated_at) __typename _id details created_at ","variables":"updated_at":"0"
--> END POST (817-byte body)
09-05 09:31:23.794 1682-3117/? D/InputDispatcher: Focus entered window: 6611
09-05 09:31:23.794 1682-1944/? D/PointerIcon: setMouseIconStyle1 pointerType: 1001 iconType:101 flag:0 pid:1682 uid:1000
setMouseCustomIcon IconType is same.101
09-05 09:31:23.814 6611-6611/cert.iaf.in.certindia D/TextView: setTypeface with style : 0
09-05 09:31:23.834 6611-6611/cert.iaf.in.certindia D/TextView: setTypeface with style : 0
09-05 09:31:23.854 6611-6611/cert.iaf.in.certindia D/TextView: setTypeface with style : 0
09-05 09:31:23.864 6611-6611/cert.iaf.in.certindia D/TextView: setTypeface with style : 0
09-05 09:31:23.884 6611-6611/cert.iaf.in.certindia D/TextView: setTypeface with style : 0
09-05 09:31:23.904 6611-6611/cert.iaf.in.certindia D/TextView: setTypeface with style : 0
09-05 09:31:23.914 6611-6611/cert.iaf.in.certindia D/TextView: setTypeface with style : 0
09-05 09:31:23.934 6611-6717/cert.iaf.in.certindia D/OkHttp: <-- 200 OK http://172.20.10.4:3000/graphql (135ms)
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 9314
Date: Wed, 05 Sep 2018 04:03:22 GMT
Connection: keep-alive
"data":
"cyberNews": [
"__typename": "CyberNewsType",
"_id": "5b8a6b1d4f06125bb5a6f5d2",
"heading": "China Probes Suspected Customer Data Leak at Accor Partner",
"description": "<p><strong>Shanghai police said they were investigating a suspected data leak at NASDAQ-listed Chinese hotelier Huazhu Group, the local partner of France-based AccorHotels.</strong></p><p>Huazhu, one of China’s biggest hoteliers, released a statement on Tuesday saying it had alerted police to reports that the company's internal data was being sold online, asking them to investigate.</p><p>Chinese media reports said the data included guest membership information, personal IDs, check-in records, guest names, mobile numbers, and emails.</p><p>Police in Shanghai said in a statement that they were looking into the case.</p><p>Huazhu's website said it operates more than 3,000 hotels in more than 370 cities in China, including the AccorHotels brands Ibis and Mercure.</p><p>Shanghai-based Huazhu formed a long-term alliance with Accor in 2014 to help the French hotel group develop the Chinese market.</p><p>Huazhu said the release of the data had caused a "vicious impact", without giving specifics, and that it was conducting an internal investigation.</p><p>The sale of personal information is common in China, which last year implemented a controversial cybersecurity law that requires services to store user data in China and receive approval from users before sharing their details.</p><p>Chinese e-commerce giant Alibaba came under fire earlier this year over its handling of user data in an episode that underscores growing concerns for privacy in the hyper-digitised country.</p><p>Alibaba's online-payments affiliate Ant Financial was forced to apologise after users said they felt misled into allowing its Alipay service to share data on their spending habits with Ant's credit-scoring arm and other third-party services. </p>",
"image": "uploads/1535798045242e9605ae60342d5e2_index.png",
"created_at": "1535798045247"
,
"__typename": "CyberNewsType",
"_id": "5b5c2f36de3ff51e915747fe",
"heading": "Cyber News Heading",
"description": "Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of \"de Finibus Bonorum et Malorum\" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", comes from a line in section 1.10.32.",
"image": "uploads/1532768053982490b1c26e07fa274_Screenshot (4).png",
"created_at": "1532768054007"
],
"cyberAlerts": [
"__typename": "CyberAlertsType",
"_id": "5b8a6b3a4f06125bb5a6f5d3",
"title": "Cyber Alert Heading",
"description": "<p><strong>Shanghai police said they were investigating a suspected data leak at NASDAQ-listed Chinese hotelier Huazhu Group, the local partner of France-based AccorHotels.</strong></p><p>Huazhu, one of China’s biggest hoteliers, released a statement on Tuesday saying it had alerted police to reports that the company's internal data was being sold online, asking them to investigate.</p><p>Chinese media reports said the data included guest membership information, personal IDs, check-in records, guest names, mobile numbers, and emails.</p><p>Police in Shanghai said in a statement that they were looking into the case.</p><p>Huazhu's website said it operates more than 3,000 hotels in more than 370 cities in China, including the AccorHotels brands Ibis and Mercure.</p><p>Shanghai-based Huazhu formed a long-term alliance with Accor in 2014 to help the French hotel group develop the Chinese market.</p><p>Huazhu said the release of the data had caused a "vicious impact", without giving specifics, and that it was conducting an internal investigation.</p><p>The sale of personal information is common in China, which last year implemented a controversial cybersecurity law that requires services to store user data in China and receive approval from users before sharing their details.</p><p>Chinese e-commerce giant Alibaba came under fire earlier this year over its handling of user data in an episode that underscores growing concerns for privacy in the hyper-digitised country.</p><p>Alibaba's online-payments affiliate Ant Financial was forced to apologise after users said they felt misled into allowing its Alipay service to share data on their spending habits with Ant's credit-scoring arm and other third-party services. </p>",
"created_at": "1535798074788"
,
"__typename": "CyberAlertsType",
"_id": "5b5e0e524612f1737cafeaab",
09-05 09:31:23.934 6611-6611/cert.iaf.in.certindia D/TextView: setTypeface with style : 0
09-05 09:31:23.934 6611-6717/cert.iaf.in.certindia D/OkHttp: "title": "Be aware of Phishing pages",
"description": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum",
"created_at": "1532890706911"
],
"afnetSecurity": [
"__typename": "AfnetSecurityType",
"_id": "5b5c425d1cdad99c399c84a6",
"heading": "Afnet Security Testing",
"description": "Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of \"de Finibus Bonorum et Malorum\" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", comes from a line in section 1.10.32.",
"image": "uploads/15327729576983cdcd3b863b54b4f_Screenshot (3).png",
"created_at": "1532772957719"
],
"internetSecurity": [
"__typename": "InternetSecurityType",
"_id": "5b5c482e1cdad99c399c84a8",
"heading": "Internet Security Testing",
"description": "There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn't anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.",
"image": "uploads/1532774446246d203aa8afc24e770_Screenshot (10).png",
"created_at": "1532774446254"
],
"cyberToons": [
"__typename": "CyberToonsType",
"_id": "5b5c5b3b5624757982aae048",
"title": "Be aware of Phishing pages",
"video": "uploads/1532779323030a469ad9a7f53d998_Be aware of Phishing pages.mp4",
"image": "uploads/thumbnail/15327793235337957e79e737b91ec.png",
"created_at": "1532779323536"
],
"cyberCases": [
"__typename": "CyberCasesType",
"_id": "5b5f5d8360ebc53f71cfcfc6",
"title": "test upload",
"file": "uploads/153297651592529844c7d8b483929_MP_Plan_1000491466_2018071_.pdf",
"created_at": "1532976515931"
,
"__typename": "CyberCasesType",
"_id": "5b3902f811f5243e247e0c83",
"title": "This is Test Cyber Case uploaded for Test Purpose",
"file": "uploads\\1530462968944dc63c6005a6a13c4_test.pdf",
"created_at": "1530462968949"
],
"certContacts": [
"__typename": "CertContactsType",
"_id": "5b5e0f0ef5a98e8174db2c3e",
"details": "445 Mount Eden Road, \nMount Eden, \nAuckland.",
"created_at": "1532890894547"
]
<-- END HTTP (9314-byte body)
09-05 09:31:23.984 6611-6717/cert.iaf.in.certindia D/CERTBYTES_LOG: On Exception
com.apollographql.apollo.exception.ApolloParseException: Failed to parse http response
09-05 09:31:23.984 6611-6611/cert.iaf.in.certindia D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 48 - 0, 0) vi=Rect(0, 48 - 0, 0) or=1
09-05 09:31:23.984 1682-3113/? D/InputMethodManagerService: windowGainedFocus mCurrentFocusedUserId - 0 and mSecureKeypadEnabled-false
09-05 09:31:23.994 1682-1944/? D/KnoxTimeoutHandler: notifyActivityDrawn [MsgParam] userId: 0 fullscreen is true showWhenlocked is false
09-05 09:31:23.994 1682-1682/? D/KnoxTimeoutHandler: activityDrawn [MsgParam] userId: 0 fullscreen is true showWhenlocked is false
09-05 09:31:23.994 1682-1944/? I/ActivityManager: Displayed cert.iaf.in.certindia/cert.iaf.in.certbytes.Dashboard: +642ms
全栈跟踪
09-07 21:23:09.032 20812-21143/cert.iaf.in.certindia W/System.err: com.apollographql.apollo.exception.ApolloParseException: Failed to parse http response
at com.apollographql.apollo.internal.interceptor.ApolloParseInterceptor.parse(ApolloParseInterceptor.java:101)
at com.apollographql.apollo.internal.interceptor.ApolloParseInterceptor.access$100(ApolloParseInterceptor.java:28)
at com.apollographql.apollo.internal.interceptor.ApolloParseInterceptor$1.onResponse(ApolloParseInterceptor.java:53)
at com.apollographql.apollo.internal.interceptor.ApolloServerInterceptor$1$1.onResponse(ApolloServerInterceptor.java:93)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:153)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalArgumentException: Can't map GraphQL type: ObjectId to: class java.lang.Object. Did you forget to add custom type adapter?
at com.apollographql.apollo.internal.response.ScalarTypeAdapters.adapterFor(ScalarTypeAdapters.java:30)
at com.apollographql.apollo.internal.response.RealResponseReader.readCustomType(RealResponseReader.java:187)
at cert.iaf.in.certbytes.CertbytesQuery$Cybernews$Mapper.map(CertbytesQuery.java:339)
at cert.iaf.in.certbytes.CertbytesQuery$Data$Mapper$1$1.read(CertbytesQuery.java:221)
at cert.iaf.in.certbytes.CertbytesQuery$Data$Mapper$1$1.read(CertbytesQuery.java:218)
at com.apollographql.apollo.internal.response.RealResponseReader$ListItemReader.readObject(RealResponseReader.java:306)
at cert.iaf.in.certbytes.CertbytesQuery$Data$Mapper$1.read(CertbytesQuery.java:218)
at cert.iaf.in.certbytes.CertbytesQuery$Data$Mapper$1.read(CertbytesQuery.java:215)
at com.apollographql.apollo.internal.response.RealResponseReader.readList(RealResponseReader.java:163)
at cert.iaf.in.certbytes.CertbytesQuery$Data$Mapper.map(CertbytesQuery.java:215)
at cert.iaf.in.certbytes.CertbytesQuery$Data$Mapper.map(CertbytesQuery.java:210)
at com.apollographql.apollo.internal.response.OperationResponseParser$1.read(OperationResponseParser.java:56)
at com.apollographql.apollo.internal.json.ResponseJsonStreamReader.nextObject(ResponseJsonStreamReader.java:86)
at com.apollographql.apollo.internal.response.OperationResponseParser.parse(OperationResponseParser.java:51)
at com.apollographql.apollo.internal.interceptor.ApolloParseInterceptor.parse(ApolloParseInterceptor.java:87)
【问题讨论】:
你能展示你的代码吗? 你应该提供一些代码来帮助你。 我在上面添加了代码和graphql查询 我已经添加了logcat。 你能帮帮我吗? 【参考方案1】:原因:java.lang.IllegalArgumentException:无法将 GraphQL 类型:ObjectId 映射到:类 java.lang.Object。您忘记添加自定义类型适配器了吗?
我有同样的错误,只是我的GraphQL type
不同。解决此问题的方法是向您的 ApolloClient 添加CustomTypeAdapter
,例如
-
在您的
app/build.gradle
中定义映射
apollo
customTypeMapping = [
//or java.lang.Long
"ObjectId" : "java.lang.Integer"
]
-
创建一个 CustomTypeAdapter 并将其添加到您的 ApolloClient
objectIDCustomTypeAdapter = new CustomTypeAdapter<Integer>()
@Override public Integer decode(CustomTypeValue value)
try
return Integer.parseInt(value.toString());
catch (Exception e) //NumberFormatException
e.printStackTrace()
@Override public CustomTypeValue encode(Integer value)
//assumption; I am not sure about the `Number` part
return new CustomTypeValue.GraphQLNumber(value);
;
ApolloClient.builder()
.serverUrl(serverUrl)
.okHttpClient(okHttpClient)
//ObjectId changes to all caps
.addCustomTypeAdapter(CustomType.OBJECTID, objectIDCustomTypeAdapter)
.build();
来源(& 了解更多信息):apollo graphql android docs
【讨论】:
以上是关于http解析异常阿波罗Graphql的主要内容,如果未能解决你的问题,请参考以下文章
在查询中找到 @client 指令,但未指定 ApolloClient 解析器