如何使用 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
我假设为了做到这一点,我需要一个新的 HttpDelete 来允许我们使用实体,如果可能的话,你能给我一些例子吗?
2:根据我对上面发布的链接的理解,虽然不禁止在删除调用中使用实体,但不鼓励这样做,我应该只与制作 API 和要求他们更改配置以允许我们通过参数发送信息? (这不是个人或敏感信息,只是一堆ID)
非常感谢您的关注,对于任何拼写错误或格式错误,我深表歉意,仍在学习如何发表好的帖子。
编辑:我发现这个答案 或多或少地解决了第一个问题,即是否可以在 Delete 调用中发送实体,但如果应该的话,现在还是不要最好让他们改变他们的方法
如 Ewramner 和 VoiceOfUnreason 的评论以及编辑所述:
1:在 Whosebug 的旧版 post 中找到了有关如何制作此内容的答案:
2:关于“我应该只与制作 API 的人谈谈并要求他们更改配置以允许我们通过参数发送信息吗?”的答案。得到了两人的回答。虽然不被禁止,但不推荐这样做。
我的行动方针是:
1:与负责 API 的人员交谈,向他们提供有关此情况的信息。
2:要求我们的架构团队创建一个新方法,允许我们对实体主体进行 HttpDelete 调用,以防万一我们必须进行更多 API 调用。
有了这个我想我所有的答案都解决了。
再次感谢。
我必须在客户端的 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
我假设为了做到这一点,我需要一个新的 HttpDelete 来允许我们使用实体,如果可能的话,你能给我一些例子吗?
2:根据我对上面发布的链接的理解,虽然不禁止在删除调用中使用实体,但不鼓励这样做,我应该只与制作 API 和要求他们更改配置以允许我们通过参数发送信息? (这不是个人或敏感信息,只是一堆ID)
非常感谢您的关注,对于任何拼写错误或格式错误,我深表歉意,仍在学习如何发表好的帖子。
编辑:我发现这个答案 或多或少地解决了第一个问题,即是否可以在 Delete 调用中发送实体,但如果应该的话,现在还是不要最好让他们改变他们的方法
如 Ewramner 和 VoiceOfUnreason 的评论以及编辑所述:
1:在 Whosebug 的旧版 post 中找到了有关如何制作此内容的答案:
2:关于“我应该只与制作 API 的人谈谈并要求他们更改配置以允许我们通过参数发送信息吗?”的答案。得到了两人的回答。虽然不被禁止,但不推荐这样做。
我的行动方针是:
1:与负责 API 的人员交谈,向他们提供有关此情况的信息。
2:要求我们的架构团队创建一个新方法,允许我们对实体主体进行 HttpDelete 调用,以防万一我们必须进行更多 API 调用。
有了这个我想我所有的答案都解决了。
再次感谢。