为什么翻新GraphQL查询失败,并出现预期的字符'M''}'?

时间:2018-09-19 15:06:23

标签: java retrofit2 graphql

我正尝试再次执行GraphQL查询,再次是SWAPI端点

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

使用改造

我的Retrofit 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“浏览器”执行相同的查询,确定吗?

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

1 个答案:

答案 0 :(得分:2)

无论生成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} } }}"  }