Отправьте запрос на сайт api GraphQL WikiCSMoney через HTTP и получите ответ JSON на Java

#java #http #graphql #apache-commons-httpclient

#java #http #graphql #apache-commons-httpclient

Вопрос:

Мне нужно сделать запрос к сервису WikiCsMoney и получить ответ в формате json. Я сделал следующий запрос

 String uri = "https://wiki.cs.money/graphql?query=query skin($id: ID!) {  skin(id: $id) {    price_trader_log {      name      values {        price_trader_new        time      }    }  }}amp;operationName=skinamp;variables={"id":"usp-s-torque"}"
  

Если я возьму и вручную через командную строку браузера или через Postman выполню этот запрос, то он вернет нужный мне ответ.
введите описание изображения здесь

Я делаю запрос соответствующим образом

 public  String sendRequestToWiki(String PROXY_HOST) throws IOException {
        String uri = "https://wiki.cs.money/graphql?query=query skin($id: ID!) {  skin(id: $id) {    price_trader_log {      name      values {        price_trader_new        time      }    }  }}amp;operationName=skinamp;variables={"id":"usp-s-torque"}";
        //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 skin($id: ID!) {  skin(id: $id) {    price_trader_log {      name      values {        price_trader_new        time      }    }  }}amp;operationName=skinamp;variables={"id":"usp-s-torque"}': 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)
  

Может кто-нибудь помочь мне решить эту проблему, потому что если вручную отправить запрос, то мы получим правильный ответ, а это значит, что Юрий прав, возможно, я использую неправильный подход к выполнению запроса. заранее спасибо!

Комментарии:

1. запрос в методе url = GET (обычно не поддерживается, но если протестировано / работает, все может быть в порядке)… но эти параметры (включенные в uri: запрос, переменные), вероятно, следует удалить из uri и определить / передать каким-либо другим способом (сбой требований / утверждений проверки uri клиента / библиотеки… но извините… IDK как, IDK java)

2. я думаю, что я решил проблему, проблему с кодировкой url, я это исправил, так что теперь uri выглядит как эта строка uri = » wiki.cs.money/… skinNameForWiki «»}»;