2015-06-11 3 views
1

Я пытаюсь вставить объекты JSON в URL-адрес HTTP-запроса, чтобы использовать API. Необработанные JSON являетсяВложенный JSON в запросе URL с Java

{ 
    "jsonrpc":"2.0", 
    "id":"12345", 
    "params":{ 
     "api_key": "e983322o", 
     "preset_id": "12345678", 
     "user_id": "3265999" 
    }, 
    "method":"Tags.get" 
} 

(Это проверено и работает в клиенте REST) ​​

И метод в Java является

private static void printSiteTags() { 
    try { 
     List<NameValuePair> params = new LinkedList<>(); 
     params.add(new BasicNameValuePair("jsonrpc", "2.0")); 
     params.add(new BasicNameValuePair("id", "12345")); 

     params.add(new BasicNameValuePair("params[0]", new BasicNameValuePair("api_key", API_KEY).toString())); 
     params.add(new BasicNameValuePair("params[1]", new BasicNameValuePair("preset_id", "12345678").toString())); 
     params.add(new BasicNameValuePair("params[2]", new BasicNameValuePair("user_id", "3265999").toString())); 

     params.add(new BasicNameValuePair("method", "Tags.get")); 

     String rawUrl = addToUrl(SITE_URL, params); 
     //addToUrl just uses URLEncodedUtils 
     System.out.println(rawUrl); 
     URL url = new URL(rawUrl); 

     HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
     conn.setDoOutput(true); 

     Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); 
     for (int c = in.read(); c != -1; c = in.read()) 
      System.out.print((char)c); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

результат необработанного URL является

[base site]?jsonrpc=2.0&id=12345&%5Bparams%5D%5Bapi_key%5D=e983322o&params%5B1%5D=preset_id%3D12345678&params%5B2%5D=user_id%3D3265999&method=Tags.get 

(что, очевидно, неверно)

Очевидно, что ответ с сервера является ошибкой.

+4

Почему вы пытаетесь поместить его в URL-адрес? Вы делаете почтовый запрос - почему бы вам не установить тип содержимого в text/json и просто поставить JSON? –

ответ

0

JSON должен войти в запрос BODY. И тип содержимого запроса должен быть применен/json.

Если вы хотите продолжать использовать URLConnection то здесь смотрите, например: POST request send json data java HttpUrlConnection Но заметьте, это не имеет значения, какие библиотеки вы выбрали для форматирования тела JSon, это просто текст - в вашем случае { "jsonrpc ":" 2.0 "," id ":" 12345 ", ...

Существуют и другие подходы, например: если вы используете httpClient, см. пример 8 по следующей ссылке: http://www.programcreek.com/java-api-examples/index.php?api=org.apache.commons.httpclient.methods.StringRequestEntity