在 java 中使用 PATCH API(之前的问题已被删除)

Consuming PATCH API in java(Earlier question have been removed)

我必须在 java 中使用 PATCH API。当我尝试在下面的代码中使用时,它给出了异常

  java.net.ProtocolException: Invalid HTTP method: PATCH
    at java.net.HttpURLConnection.setRequestMethod(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.setRequestMethod(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.setRequestMethod(Unknown Source)
    at com.java.jackson.jackson.PatchRequest.main(PatchRequest.java:32)

下面代码中的这一行抛出异常。

connection.setRequestMethod("PATCH");

我正在使用下面的代码。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import com.eclipsesource.json.Json;
import com.eclipsesource.json.JsonObject;

public class PatchRequest {
    
    public static void main(String[] args)  {
        try {
            HttpURLConnection connection=null;
            String targetUrl="https://xxxxxxxxx-t0.data.digitalassistant.oci.oc-test.com/api/v1/bots/"+botID+"/dynamicEntities/"+dynamicEntityId+"/pushRequests/"+pushRequestId+"/values";
            URL url=new URL(targetUrl);
            connection=(HttpURLConnection) url.openConnection();
            connection.setUseCaches (false);
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setRequestMethod("PATCH");
            connection.setRequestProperty("Content-Type","application/json");
            connection.setRequestProperty("Authorization","Bearer "+"eyJ4NXQjUzI1NiI6IjZhYnBycWVsRl9ld3NEaW1HRy0wY0JpNVg2N09jQjkzTGNyN2Y4M3UzLXMiLCJ4NXQiOiJkdlhSRXBGdXpTenRMdGlMM2Vmbk1rbVo0Rk0iLCJraWQiOiJTSUdOSU5HX0tFWSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJpZGNzLW9kYS05NDE3ZjkzNTYwYjk0ZWI4YTJlMmE0YzlhYWM5YTNmZi10MF9BUFBJRCIsInVzZXIudGVuYW50Lm5hbWUiOiJpZGNzLTgyOTcyOTIxZTQyNjQxYjFiZjA4MTI4YzNkOTNhMTljIiwic3ViX21hcHBpbmdhdHRyIjoidXNlck5hbWUiLCJwcmltVGVuYW50Ijp0cnVlLCJpc3MiOiJodHRwczpcL1wvaWRlbnRpdHkub3JhY2xlY2xvdWQuY29tXC8iLCJ0b2tfdHlwZSI6IkFUIiwiY2xpZW50X2lkIjoiaWRjcy1vZGEtOTQxN2Y5MzU2MGI5NGViOGEyZTJhNGM5YWFjOWEzZmYtdDBfQVBQSUQiLCJjYV9ndWlkIjoiY2FjY3QtYzZkNjgxNDI5YzZiNGQyMTgzMzkwYWE2ZTczZGNmY2IiLCJhdWQiOiJodHRwczpcL1wvaWRjcy1vZGEtOTQxN2Y5MzU2MGI5NGViOGEyZTJhNGM5YWFjOWEzZmYtdDAuZGF0YS5kaWdpdGFsYXNzaXN0YW50Lm9jaS5vYy10ZXN0LmNvbSIsInN1Yl90eXBlIjoiY2xpZW50Iiwic2NvcGUiOiJcL2FwaVwvdjEiLCJjbGllbnRfdGVuYW50bmFtZSI6ImlkY3MtODI5NzI5MjFlNDI2NDFiMWJmMDgxMjhjM2Q5M2ExOWMiLCJleHAiOjE1OTM1NTU3MzQsImlhdCI6MTU5MzU1MjEzNCwidGVuYW50X2lzcyI6Imh0dHBzOlwvXC9pZGNzLTgyOTcyOTIxZTQyNjQxYjFiZjA4MTI4YzNkOTNhMTljLmlkZW50aXR5LmM5ZGV2Mi5vYzlxYWRldi5jb20iLCJjbGllbnRfZ3VpZCI6IjI2NTNlMTBjY2NiODQzMmFhNWIzMTEwYTllNTdmM2FjIiwiY2xpZW50X25hbWUiOiJpZGNzLW9kYS05NDE3ZjkzNTYwYjk0ZWI4YTJlMmE0YzlhYWM5YTNmZi10MCIsInRlbmFudCI6ImlkY3MtODI5NzI5MjFlNDI2NDFiMWJmMDgxMjhjM2Q5M2ExOWMiLCJqdGkiOiJkZDBjYTA5NC0wY2EyLTQ5YmUtYmEzYi1hYWJkMTBjNjIyY2IifQ.j2tQr_lS5DNwzRuttsDKxDMYoiGreFVfe-rs-TmRF1gN5VDmNcnKnw5WWh8yL73ixrNtoELbY5h7uRyB49vCMPHiUtIMRYL8yXGfn56VOJvxshQAVjfCrMyGS6FeTlnuR-4CLEwy_QYWXV3CX7JRN2cVbYapwS1Nex9KX0wrF-tMmgEEttBsQxDlc6BqwacCtFBVjKvZTyhucivjQCfMhFINeMtL3ktqs1e3_ztundyiWV6vjDgrGjVY5UatHLqdorTC0Q56GVi3OPIAKisDUAP7vtnaeuaLR9aARwPVDFLcY6gMjsOWMYCfAHkAZ7RBkuLsptxUc3czUXfqMLxqtw");
            connection.setRequestProperty("Accept", "application/json");
            OutputStream os = connection.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");    
            osw.write("\"{\n    \\"delete\\": [\n    \n        {\n            \\"canonicalName\\": \\"FTE Discrete Org\\"\n        } \n    ],\n    \\"modify\\": [\n        {\n            \\"canonicalName\\": \\"FTE Process Org\\",\n            \\"synonyms\\": [\n                \\"FTE Process Org\\",\\"FTE Process  Org\\",\\"fteprocessorg\\"\n            ]\n        }\n    ],\n    \n     \\"add\\": [        \n\n        {\n            \\"canonicalName\\": \\"Vision Canada\\",\n            \\"synonyms\\": [\n                \\"visioncanada\\",\n                \\"vision  canada\\",\\"vision canada\\"\n            ]\n        },\n        {\n            \\"canonicalName\\": \\"apple computers\\",\n            \\"synonyms\\": [\n                \\"apple corp\\",\n                \\"apple\\"             \n            ]\n        }\n    ]\n}\"");
            osw.flush();
            osw.close();
            os.close(); 
            System.out.println("Code works before connect");

            connection.connect();
            
            System.out.println("Code works after connect");
            int responseCode=connection.getResponseCode();
            System.out.println("Response code:"+responseCode);
            if (responseCode==401) {
                System.out.println("Unauthorized Error");
            } else if(responseCode==200) {       
                InputStreamReader in=new InputStreamReader(connection.getInputStream());
                BufferedReader reader =new BufferedReader(in);
                String output;
                String apiOutput="";
                while((output=reader.readLine())!=null) {
                    apiOutput+=output;
                }
                System.out.println(apiOutput);  
                connection.disconnect();
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

我在 google 中阅读,然后我将抛出异常的行替换为以下 2 行。

connection.setRequestProperty("X-HTTP-Method-Override", "PATCH");
connection.setRequestMethod("POST");

然后它抛出 Http status code 412。你能帮我做同样的事情吗?

您将无法使用 java.net.HttpURLConnection 执行此操作,请参阅下面的 link 中的详细信息。您需要使用 java.net.http 包中的客户端 API。

可在此处找到详细信息:https://bugs.openjdk.java.net/browse/JDK-8207840