【问题标题】:Extract data from Curl POST request从 Curl POST 请求中提取数据
【发布时间】:2014-06-21 07:24:35
【问题描述】:

我正在使用 curl 发出 POST 请求,如下所示

curl -H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-X POST \
-d '{ "name": "PhoneName", "description": "Phone Description!", "details": { "imeiNumber": "123456789123456", "phoneNumber": "9999999999"}}' \
-k \
http://test.domain.com/myTestServer/devices

但在 servlet 中我无法获取任何发布的数据。

public void devices(HttpServletRequest request, HttpServletResponse response) throws IOException {

    System.out.println("Got Request for devices");
    System.out.println("Request is : "+ request);
    System.out.println("Name : " + request.getParameter("name"));   //gives null
    System.out.println("description : " + request.getParameter("description")); //gives null
    Enumeration<String> paramNames = request.getParameterNames();   //Empty Enumeration
    while(paramNames.hasMoreElements()){
        String paramName = paramNames.nextElement();
        System.out.println(paramName + " : " + request.getParameter(paramName));

    }

}

有什么建议吗?还有一种更好的方式来获取数据中的数据,例如"details": { "imeiNumber": "123456789123456", "phoneNumber": "9999999999"}

【问题讨论】:

  • 是JSON字符串,可以用JSON还是GSON?
  • 是的,看起来我们不能简单地解组它。正在尝试 GSON 库。

标签: java servlets post curl


【解决方案1】:

-d '{ "name": "PhoneName", "description": "Phone Description!", "details": { "imeiNumber": "123456789123456", "phoneNumber": "9999999999"}}' \

将输入 json 推送到 POST 请求负载中。 而且您不能简单地使用名称解组输入 json 属性,因此您会得到

System.out.println("Name : " + request.getParameter("name"));   //gives null

null 此类语句的值。

您需要从HttpServletRequest 对象中读取 POST 请求负载,然后使用 json 解析器对其进行解析以获取属性值。

您可以像这样读取整个 POST 请求负载:

try {
    InputStream inputStream = request.getInputStream();
    if (inputStream != null) {
        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        char[] charBuffer = new char[128];
        int bytesRead = -1;
        while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
            stringBuilder.append(charBuffer, 0, bytesRead);
        }
    } else {
        stringBuilder.append("");
    }
} catch (IOException ex) {
    throw ex;
} finally {
    if (bufferedReader != null) {
        try {
            bufferedReader.close();
        } catch (IOException ex) {
            throw ex;
        }
    }
}

body = stringBuilder.toString();

现在您应该在变量正文中获取输入 json。现在使用 json 解析器来获取属性值,例如这样:

JsonParser parser = new JsonParser();
JsonObject obj = parser.parse(body).getAsJsonObject();
String name = obj.get("name").toString();

【讨论】:

    【解决方案2】:

    有什么建议吗?还有一种更好的方法来获取数据中的数据,例如“详细信息”:{“imeiNumber”:“123456789123456”,“phoneNumber”:“9999999999”}

    这是一个建议,不要将其视为解决方案

    抱歉,我对 curl 没有任何概念,但我可以帮助您使用 GSON library 解析 JSON 字符串。只需将上面的 JSON 字符串包含在 {...} 中,并将其解析为 Java 对象,如下面的示例代码所示。 示例代码:

    class Details {
        private String name;
        private String description;
        private PhoneNumberDetails details;
        // getter & setter  
    }
    
    
    class PhoneNumberDetails{
        private String imeiNumber;
        private String phoneNumber;
        // getter & setter    
    }
    
    String json = "{ \"name\": \"PhoneName\", \"description\": \"Phone Description!\", \"details\": { \"imeiNumber\": \"123456789123456\", \"phoneNumber\": \"9999999999\"}}";
    Details data = new Gson().fromJson(json, Details.class);
    System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(data));
    

    输出:

    {
      "name": "PhoneName",
      "description": "Phone Description!",
      "details": {
        "imeiNumber": "123456789123456",
        "phoneNumber": "9999999999"
      }
    }
    

    【讨论】:

    • 你的回答没有提到为什么输入的json没有正确接收?您只是发布了如何解析 json。
    • 再次阅读问题并在回答之前尝试理解它。
    • 我认为我应该删除与@Juned Ahsan 不相关的帖子,因为有些人从不喜欢建议,他们总是在寻找解决方案。 建议根本不被接受。
    • @AniketThakur 请寻求解决方案而不是建议。
    • Please ask for solution.. 真的吗?解决方案并不重要,因为通常一个问题可能有多个。重要的是我们如何以聪明的方式做到这一点,这就是建议或更确切地说我会说个人经验的地方。就像您展示的方式将 GSON 与类映射一起使用使我的问题比将数据解组为原始 json 简单得多。很抱歉这么说,但我更喜欢建议而不是解决方案,这些建议不是OP is asking for some tool or software types :)。
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2019-11-26
    • 2021-01-04
    相关资源
    最近更新 更多