【发布时间】:2015-11-27 07:52:57
【问题描述】:
我正在为https://api.ai 服务编写客户端应用程序,并将 org.springframework.web.client.RestTemplate 用于我的 HTTP 请求。
问题是DELETE请求总是返回错误405,
private static final String URL_INTENTS = "https://api.api.ai/v1/intents?v={apiVersion}";
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
httpHeaders.setAccept(Arrays.asList(new MediaType[]{MediaType.APPLICATION_JSON}));
httpHeaders.set("Authorization", "Bearer " + speaktoitConfig.getDeveloperAccessToken());
httpHeaders.set("ocp-apim-subscription-key", speaktoitConfig.getSubscriptionKey());
resp = restTemplate.exchange(
URL_INTENTS, HttpMethod.DELETE, new HttpEntity<String>(intentId, httpHeaders),
AiVocabulariesResponse.class, speaktoitConfig.getApiVersion()).getBody();
但是 PUT 和 GET 请求工作正常。
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
httpHeaders.setAccept(Arrays.asList(new MediaType[]{MediaType.APPLICATION_JSON}));
httpHeaders.set("Authorization", "Bearer " + speaktoitConfig.getDeveloperAccessToken());
httpHeaders.set("ocp-apim-subscription-key", speaktoitConfig.getSubscriptionKey());
resp = restTemplate.exchange(
URL_INTENTS, HttpMethod.PUT, new HttpEntity<String>(JsonMapper.MAPPER.writeValueAsString(aiQueryIntentsList), httpHeaders),
AiVocabulariesResponse.class, speaktoitConfig.getApiVersion());
我很确定 api.ai 支持 DELETE,因为它是写在他们的文档中的 https://docs.api.ai/docs/intents
您认为我的代码有问题,还是我应该写信给 api.ai 服务支持?
这是完整的测试代码
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import junit.framework.Assert;
import org.junit.Test;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class TestDeleteRequest {
@Test
public void test1DeleteRequest() {
Assert.assertTrue(testDeleteRequest());
}
public static final ObjectMapper MAPPER = new ObjectMapper();
static boolean testDeleteRequest() {
final RestTemplate restTemplate = new RestTemplate();
final String URL_INTENTS = "https://console.api.ai/v1/intents?v={apiVersion}";
final String API_VERSION = "20150901";
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
httpHeaders.setAccept(Arrays.asList(new MediaType[]{MediaType.APPLICATION_JSON}));
httpHeaders.set("Authorization", "Bearer " + "fc361168a9434289b7457408fa0acdd8");
httpHeaders.set("ocp-apim-subscription-key", "76dba252-3e56-488d-9350-22f32b3b55f0");
//download all elements headers
String respStr = null;
try {
respStr = restTemplate.exchange(
URL_INTENTS, HttpMethod.GET, new HttpEntity<String>("", httpHeaders),
String.class, API_VERSION).getBody();
} catch (Throwable e) {
return false;
}
//parse elements ids
List<String> intentIds = new LinkedList<>();
try {
int cnt = 1;
JsonNode rootNode = MAPPER.readTree(respStr);
Iterator<JsonNode> elements = rootNode.elements();
while (elements.hasNext()) {
JsonNode aiIntentNode = elements.next();
JsonNode aiIntentIdNode = aiIntentNode.path("id");
String aiIntentId = aiIntentIdNode.asText();
intentIds.add(aiIntentId);
}
} catch(Exception e) {
return false;
}
if (intentIds.isEmpty()) {
return false;
}
//try to delete the first one
try {
restTemplate.exchange(
URL_INTENTS, HttpMethod.DELETE, new HttpEntity<String>(intentIds.get(0), httpHeaders),
String.class, API_VERSION).getBody();
} catch (Throwable e) {
return false; //TODO catch HttpClientErrorException 405 Method no Allowed
}
return true;
}
}
【问题讨论】:
-
你能显示你的完整删除控制器以及你发送的请求吗?
-
如果您查看此链接中提供的示例,docs.api.ai/docs/intents、
DELETE方法示例的 url 为/intent/,这很奇怪,因为所有其他方法及其示例都定义为 @ 987654329@。甚至DELETE方法的 Heading 也被定义为/intents/{iid},但在示例中它仅以/intent/给出。尝试在您的DELETE请求中将/intents/替换为/intent/..
标签: java spring httprequest resttemplate