Есть ли способ разрешить Google App Engine отправлять тело или данные с запросом DELETE? - PullRequest
7 голосов
/ 06 февраля 2010

Я пытаюсь взаимодействовать с API, который требует, чтобы данные XML содержались в теле HTTP-запроса DELETE. Я использую urlfetch в AppEngine, и полезные данные просто игнорируются для запросов DELETE.

Прочитав эту статью: Разрешено ли тело сущности для запроса HTTP DELETE? , я понимаю, что стандарт, вероятно, не разрешает содержание тела в запросах DELETE, и поэтому urlfetch удаляет тело.

Итак, мой вопрос: есть ли какой-нибудь способ обойти содержимое тела в движке приложения, когда urlfetch игнорирует полезную нагрузку?

Ответы [ 3 ]

6 голосов
/ 06 февраля 2010

за документы ,

Служба получения URL поддерживает пять Методы HTTP: GET, POST, HEAD, PUT и УДАЛЯТЬ. Запрос может включать HTTP заголовки и содержание тела для POST или PUT запрос.

Учитывая, что среда исполнения GAE Python сильно загружена, очень маловероятно, что вы сможете обойти это ограничение. Я считаю это ошибкой, и вам, вероятно, следует подать отчет об ошибке здесь .

2 голосов
/ 26 мая 2016

Вы можете сделать запрос DELETE с телом через сокеты, пример Java-кода, который проверяет HTTPRequest и выполняет другой запрос на DELETE с телом:

public static HTTPResponse execute(HTTPRequest request) throws ExecutionException, InterruptedException {

    if (request == null) {
        throw new IllegalArgumentException("Missing request!");
    }

    if (request.getMethod() == HTTPMethod.DELETE && request.getPayload() != null && request.getPayload().length > 0) {
        URL obj = request.getURL();
        SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
        try {
            HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);

            con.setRequestMethod("DELETE");
            for (HTTPHeader httpHeader : request.getHeaders()) {
                con.setRequestProperty(httpHeader.getName(), httpHeader.getValue());
            }
            con.setDoOutput(true);
            con.setDoInput(true);

            OutputStream out = con.getOutputStream();
            out.write(request.getPayload());
            out.flush();
            out.close();
            List<HTTPHeader> responseHeaders = new ArrayList<>();
            for (Map.Entry<String, List<String>> stringListEntry : con.getHeaderFields().entrySet()) {
                for (String value : stringListEntry.getValue()) {
                    responseHeaders.add(new HTTPHeader(stringListEntry.getKey(), value));
                }
            }
            return new HTTPResponse(con.getResponseCode(), StreamUtils.getBytes(con.getInputStream()), con.getURL(), responseHeaders);
        } catch (IOException e) {
            log.severe(e.getMessage());
        }
    } else {
        Future<HTTPResponse> future = URLFetchServiceFactory.getURLFetchService().fetchAsync(request);
        return future.get();
    }
    return null;
}
0 голосов
/ 21 апреля 2015

Вы можете обойти это, используя API сокета App Engine, вот как это выглядит в Go:

    client := http.Client{
        Transport: &http.Transport{
            Dial: func(network, addr string) (net.Conn, error) {
                return socket.Dial(c, network, addr)
            },
        },
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...