2015-11-24 3 views
0

Я новичок в Java и программировании на клиент-сервер.Чтение сообщения JSON из запроса HTTP POST в 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:

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 { 
    } 
} 

И Servlet функции:

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); 
    } 
} 

я вызываю метод sendHttp() из тестовый класс после запуска встроенного кода сервера Jetty (если это имеет значение).

+0

Может быть, вы должны смотреть на: http://stackoverflow.com/questions/11901831/how- to-get-json-object-from-http-request-in-java – guuspor

ответ

0

Чтобы получить данные из запроса на отправку, вам необходимо получить контент. Попробуйте это:

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

В IOUtils нет метода toString ... – Maya

+0

Проверьте, есть ли у вас импорт org.apache.commons.io.IOUtils; – jordi

+0

Импорт работал, но теперь я получаю пустую строку ... – Maya

0

Я не использовал причал, но я сделал аналогичные Comunications с этим кодом (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(); 
0

Вы должны прочитать сырое тело запроса, как показано ниже. Поместите это внутри doPost метод servlet для чтения 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 представление формы.

+0

Я обновил код mis-spells –

+0

не уверен, что получил - мне нужно изменить request.setHeader («Content-type», «application/JSON "); to request.setHeader («Content-type», «application/x-www-form-urlencoded») ;? – Maya

+0

Вы не следуете первому методу. Это используется 'req.getReader()'. Я поместил 'Примечание' в качестве дополнительной информации. –

0

Вот мой код это работает отлично

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 

удачи .....

Смежные вопросы