为什么HTTP POST返回代码400(错误的请求)? HTTP POST方法

时间:2015-03-25 17:23:07

标签: java http post gwt

为什么服务器返回响应代码400(错误请求)? (不起作用)

URL serverAddress = new URL(uri);
HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("Content-Type", contentType);
connection.setRequestMethod("POST");
int status = connection.getResponseCode(); // returns 400

例如,此HTTP GET返回代码200 :(工作)

/** Creating Connection **/
 URL serverAddress = new URL(uri);
 HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
 connection.setRequestProperty("Content-Type", contentType);
 connection.setRequestMethod("GET");
 connection.setDoOutput(false);
 int status = connection.getResponseCode(); // returns 200

5 个答案:

答案 0 :(得分:7)

在我实际写入流并关闭流之前,我尝试获取响应代码(connection.getResponseCode()) writer.write() os.close())这就是服务器返回错误请求代码(400)的原因。 这是我现在可以使用的代码:

            /** Creating Connection **/
            URL serverAddress = new URL(uri);
            HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setRequestProperty("Content-Type", contentType);
            connection.setRequestMethod("POST");

            /** POSTing **/
            OutputStream os = connection.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
            writer.write(getQuery());
            writer.flush();
            writer.close();
            os.close();
            connection.connect();

            int status = connection.getResponseCode();//this cannot be invoked before data stream is ready when performing HTTP POST
            PrinterClass.show(status);  //status
            if (status != 200)
                throw (new RESTfulWebServiceException("Invalid HTTP response status "
                    + "code " + status + " from web service server."));

private String getQuery() throws UnsupportedEncodingException
    {
        JSONObject jobj = new JSONObject();
        jobj.put("customerNumber", new JSONString("003"));
        jobj.put("mappingCode", new JSONString("jac_003"));
        jobj.put("name", new JSONString("johnny"));
        jobj.put("status", new JSONString("ACTIVE"));
        PrinterClass.show(jobj.toString());
        return jobj.toString();
    }

答案 1 :(得分:1)

错误400 means Bad Request。您没有向我们展示您尝试请求的URI,但是,URI很可能只接受GET请求并且没有办法响应POST请求,因此它会引发400错误。例如,请求显示带有GET的照片列表的页面是有意义的,但是对该页面发出POST请求根本就没有意义。

另一种可能性是您可能提供了错误的内容类型。通常,在发出POST请求时,您希望使用application/x-www-form-urlencoded,这是您在互联网上提交任何网络表单时使用的内容类型。此外,您可能无法提供服务器所需的表单数据。想象一下,您尝试在Facebook上发布消息,但您没有提供任何消息。服务器将正确地解除您的空请求。

如果您向我们提供您正在使用的请求URI和内容类型,我们可以帮助您进一步调试。

答案 2 :(得分:1)

查看合作伙伴电话的文档。 get操作显示所有伙伴,post操作需要设置一个body。你不要在你的代码中发送正文,因此你发送了一个错误的请求。

请参见此处:http://nwb.sys.stage-cf-billing.swisslab.io/com.swisscom.nwb.cf.api/doc/swagger/index.html#!/Partner/GETPartner vs

http://nwb.sys.stage-cf-billing.swisslab.io/com.swisscom.nwb.cf.api/doc/swagger/index.html#!/Partner/POSTPartner

答案 3 :(得分:1)

就我而言,我的网址字符串中有空格。我用%20替换它并且它有效。

    requestUrl = requestUrl.replace(" ", "%20");

答案 4 :(得分:0)

对我来说,它是在我为POST请求设置outputStream值之前从inputStream读取的。我将os.write()...的{​​{1}}部分移到了{p

OutputSteam os = ...