желание2узнать: создать путь пользовательского API

Я пытаюсь использовать путь

POST /d2l/api/lp/(D2LVERSION: version)/users/ 

и я сталкиваюсь с ошибкой. Я надеюсь, что в документации есть что-то, чего мне не хватает, потому что, насколько я могу судить, это должно работать.

HTTP/1.1 400 Bad request
Cache-Control: private
Content-Length: 0
Server: Microsoft-IIS/7.5
X-XSS-Protection: 0
X-Powered-By: ASP.NET
Date: Wed, 23 Jan 2013 18:37:07 GMT

Данные, которые я отправляю, выглядят так:

{
    "OrgDefinedId":"190006002",
    "FirstName":"Jesty",
    "MiddleName":"Q",
    "LastName":"McTest",
    "ExternalEmail":"[email protected]",
    "UserName":"190006002",
    "RoleId":115,
    "IsActive":true,
    "SendCreationEmail":true
}

Мой PHP-код на данный момент выглядит так:

    $random_hash = "xxBOUNDARYxx";
    $request ="--".$random_hash.
              "\r\nContent-Type: application/json\r\n\r\n$data\r\n\r\n--".
              $random_hash;

    $length=strlen($request);
    $url = $opContext->createAuthenticatedUri($url,"POST");

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLINFO_HEADER_OUT, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("HTTP/1.1", "Content-Type: multipart/form-data; boundary=xxBOUNDARYxx","Content-Length:".$length));
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST,true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
    return curl_exec($ch);      

person Johnnygizmo    schedule 23.01.2013    source источник


Ответы (1)


Хорошо, после нескольких часов возни я понял это. Исходный код, который я разместил, был основан на коде, который работал для публикации изображения профиля через API. Код для простой публикации JSON был намного проще. Вот общая функция PHP для отправки JSON в Valence с помощью метода POST.

/*
*  $opContext is your user context object
*  $url is the route
*  $data is the well formed JSON in a string ( use json_encode() ) 
*  $ct is the count of json fields
*/

static function basic_post($opContext,$url,$data,$ct){
    $url = $opContext->createAuthenticatedUri($url,"POST"); 
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLINFO_HEADER_OUT, true);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST,$ct);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
    return curl_exec($ch);  
}
person Johnnygizmo    schedule 24.01.2013
comment
Это верно. Когда все, что вам нужно отправить, — это стандартная структура JSON и ничего больше, вы просто устанавливаете Content-Type в application/json и отправляете JSON в теле. Если вам нужно опубликовать данные файла, то, как правило, вам нужен тип содержимого multipart-mixed, где первая часть представляет собой дескриптор файла JSON, а вторая часть — данные файла. - person Viktor Haag; 25.01.2013
comment
Что приятно, так это то, что теперь у меня есть общие функции для получения, размещения, публикации и удаления для валентности. Таким образом, у меня есть хороший уровень абстракции, который позволяет мне сосредоточиться на текущей задаче, а не на правильной настройке curl. - person Johnnygizmo; 27.01.2013
comment
Я полностью согласен; это одна из причин, по которой я добавил вспомогательные модули data и service в клиентский SDK Python. Я не могу утверждать, что они потрясающе хорошо написаны, так как я новичок в Python, но это помогло мне решить тот же класс проблем. - person Viktor Haag; 25.04.2013