使用JSON对象作为有效负载对REST API的POST请求

我正在尝试使用具有JSON有效负载的POST请求从REST API获取JSON响应(应在发送之前转换为URL编码文本)。 我已经按照一些教程来实现该过程,但是我收到状态码400的错误。我可能没有编码给定的JSON字符串或遗漏了某些东西。 请帮我解决这个问题。 谢谢。

这是我的代码

try { URL url = new URL("https://appem.totango.com/api/v1/search/accounts/health_dist"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("app-token", "1a1c626e8cdca0a80ae61b73ee0a1909941ab3d7mobile+testme@totango.com"); conn.setRequestProperty("Accept", "application/json, text/javascript, */*; q=0.01"); conn.setRequestProperty("X-Requested-With","XMLHttpRequest"); String payload = "{\"terms\":[{\"type\":\"totango_user_scope\",\"is_one_of\":[\"mobile+testme@totango.com\"]}],\"group_fields\":[{\"type\":\"health\"}]}"; OutputStream os = conn.getOutputStream(); os.write(payload.getBytes()); os.flush(); if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) { throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode()); } BufferedReader br = new BufferedReader(new InputStreamReader( (conn.getInputStream()))); String output; System.out.println("Output from Server .... \n"); while ((output = br.readLine()) != null) { System.out.println(output); } conn.disconnect(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

在关注了许多post和教程超过24小时后,我知道我没有正确发送我的URL参数。 而且我了解到使用ApacheHttpClient进行 REST API调用相对容易一些。 我解决了我的HTTP错误代码400并从服务器获得了响应。 这是我的问题的工作代码。

  try { httpClient = HttpClients.createDefault(); httpPost = new HttpPost("https://appem.totango.com/api/v1/search/accounts/health_dist"); List headers = new ArrayList(); //ArrayList to store header parameters List urlParameters = new ArrayList(); //ArrayList to store URL parameters urlParameters.add(new BasicNameValuePair("query","{\"terms\":[{\"type\":\"totango_user_scope\",\"is_one_of\":[\"mobile+testme@totango.com\"]}],\"group_fields\":[{\"type\":\"health\"}]}")); headers.add(new BasicNameValuePair("app-token", "1a1c626e8cdca0a80ae61b73ee0a1909941ab3d7mobile+testme@totango.com")); headers.add(new BasicNameValuePair("Accept", "application/json, text/javascript, */*; q=0.01")); headers.add(new BasicNameValuePair("X-Requested-With", "XMLHttpRequest")); httpPost.setEntity(new UrlEncodedFormEntity(urlParameters)); for (NameValuePair h : headers) { httpPost.addHeader(h.getName(), h.getValue()); } response = httpClient.execute(httpPost); if (response.getStatusLine().getStatusCode() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatusLine().getStatusCode()); } BufferedReader br = new BufferedReader(new InputStreamReader( (response.getEntity().getContent()))); String output; System.out.println("Output from Server .... \n"); while ((output = br.readLine()) != null) { System.out.println(output); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try{ response.close(); httpClient.close(); }catch(Exception ex) { ex.printStackTrace(); } } 

您正在调用的API需要一个名为“query = true | false”的查询参数。

 URL url = new URL("https://appem.totango.com/api/v1/search/accounts/health_dist?query=true"); 

添加此参数后,HTTP请求本身成功,状态代码为200,但REST调用失败并出现服务器端错误。 也许您需要不同的有效载荷。

我建议如果您是REST新手,请尝试像POSTMan这样的REST客户端