как правильно отформатировать ajax POST для базового лагеря

Я могу легко создать сообщение из оболочки bash, используя метод curl, описанный в документации по api basecamp. Однако мое приложение не написано на php, поэтому я хотел бы иметь доступ к серверу basecamp через базовый пост ajax. К сожалению, мне кажется, что я не могу перевести оператор curl в сообщение ajax. Я думал, этого будет достаточно:

function callBasecamp() {
    var parameters = {  
              user:"[my_basecamp_username]",
              pass:"[my_basecamp_password]",
              userAgent: '[my_app] (my_email)',
              contentType: 'application/json; charset=utf-8',
      data: ({ "subject": "This is a Test Message", "content": "This is test content. Please disregard if notified." }),
             };
    var data = JSON.stringify(parameters);
    $.ajax({
        type: "POST",
        data: data,
        dataType: 'json',
    url: "../../../../site_media/proxy.php?url=https://basecamp.com/[account_id#]/api/v1/projects/[project#]/messages.json?" + data,
        traditional: true,
        success: function(data){
            console.log(data);
        }
    });
}

но хотя мой сервер разработки возвращает ответ HTTP 200 216, basecamp не создает сообщение, и я не вижу возвращенных данных. Я использую прокси-сервер php, чтобы обойти проблемы csrf django:

proxy.php

<?php
// File Name: proxy.php
if (!isset($_POST['url'])) die();
$url = urldecode($_POST['url']);
$url = 'https://' . str_replace('https://', '', $url); // Avoid accessing the file system
echo file_get_contents($url); 

есть идеи о том, где могут быть мои трудности?


person kjarsenal    schedule 16.03.2014    source источник
comment
../../../../ - ой. Плохой...   -  person random_user_name    schedule 16.03.2014
comment
@cale - отметил, будет рассмотрен.   -  person kjarsenal    schedule 16.03.2014


Ответы (1)


Прокси-сервер не пересылает правильно. Попробуйте добавить заголовки на свой proxy.php:

header('Access-Control-Allow-Origin: *');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');

Для JSON-P: header('Content-Type: application/javascript');

Помощник по отладке для file_get_contents ()

$url1 = 'https://basecamp.com/999999999/api/v1/projects.json';
$url2 = 'https://basecamp.com/2052106/api/v1/projects/1450272/messages.json';

function send($url, $payload) {
  $ctx = stream_context_create(
    array(
      'http'=>array(
        'header'=> "Content-type: application/json\r\n"
                 . "Access-Control-Allow-Origin: *\r\n"
                 . "User-Agent: myApp ([email protected])\r\n"
                 . "Accept: xml/*, text/*, */*\r\n",
        'method'=> 'GET',
        //'content'=> $payload,
        'ignore_errors' => true
      )
    )
  );

  $result = file_get_contents($url, 0, $ctx);

  var_dump($http_response_header);

  return $result;

}

// The expected return is:
// There's no Basecamp account at this address. ....
echo send($url1, '');

// expected return: {"status":"404","error":"Not Found"}
echo send($url2, '');

Использование для тестового запроса с полезной нагрузкой:

Примечание: вы можете переключить GET на POST внутри параметров stream_content:

$url = 'https://basecamp.com/2052106/api/v1/projects/1450272/messages.json';

$payload = '{"user":"123",
             "pass":"123",
             "userAgent":"test [email protected]",
             "contentType":"application/json; charset=utf-8",
             "data": {
                "subject":"This is a Test Message",
                "content":"This is test content. Please disregard if notified."}
             }';

echo send($url, $payload);

Альтернативой является использование cURL из PHP: https://stackoverflow.com/a/15395769/1163786

person Jens A. Koch    schedule 16.03.2014
comment
Я получаю тот же результат, хотя и с немного другим ответом сервера HTTP / 1.1 200 402 - person kjarsenal; 16.03.2014
comment
Я добавил небольшой помощник по отладке. довольно сложно получить вывод из file_get_contents, если код состояния неверен. вот почему я создал контекст потока с ошибками игнорирования. также помощник выводит http_response_headers для запроса file_get_contents. это должно приблизить вас к ошибке. - person Jens A. Koch; 16.03.2014
comment
нп, пожалуйста. проблема в том, что я не могу протестировать сообщение с полезной нагрузкой, потому что у меня нет учетных данных для базового лагеря. но помощники должны увести вас довольно далеко - person Jens A. Koch; 16.03.2014