在java中的http PUT请求中发送一个整数

Posted

技术标签:

【中文标题】在java中的http PUT请求中发送一个整数【英文标题】:Sending an integer in http PUT request in java 【发布时间】:2017-08-01 15:22:43 【问题描述】:

我想发送 "name":"super user","status":1 但发送时出现此错误

Exception in thread "main" java.lang.NullPointerException
    at java.io.Reader.<init>(Reader.java:78)
    at java.io.InputStreamReader.<init>(InputStreamReader.java:72)
    at com.service.RoleService.updateRole(RoleService.java:145)
    at com.service.RoleService.main(RoleService.java:176)

这里是代码

URL url = new URL("http://localhost:31109/user/role/"+role_id);
        HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
        httpConnection.setDoOutput(true);
        httpConnection.setRequestMethod("PUT");
        httpConnection.setRequestProperty("Content-Type", "application/json");
        httpConnection.setConnectTimeout(15000);

        String input = "\"name\":\""+name+"\",\"status\":"+status+"";
        System.out.println(input);


        OutputStream outputStream = httpConnection.getOutputStream();

        outputStream.write(input.getBytes());

        outputStream.flush();

        if(httpConnection.getResponseCode() !=200)
            String error_resp;
           BufferedReader error_responseBuffer = new BufferedReader(new InputStreamReader(
                (httpConnection.getErrorStream()))); 
           while((error_resp = error_responseBuffer.readLine()) != null)
               System.out.println("Error responsecode => "+httpConnection.getResponseCode()+"error => "+error_resp);
               output = new JSONObject(error_resp);
           
        else 
            BufferedReader responseBuffer = new BufferedReader(new InputStreamReader(
                    (httpConnection.getInputStream())));
            String httpresponse;
            StringBuilder content = new StringBuilder();
            while((httpresponse = responseBuffer.readLine()) != null)
                content.append(httpresponse);
            
             output = new JSONObject(content.toString());
        
        httpConnection.disconnect();

但是,当我发送 "name":"super user","status":"1" 请求是正常的,但 API 有一个验证,要求它作为整数并拒绝它。而且我无法更改 api。

【问题讨论】:

如果您的代码使用一个输入但不能使用另一个输入,这意味着您的代码没问题,问题在于您发送到的 API 您的代码没有说明您在哪里创建阅读器并获取 NullPointerException 您显示的错误是客户端还是服务器端? api 期望是什么整数?您可以控制服务器端吗?你应该改进你的问题 @nandsito api 需要 "name":"super user","status":1 但是当它尝试使用上面的代码发送它时它会中断。有一个空指针异常。但是当我用 "name":"super user","status":"1" 调用它时,代码不会破坏它,只是 api 在其验证中拒绝它 @ControlAltDel 我已经编辑了调用http请求的完整代码 【参考方案1】:

您正在尝试为您的 URL 调用的响应创建一个阅读器,但可能已经关闭了套接字。您应该检查您的 httpConnection.getXXXStream 调用以确保 httpConnection 仍然存在并且 getStream 调用的返回值不为空。

-- 编辑--

您对responseCode != 200 的检查有问题。 100s 和 200s 中的响应码都不是错误,不会使用错误流。否则,您应该检查您从 httpConnection 获得的输入流,例如

    if(httpConnection.getResponseCode() !=200)
        String error_resp;
        InputStream in = httpConnection.getErrorStream();
        if (in == null) return; // check if the error stream is null
       BufferedReader error_responseBuffer = new BufferedReader(new InputStreamReader(
            (httpConnection.getErrorStream()))); 
       while((error_resp = error_responseBuffer.readLine()) != null)
           System.out.println("Error responsecode => "+httpConnection.getResponseCode()+"error => "+error_resp);
           output = new JSONObject(error_resp);
       
    else 
        InputStream in = httpConnection.getInputStream();
        if (in == null) return; // check inputstream
        BufferedReader responseBuffer = new BufferedReader(new InputStreamReader(
                (in)));
        String httpresponse;
        StringBuilder content = new StringBuilder();
        while((httpresponse = responseBuffer.readLine()) != null)
            content.append(httpresponse);
        
         output = new JSONObject(content.toString());
    
    httpConnection.disconnect();

【讨论】:

请你怎么演示?

以上是关于在java中的http PUT请求中发送一个整数的主要内容,如果未能解决你的问题,请参考以下文章

[Java]随记--HttpClient发送put请求

如何在 Ruby 中发送 HTTP PUT 请求?

Chrome 中的 AJAX 发送选项而不是 GET/POST/PUT/DELETE?

Flutter PUT 来自文件的 HTTP 请求

REST模式中HTTP请求方法(GET,POST,PUT,DELETE)

HTTP Options 跨域时发送两个请求是怎么回事?