我必須在客戶端的 API 之一中呼叫 DELETE 方法。這不應該是一個問題,但我正在為我公司目前使用的框架而苦苦掙扎,我希望我能得到一些資訊,希望能幫助我解決問題:
先說第一件事。
1:如果我呼叫將引數作為 URL 發送,則 api 不起作用:

2:如果我將正文中的引數作為 x-www-form-urlencoded 但不是 form-data 或 raw 發送,它完全可以正常作業

API 內部方法的檔案告訴我們以下內容:(重要的是查看 IDEtapa)

我必須在 JAVA (JAVA 8) 中進行此呼叫,目前我的公司使用 HTTP_CLIENT 作為 APICalls 的主要框架。
我的代碼:資料的構建(目前我將兩者都構建為物體和引數供您查看,我已經單獨嘗試過它們中的每一個):
映射 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 類是 APACHE,類資訊的 url 如下: https://www.javadoc.io/doc/org.apache.httpcomponents/httpclient/4.5.2/org/apache/http/client/methods /HttpDelete.html
這個問題可以分為兩個:
1:我們可以在洗掉呼叫中發送物體嗎?我在以下地方找到了一些關于此的資訊:
HTTP DELETE 請求是否允許物體主體?
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)
非常感謝您的關注,對于任何拼寫錯誤或格式錯誤,我深表歉意,仍在學習如何制作好帖子。
編輯:我在 HttpDelete 中找到了這個答案 setEntity,它或多或少地解決了第一個問題,即是否可以在 Delete 呼叫中發送物體,但是,如果最好讓他們更改他們的,現在不要方法
uj5u.com熱心網友回復:
正如 Ewramner 和 VoiceOfUnreason 的評論和編輯中所說:
1:關于如何做到這一點的答案在 StackOverflow 的舊帖子中找到:HttpDelete 中的 setEntity
2:關于“我應該與制作 API 的人交談并要求他們更改配置以允許我們通過引數發送資訊嗎?”的答案?得到了他們倆的回答。雖然它不是被禁止的,但它是不推薦的。
我的行動方針是:
1:與負責 API 的人員交談,向他們提供有關此情況的資訊。
2:請我們的架構團隊創建一個新方法,允許我們使用物體主體進行 HttpDelete 呼叫,以防我們必須進行更多這樣的 API 呼叫。
有了這個,我想我所有的答案都解決了。
再次謝謝你。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/484461.html
標籤:爪哇 休息 apache-httpclient-4.x http-删除 视图参数
上一篇:如何通過這些服務將查詢引數放入Obsrvable呼叫中?
下一篇:Java 實作等頻分箱
