首页 > 解决方案 > 通过 HTTP 向 graphQL api 站点 WikiCSMoney 发送请求并在 Java 中获取 JSON 响应

问题描述

我需要向服务 WikiCsMoney 发出请求并获得 json 格式的响应。我提出了以下要求

String uri = "https://wiki.cs.money/graphql?query=query%20skin($id:%20ID!)%20{%20%20skin(id:%20$id)%20{%20%20%20%20price_trader_log%20{%20%20%20%20%20%20name%20%20%20%20%20%20values%20{%20%20%20%20%20%20%20%20price_trader_new%20%20%20%20%20%20%20%20time%20%20%20%20%20%20}%20%20%20%20}%20%20}}&operationName=skin&variables=%7B%22id%22%3A%22usp-s-torque%22%7D"

如果我通过浏览器的命令行或者通过 Postman 手动执行这个请求,那么它会返回我需要的答案。 在此处输入图像描述

我正在以适当的方式提出请求

public  String sendRequestToWiki(String PROXY_HOST) throws IOException {
        String uri = "https://wiki.cs.money/graphql?query=query%20skin($id:%20ID!)%20{%20%20skin(id:%20$id)%20{%20%20%20%20price_trader_log%20{%20%20%20%20%20%20name%20%20%20%20%20%20values%20{%20%20%20%20%20%20%20%20price_trader_new%20%20%20%20%20%20%20%20time%20%20%20%20%20%20}%20%20%20%20}%20%20}}&operationName=skin&variables=%7B%22id%22%3A%22usp-s-torque%22%7D";
        //String encodedURI = URLEncoder.encode(uri, StandardCharsets.UTF_8.toString());
        System.out.println(uri);
        String username = "username";
        String password = "password";
        HttpClient client = new HttpClient();
        HttpMethod method = new PostMethod(uri);

        HostConfiguration config = client.getHostConfiguration();
        config.setProxy(PROXY_HOST, PROXY_PORT);

        Credentials credentials = new UsernamePasswordCredentials(username, password);
        AuthScope authScope = new AuthScope(PROXY_HOST, PROXY_PORT);

        client.getState().setProxyCredentials(authScope, credentials);
        client.executeMethod(method);

        String responseBody = method.getResponseBodyAsString();
        JSONObject skinInfo = new JSONObject(responseBody);
        JSONObject itemInf = skinInfo.getJSONObject("skin");
        JSONArray priceTraderLog = itemInf.getJSONArray("price_trader_log");
        String nameItem = priceTraderLog.getJSONObject(0).getString("name");
        return nameItem;
}

但我得到以下异常

Exception in thread "main" java.lang.IllegalArgumentException: Invalid uri 'https://wiki.cs.money/graphql?query=query%20skin($id:%20ID!)%20{%20%20skin(id:%20$id)%20{%20%20%20%20price_trader_log%20{%20%20%20%20%20%20name%20%20%20%20%20%20values%20{%20%20%20%20%20%20%20%20price_trader_new%20%20%20%20%20%20%20%20time%20%20%20%20%20%20}%20%20%20%20}%20%20}}&operationName=skin&variables=%7B%22id%22%3A%22usp-s-torque%22%7D': Invalid query
    at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:222)
    at org.apache.commons.httpclient.methods.GetMethod.<init>(GetMethod.java:89)
    at noSteam.SteamPage.sendRequestToWiki(SteamPage.java:526)
    at noSteam.MainTester.main(MainTester.java:25)

有人可以帮我解决这个问题吗,因为如果您手动发送请求,那么我们会得到正确的答案,这意味着 Yuri 是正确的,也许我使用了错误的方法来执行请求。提前致谢!

标签: javahttpgraphqlapache-commons-httpclient

解决方案


推荐阅读