如何在查询参数中使用HttpURLConnection PUT?

如何使用带有查询参数的HttpURLConnection发出PUT请求?

我正在尝试使用HttpURLConnection使用第三方REST API,但是当我尝试传递URL中的参数时,它不起作用并抛出错误,如下所示:

The REST API Url could not be found in the mappings registry

这是迄今为止对我不起作用的代码块:

    URL url;
    StringBuffer response = new StringBuffer();
    try
    {
        url = new URL(" http://thirdparty.com/party/api/v2/ksp/12/ks");
        HttpURLConnection httpURL = (HttpURLConnection) url.openConnection();
        httpURL.setDoOutput(true);
        httpURL.setRequestMethod("PUT");
        StringBuilder sbUrl = new StringBuilder("parameter1_id=");
        sbUrl.append(getParameter1Value())
             .append("&parameter2_id=")
             .append(getParameter2Value());
        final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(httpURL.getOutputStream()));
        writer.write(sbUrl.toString());
        writer.flush();
        writer.close();

        // throw the exception here in case invocation of web service
        if (httpURL.getResponseCode() != 200)
        {
            // throw exception
        }
        else
        {
            //SUCCESS
        }
    }
    catch (IOException e)
    {
    }

当我在Body中提供这些参数作为表单数据参数时,REST API似乎提供了响应.
我的问题是如何使用HttpURLConnection进行此操作?

我到现在为止做了什么?
我试图修改上面的内容,但它不起作用.

    try
    {
        url = new URL(" http://thirdparty.com/party/api/v2/ksp/12/ks");
        HttpURLConnection httpURL = (HttpURLConnection) url.openConnection();
        httpURL.setDoOutput(true);
        httpURL.setRequestMethod("PUT");
        httpURL.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + "----WebKitFormBoundarydklhfklsdfhlksh");
        dataOutputStream = new DataOutputStream(urlConnection.getOutputStream());

        dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"parameter1_id\"");
        dataOutputStream.writeBytes("\r\n" + "parameter1Value" +"\r\n");
        dataOutputStream.writeBytes("--" + "----WebKitFormBoundarydklhfklsdfhlksh");
        dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"parameter2_id\"");
        dataOutputStream.writeBytes("\r\n" + "parameter2Value" + "\r\n");
        dataOutputStream.writeBytes("--" + "----WebKitFormBoundarydklhfklsdfhlksh" + "--");
        dataOutputStream.flush();
        dataOutputStream.close();
        urlConnection.connect();
        // throw the exception here in case invocation of web service
        if (httpURL.getResponseCode() != 200)
        {
            // throw exception
        }
        else
        {
            //SUCCESS
        }
    }
    catch (IOException e)
    {
    }

编辑:它引发错误,响应代码为500

编辑:只是为了澄清,我不是试图上传文件,而是尝试在BODY中发送参数(如查询参数而不是作为URL参数发送).

任何关于此的指示或建议都非常感谢.

最佳答案 你谈论’查询参数’和’URL中的参数’,但你展示的方法都没有做任何这样的事情.您的方法(尝试)都在请求正文中发送参数,即“实体”,而不是在URL中.尽管正文内容可能涉及应用程序级别的查询,但它们不是HTTP级别的查询字符串,也就是查询参数.您还会问’我如何使用HttpURLConnection进行此操作’,就好像当您的尝试都已使用它时,这是一个变化或差异.

你的第一次尝试几乎是正确的.它应该工作如果
你.setRequestProperty(“内容类型”,“application / x-www-form-urlencoded”)(这不是自动的)你的值是URLencoded或不需要它(没有保留字符)(取决于服务器)没有符号或等号可能就足够了)

你的第二次尝试也相当接近.你需要在第一部分之前写一个边界,并在Content-disposition之后为每个部分写一个:form-data; name =“blah”你需要一个CRLF来结束那个标题行,第二个CRLF结束标题块. (MIME多部分格式通常允许多个标题行,但在这种情况下只需要一个.)并且结束边界后面应该跟一个CRLF(在额外 – 之后).

当然,两者都只有你的URL正确.没有正确的URL,什么都行不通.

点赞