【问题标题】:Receiving null Value while using POST method in servlet?在 servlet 中使用 POST 方法时接收空值?
【发布时间】:2016-12-08 23:42:20
【问题描述】:

我想在 servlet 中使用 POST 方法发送一个字符串,以便它可以与其他域中的其他 servlet 应用程序通信。但我在 Input steam 对象中收到 null。

我的代码:

    String content = "10 141 nahush123 01";
    URL url = new URL("http://52.220.37.12:8080/servers/servers");
    System.out.println(url.toString());
    HttpURLConnection httpCon = (HttpURLConnection)url.openConnection();
    httpCon.setDoInput(true);
    httpCon.setDoOutput(true);
    httpCon.setRequestMethod("POST");
    httpCon.setRequestProperty("Content-Type", "text/plain;charset=UTF-8");

    OutputStream os = httpCon.getOutputStream();
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os));
    out.write(content);
    //br = BufferReader(out);
    System.out.println(httpCon.getResponseCode());
    System.out.println(httpCon.getResponseMessage());
    writer.println(httpCon.getResponseMessage());


    httpCon.connect();
    br = new BufferedReader(new InputStreamReader(httpCon.getInputStream()));
    //reading response 
    //String resp;
    //if(br != null){
        content = br.readLine();
    //}
    System.out.println(content);
    writer.println(content);
    out.flush();
    writer.flush();
    writer.close();
    out.close();
    os.close();

【问题讨论】:

  • 为什么要在连接前写入输出流?
  • 试图将字符串作为参数传递。
  • 我尝试在 outputteam 之前连接它仍然无法正常工作。

标签: java servlets


【解决方案1】:

使用您的传递字符串参数调用此方法:

public String postData(String reqStr) {
ObjectOutputStream objOS = null;
ObjectInputStream objIS = null;
HttpURLConnection servletCon = null;
try {
if (reqStr != null) {
Thread.sleep(1000);
objOS.writeObject(reqStr);
} else {
throw new Exception("request is null.");
}
} catch (Exception ex) {
        logger.error("Failed to send request to server.", ex);
    }
    String response = null;
    try {
        objIS = new ObjectInputStream(servletCon.getInputStream());
        response = (String) objIS.readObject();
    } catch (Exception ex) {
        logger.error("Failed to get response from server.", ex);
        response = null;
    }
    return response;
}

像你一样初始化连接,但调用方式不同:

public void initializeUrlConnection(String servletURL, String contentType, String method) {

    try {

        logger.debug("Servlet URL " + servletURL);
        url = new URL(servletURL);
        servletCon = (HttpURLConnection) url.openConnection();
        servletCon.setUseCaches(false);
        servletCon.setDefaultUseCaches(false);
        servletCon.setDoInput(true);
        servletCon.setDoOutput(true);
        servletCon.setRequestProperty("Content-Type", contentType);
        servletCon.setRequestMethod(method);
        objOS = new ObjectOutputStream(servletCon.getOutputStream());
    } catch (IOException ex) {

        logger.error("Failed to initialize Http Connection.", ex);
    }
}

调用初始化连接方法的第一个参数:

Object.initializeUrlConnection(url, contentType,method);

然后使用您的字符串/json 参数调用 posDataMethod:

Object.postData(str);

【讨论】:

  • 嗨 Vimal,网址在哪里?
  • 我希望你现在了解更多。
【解决方案2】:

在我的 servlet 中复制粘贴代码运行良好

  1. 检查您是否覆盖了 servlet 中的 doPost 方法

  2. 检查您的帖子方法是否正常工作并返回值,我使用 "DHC Rest Client" chrome 插件。这是一个很酷的工具

  3. 尝试删除 httpCon.connect() 行。没必要。

    来自关于 connect() 方法的 oracle 文档:

依赖于连接的操作,如 getContentLength,将 如有必要,隐式执行连接。

操作 getResponseMessage、getResponseCode 执行连接。

更新

我尝试使用我的本地测试 url 进行测试,它可以工作。然后我尝试了您的网址,但它不起作用。

您需要在使用输入流之前刷新输出流。

此代码有效并返回“0#5#26#Temperature#Living_Room#555555581#0+0#7#0#Room1#Master_bedroom#555555581#1+1#7#0#Door1#Living_Room#555555581#2 +1#6#0#frontdoor#Living_Room#555555581#2+0#6#0#doorback#Balcony#555555581#2+"

PrintWriter writer = res.getWriter();
String content = "10 141 nahush123 01";
URL url = new URL("http://52.220.37.12:8080/servers/servers");
System.out.println(url.toString());
HttpURLConnection httpCon = (HttpURLConnection)url.openConnection();
httpCon.setDoInput(true);
httpCon.setDoOutput(true);
httpCon.setRequestMethod("POST");
httpCon.setRequestProperty("Content-Type", "text/plain;charset=UTF-8");

OutputStream os = httpCon.getOutputStream();
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os));
out.write(content);
out.flush();
//br = BufferReader(out);
System.out.println(httpCon.getResponseCode());
System.out.println(httpCon.getResponseMessage());
writer.println(httpCon.getResponseMessage());


//httpCon.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(httpCon.getInputStream()));
//reading response
//String resp;
//if(br != null){
content = br.readLine();
//}
System.out.println(content);
writer.println(content);
writer.flush();
writer.close();
out.close();
os.close();

【讨论】:

  • 您能分享一下您收到的回复吗?我正在寻找字符串作为响应文本,它不会包含 OK。响应文本必须为 0#7#0#Room1#Master_bedroom#555555581#1+1#7#0#Door1#Living_Room#555555581#2+0#5#26#Temperature#Living_Room#555555581#0+1#6# 0#frontdoor#Living_Room#555555581#2+0#6#0#doorback#Balcony#555555581#2+
  • @NahushSarje 我更新了我的答案。无法在此处粘贴代码
【解决方案3】:

尝试在 servlet 中使用 getparameter() 函数

【讨论】:

  • 我正在尝试发送内容变量中提到的那个字符串。作为回报,我只会得到一个字符串。所以我不认为 getparameter() 会有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2018-04-07
  • 2022-06-25
  • 2019-09-07
  • 2021-08-12
  • 2011-12-09
相关资源
最近更新 更多