如何使用 HTTP-CLIENT 在 API DELETE 中发送实体

How to send Entity in API DELETE with HTTP-CLIENT

我必须在客户端的 APIS 之一中调用 DELETE 方法。 这不应该是一个问题,但我正在为我公司目前使用的框架而苦苦挣扎,我希望我能得到一些信息,希望能帮助我解决问题:

第一件事。

1:如果我调用发送参数为 URL,api 将不起作用:

2:如果我将参数作为 x-www-form-urlencoded 而不是 form-data 或 raw 发送到 body 内,它就完全可以工作了

API 中方法的文档告诉我们以下内容:(重要的是查看 IDEtapa)

我必须在 JAVA (JAVA 8) 中进行此调用 目前我公司使用 HTTP_CLIENT 作为 APICalls.

的主要框架

我的代码: 数据的构建(目前我同时构建,作为实体和作为参数供您查看我已经独立尝试过它们中的每一个):

Map datosApi = new HashMap<>(); datosApi.put(Constants.URL, anular_cita);

    Map headers = new HashMap<>();
    headers.put(Constants.AUTHORIZATION, params.get("token_autorizacion"));
    headers.put("Content-Type", "application/json");
    headers.put("entity_charset", "UTF-8");

    datosApi.put(Constants.HEADERS, headers);
    JSONObject entity = new JSONObject();
    Map param = new HashMap();
    param.put(Constants.ID_CENTRO, consul);
    param.put("IdAsistencia", propiedades[0]);
    param.put("IdCapitulo", propiedades[1]);
    param.put("IdEtapa", Integer.valueOf(propiedades[2]));
    entity.put(Constants.ID_CENTRO, consul);
    entity.put("IdAsistencia", propiedades[0]);
    entity.put("IdCapitulo", propiedades[1]);
    entity.put("IdEtapa", Integer.valueOf(propiedades[2]));
    datosApi.put("entity", entity.toString());
    datosApi.put("entity_mime_type", "application/json");
    datosApi.put("entity_charset", "UTF-8");

    datosApi.put("params", param);
    String anularCita = APIDao.callAPIDelete(datosApi);

我调用框架的准备:

         public static String callAPIDelete(Map in) {
            String contentString = "";
            Map res = new HashMap<>();
            try {
                res = XWM.execute("delete@http_client", in);
                byte[] content = (byte[]) res.get("content");
                contentString = new String(content, StandardCharsets.UTF_8);
        
   
 

在我们的框架中,我们有这个:

if (StringUtils.equals(StringUtils.trim(method), "delete"))
                        {
                            StringBuilder requestUrl = new StringBuilder(url);
                            if (formparams != null)
                            {
                                if (requestUrl.indexOf("?")==-1)    requestUrl.append("?");
                                else                                requestUrl.append("&");
                                requestUrl.append(URLEncodedUtils.format(formparams, charset));
                        }
                        
                        if (entityRequest != null)
                        {
                            log.error("Param 'entity' no puede usarse en get (se ignora)");
                        }

                        HttpDelete delete = new HttpDelete(requestUrl.toString());  
                        delete.setConfig(requestConfig);            
                        uriRequest = delete;   
                    }
                }
            }
        }
        
        // Headers
        if (headers != null)
        {
            for (String h: headers.keySet()) uriRequest.addHeader(h, headers.get(h));
        }
        
        // Ejecutamos método
        log.info("Executing request " + uriRequest.getRequestLine());
        CloseableHttpResponse response = null;
        
        if (!preemtiveAuth || credsProvider == null)
        {
            response = httpclient.execute(uriRequest);
        }

如您所见,在删除方法中,我们忽略了我在第一段代码中构建的实体。 HTTPDelete Class 是 APACHE,带有 class 信息的 url 如下: https://www.javadoc.io/doc/org.apache.httpcomponents/httpclient/4.5.2/org/apache/http/client/methods/HttpDelete.html

问题可以分为两部分:

1:我们可以在删除调用中发送实体吗?我在以下地方找到了一些关于此的信息:

https://web.archive.org/web/20090213142728/http://msdn.microsoft.com:80/en-us/library/cc716657.aspx

https://peterdaugaardrasmussen.com/2020/11/14/rest-should-you-use-a-body-for-your-http-delete-requests/

我假设为了做到这一点,我需要一个新的 HttpDelete 来允许我们使用实体,如果可能的话,你能给我一些例子吗?

2:根据我对上面发布的链接的理解,虽然不禁止在删除调用中使用实体,但不鼓励这样做,我应该只与制作 API 和要求他们更改配置以允许我们通过参数发送信息? (这不是个人或敏感信息,只是一堆ID)

非常感谢您的关注,对于任何拼写错误或格式错误,我深表歉意,仍在学习如何发表好的帖子。

编辑:我发现这个答案 或多或少地解决了第一个问题,即是否可以在 Delete 调用中发送实体,但如果应该的话,现在还是不要最好让他们改变他们的方法

如 Ewramner 和 VoiceOfUnreason 的评论以及编辑所述:

1:在 Whosebug 的旧版 post 中找到了有关如何制作此内容的答案:

2:关于“我应该只与制作 API 的人谈谈并要求他们更改配置以允许我们通过参数发送信息吗?”的答案。得到了两人的回答。虽然不被禁止,但不推荐这样做。

我的行动方针是:

1:与负责 API 的人员交谈,向他们提供有关此情况的信息。

2:要求我们的架构团队创建一个新方法,允许我们对实体主体进行 HttpDelete 调用,以防万一我们必须进行更多 API 调用。

有了这个我想我所有的答案都解决了。

再次感谢。