代码之家  ›  专栏  ›  技术社区  ›  Hector

为什么翻新GraphQL查询失败,出现意外字符“M”expected'}'?

  •  1
  • Hector  · 技术社区  · 7 年前

    我正试图执行 GraphQL

    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)
    

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Deadron    7 年前

    任何产生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} } }}"  }