从Java中的HTTP POST请求中读取JSON消息

我是Java和客户端 – 服务器编程的新手。

我正在使用嵌入式Jetty,我正在尝试将JSON字符串发送到某个地址( http:// localhost:7070 / json ),然后在该地址中显示JSON字符串。

我尝试了以下代码,但我得到的只是null。

嵌入式Jetty代码:

public static void main(String[] args) throws Exception { Server server = new Server(7070); ServletContextHandler handler = new ServletContextHandler(server, "/json"); handler.addServlet(ExampleServlet.class, "/"); server.start(); } 

用于发送Http POST的客户端function:

 public static void sendHttp(){ HttpClient httpClient = HttpClientBuilder.create().build(); //Use this instead try { HttpPost request = new HttpPost("http://localhost:7070/json"); JSONObject object = new JSONObject(); try { object.put("name", "MyName"); object.put("age", "26"); } catch (Exception ex) { System.out.println("Error: " + ex.getMessage()); } String message = object.toString(); request.setEntity(new StringEntity(message, "UTF8")); request.setHeader("Content-type", "application/json"); HttpResponse response = httpClient.execute(request); // handle response here... }catch (Exception ex) { // handle exception here } finally { } } 

和Servletfunction:

 public class ExampleServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //System.out.println("test get\n"); doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //System.out.println("test post\n"); PrintWriter out = resp.getWriter(); String json_str = req.getParameter("name"); out.print(json_str); } } 

在运行嵌入式Jetty服务器代码(如果这很重要)之后,我从测试类调用sendHttp()方法。

要从Post请求中获取数据,您需要获取内容。 尝试这个:

 String data = IOUtils.toString(req.getInputStream(), "UTF-8"); 

我没有使用过jetty但是我用这个代码做了类似的通信(PUT,而不是POST):

 URL url = new URL(desturl); HttpURLConnection huc = (HttpURLConnection) url.openConnection(); huc.setRequestMethod("PUT"); byte[] postData = null; int postDataLength; huc.setDoOutput(true); postData = data.getBytes( StandardCharsets.UTF_8 ); postDataLength = postData.length; huc.setRequestProperty( "Content-Type", "application/json"); huc.setRequestProperty( "charset", "utf-8"); huc.setRequestProperty( "Content-Length", Integer.toString( postDataLength )); huc.setUseCaches( false ); huc.connect(); huc.setConnectTimeout(10000); DataOutputStream wr = new DataOutputStream( huc.getOutputStream()); wr.write( postData ); rd = new BufferedReader(new InputStreamReader(huc.getInputStream())); retcode = huc.getResponseCode(); 

您需要阅读原始请求正文,如下所示。 将它放在servletdoPost方法中,以便从请求中读取json

 StringBuilder jsonBuff = new StringBuilder(); String line = null; try { BufferedReader reader = req.getReader(); while ((line = reader.readLine()) != null) jsonBuff.append(line); } catch (Exception e) { /*error*/ } System.out.println("Request JSON string :" + jsonBuff.toString()); //write the response here by getting JSON from jasonBuff.toString() try { JSONObject jsonObject = JSONObject.fromObject(jb.toString()); out.print(jsonObject.get("name"));//writing output as you did } catch (ParseException e) { throw new IOException("Error parsing JSON "); } 

注意:您可以访问req.getParameter("name"); 只有当你的标题是这样的时候:

 content type: "application/x-www-form-urlencoded" 

与正常的html表单提交一样。

这是我的代码,这工作正常

  String data = ""; StringBuilder builder = new StringBuilder(); BufferedReader reader = request.getReader(); String line; while ((line = reader.readLine()) != null) { builder.append(line); } data = builder.toString(); JSONObject object = new JSONObject(data); //or JSONArray array = new JSONArray(data); which ever the one you want 

祝好运…..