Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.03.2012, 18:10
Аватар для TolAlik
TolAlik TolAlik вне форума
Прохожий
 
Регистрация: 02.10.2009
Сообщения: 41
Репутация: 10
Вопрос GoogleAPI Fusion Tables не отправляется запрос методом POST

Здрасте, всем!
Пишу программу, которая авторизуется и создает fusion tables, на сервисе google, с помощью sql запроса.
Работа осуществляется через Synapse.
Проблема возникает при отправке самого запроса на создание этой пресловутой таблицы, в ответе от сервера сказано, что отправленный sql запрос пустой:
Код HTML:
<HTML> <HEAD> <TITLE>The 'sql' parameter cannot be empty</TITLE> </HEAD> <BODY BGCOLOR="#FFFFFF" TEXT="#000000"> <H1>The 'sql' parameter cannot be empty</H1> <H2>Error 400</H2> </BODY> </HTML>
Вот сам код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Data: TStringList;
  Response:TMemoryStream;
  sql, URL, Params, Log, Psw:string;
  http:THTTPSend;
begin
http:=THTTPSend.Create;
  try
    Response := TMemoryStream.Create;
    sql:=EncodeURLElement('sql=CREATE TABLE Animal (animal: STRING, fav_food: STRING, population: NUMBER, location: LOCATION, timestamp: DATETIME)');
    URL := 'https://www.google.com/accounts/ClientLogin';
    http.Protocol:='1.1';
    http.AddPortNumberToHost:=False;
    http.MimeType:='application/x-www-form-urlencoded';
    Params := 'accountType=HOSTED_OR_GOOGLE&Email=' + EncodeURLElement(Edit1.Text) +
              '&Passwd=' + EncodeURLElement(Edit2.Text)+'&service=writely&source=Google Chrome';
// Авторизация
    if HttpPostURL(URL, Params, Response) then
    begin
      try
        Data:=TStringList.Create;
        Response.Seek(0, soFromBeginning);
        Data.LoadFromStream(Response);
        Params:=Data.Text;
        http.Headers.Add(Trim(Copy(Params, Pos('Auth=', Params) + 5, Length(Params))));
// Отправка sql запроса
        http.Headers.Add('GData-Version: 3.0');
        url:='https://fusiontables.googleusercontent.com/fusiontables/api/query?encid=true';
        WriteStrToStream(HTTP.Document, sql); //задаю sql запрос
    if http.HTTPMethod('POST',url) then
      Memo1.Lines.LoadFromStream(http.Document);
      finally
        Data.Free;
        Response.Free;
      end;
    end;
  finally
    http.Free;
  end;
end;
В документации гугл сказано, что sql=<statement> задается в теле POST.
Видимо я, что-то не так делаю и не знаю как правильно это сделать. Пользуюсь synapse'сом только неделю. Подскажите где ошибка?

Последний раз редактировалось TolAlik, 07.03.2012 в 02:28. Причина: Найдено решение
Ответить с цитированием
  #2  
Старый 07.03.2012, 02:48
Аватар для TolAlik
TolAlik TolAlik вне форума
Прохожий
 
Регистрация: 02.10.2009
Сообщения: 41
Репутация: 10
По умолчанию

Еще раз здратсте!
Покумекав еще несколько дней, подзубрив английский и наконец-то правильно прочитав документацию, нашел решение
Думаю, данный пример многим будет интересен, если кто захочет поработать с сервисом google геокодирование. Надеюсь, из документации вы поймете, в чем связь между Fusion Tables и геокодирование в google.
Вот сам код:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  sql, URL,s:string;
  AuthStr: string;
begin
  with THTTPSend.Create do 
  try
    sql:='CREATE TABLE SaleInformation (customer:NUMBER)';  //Здесь формируется sql запрос на создание таблицы
    AuthStr:='Authorization: GoogleLogin auth=' + GetAuthIdHTTP(Edit1.Text, Edit2.Text); //Здесь получаем ключ авторизации
    Headers.Add('GData-Version: 3.0'); 
    Headers.Add(AuthStr); //Записываем ключ авторизации в Headers
    MimeType:='application/x-www-form-urlencoded';  //из документации
    Protocol:='1.1';   //из документации
    AddPortNumberToHost:=False;  //из документации
    URL:='https://fusiontables.googleusercontent.com/fusiontables/api/query?encid=true';   //адрес для отправки запроса (из документации)
    Document.Clear;
    WriteStrToStream(Document, 'sql='+EncodeURL(sql));  //Записывает тело потока наш запрос
    if HTTPMethod('POST',URL) then   //Отправка данных методом POST
      Memo1.Lines.LoadFromStream(Document); //Вывели ответ сервера
  finally
    Free;
  end;
end;
Процедуру авторизации приводить не буду, думаю что, используя документацию GoogleAPI, это не составит труда написать по типу ClientLogin или OAuth. Дерзайте
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter