首页 > 解决方案 > 为什么 Retrofit GraphQL 查询因意外字符“M”预期“}”而失败?

问题描述

我正在尝试对GraphQLSWAPI 端点执行查询

https://api.graphcms.com/simple/v1/swapi

使用改造

我的改造 API 类似于

@Headers("Content-Type: application/json")
@POST("swapi")
Single<Response<String>> query(@Body final String query);

我的改造服务

public class StarWarsService extends BaseService implements StarWarsApi {

    private static final String BASE_URL = "https://api.graphcms.com/simple/v1/";
    private static final StarWarsApi INSTANCE = new StarWarsService();

    /**
     * 
     * @return
     */
    public static StarWarsApi instance() {
        return INSTANCE;
    }

    private final StarWarsApi service;

    /**
     * 
     */
    private StarWarsService() {
        final Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(okHttpClient)
                .addCallAdapterFactory(Java8CallAdapterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(ScalarsConverterFactory.create()).build();

        service = retrofit.create(StarWarsApi.class);
    }

    @Override
    public Single<Response<String>> query(String query) {
        return service.query(query);
    }
}

我的主要方法

private static final String QUERY_STAR_WARS_0001 = "{ \"query\": \"{Starship(name:\"Millennium Falcon\") { name, hyperdriveRating,  pilots(orderBy: height_DESC) { name, height, homeworld {name} } }}\"  }";   

public static void main(String[] args) {        
    StarWarsService.instance().query(QUERY_STAR_WARS_0001).subscribe();     

}

我得到以下日志

Sep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO: --> POST https://api.graphcms.com/simple/v1/swapi
Sep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO: Content-Type: application/json
Sep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO: Content-Length: 145
aSep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO: 
Sep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO: { "query": "{Starship(name:"Millennium Falcon") { name, hyperdriveRating,  pilots(orderBy: height_DESC) { name, height, homeworld {name} } }}"  }
Sep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO: --> END POST (145-byte body)
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: <-- 400 https://api.graphcms.com/simple/v1/swapi (325ms)
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: content-type: text/plain; charset=UTF-8
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: content-length: 291
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: date: Wed, 19 Sep 2018 14:54:39 GMT
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: server: akka-http/10.0.8
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: via: 1.1 cd9298825de9a9f64f66b3bc944bdd09.cloudfront.net (CloudFront), 1.1 3965285cac2a9323992ecbe26f94d453.cloudfront.net (CloudFront)
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: x-cache: Error from cloudfront
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: x-amz-cf-id: u17uzCW9lF5XI0o4_7hd5OatIqZshrKTlnX0G9iZWHb3CsJ8_Hobww==
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: 
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: The request content was malformed:
Unexpected character 'M' at input index 28 (line 1, position 29), expected '}':
{ "query": "{Starship(name:"Millennium Falcon") { name, hyperdriveRating,  pilots(orderBy: height_DESC) { name, height, homeworld {name} } }}"  }
                            ^

Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: <-- END HTTP (291-byte body)

当我可以使用在线 GraphQL“浏览器”执行相同的查询时好吗?

我在代码/方法中犯了什么错误?

标签: javaretrofit2graphql

解决方案


无论生成 JSON 对象的代码都没有正确转义 json 值中的 " 字符。

{ "query": "{Starship(name:"Millennium Falcon") { name, hyperdriveRating,  pilots(orderBy: height_DESC) { name, height, homeworld {name} } }}"  }

应该

{ "query": "{Starship(name:\"Millennium Falcon\") { name, hyperdriveRating,  pilots(orderBy: height_DESC) { name, height, homeworld {name} } }}"  }

推荐阅读