Удалить сообщение с помощью Blogger API - PullRequest
1 голос
/ 14 апреля 2011

Я использую API протокола Blogger и не могу удалить сообщения.Я работаю на устройстве webOS и поэтому не могу отправить DELETE напрямую;вместо этого я использую обходной путь Google, чтобы использовать POST:

deletePostList: function(event)
{
    var deletePostID = event.item.id.split('.').pop().split('-').pop();
    var deleteRequest = new Ajax.Request("http://www.blogger.com/feeds/" + activeBlogID + "/posts/default/" + deletePostID,
    {
        method: 'post',
        requestHeaders:
        {
            Authorization: 'GoogleLogin auth=' + authCode,
            "X-HTTP-Method-Override": "DELETE",
            "If-Match": "*"
        },
        onSuccess: this.deletePostRequestSuccess.bind(this),
        onFailure: this.deletePostRequestFailure.bind(this)
    });
},

Это, кажется, работает, то есть deletePostRequestSuccess вызывается после этого процесса, и все заголовки и текст ответа выглядят так, как я думаю, что они должны были бы при удалениисообщение, но реальность такова, что сообщение остается в ленте.Я попытался добавить заголовок «If-Match», чтобы убедиться, что это не было условное удаление GData, удерживающее меня (хотя я ничего не изменил в посте в это время), но это, похоже, не помогает.

Есть идеи, как заставить это работать?Я хотел бы придерживаться протокола, поскольку он является родным для webOS, тогда как jQuery и т. Д. - нет.

1 Ответ

2 голосов
/ 25 апреля 2011

Насколько я могу судить, ваша проблема с методами HTTP связана не с webOS, а с прототипом в соответствии с источником .

Я бы предложил создать подкласс:


<script type="text/javascript">
var MyAjaxRequest = Class.create(Ajax.Request, {</p>

<p>request: function(url) {
    this.url = url;
    this.method = this.options.method;
    var params = Object.isString(this.options.parameters) ?
          this.options.parameters :
          Object.toQueryString(this.options.parameters);</p>

<p>/* comment out this stuff that prevents you from using the DELETE method</p>

<pre><code>if (!['get', 'post'].include(this.method)) {
  // simulate other verbs over post
  params += (params ? '&' : '') + "_method=" + this.method;
  this.method = 'post';
}

* /

if (params && this.method === 'get') {
  // when GET, append parameters to URL
  this.url += (this.url.include('?') ? '&' : '?') + params;
}

this.parameters = params.toQueryParams();

try {
  var response = new Ajax.Response(this);
  if (this.options.onCreate) this.options.onCreate(response);
  Ajax.Responders.dispatch('onCreate', this, response);

  this.transport.open(this.method.toUpperCase(), this.url,
    this.options.asynchronous);

  if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);

  this.transport.onreadystatechange = this.onStateChange.bind(this);
  this.setRequestHeaders();

  this.body = this.method == 'post' ? (this.options.postBody || params) : null;
  this.transport.send(this.body);

  /* Force Firefox to handle ready state 4 for synchronous requests */
  if (!this.options.asynchronous && this.transport.overrideMimeType)
    this.onStateChange();

}
catch (e) {
  this.dispatchException(e);
}

});

Таким образом, вы можете использовать method: 'DELETE'

...