desire2learn PHP中的简单PUT更新
我正在尝试更新D2L价中的配置文件信息。我已经成功地使用GET请求下载了信息。但我不确定如何格式化我的请求以完成一个简单的更新 在本例中,我下载了一个profile json块的副本,并更改了昵称字段。不要介意在第一行调用d2l类。它得到json配置文件块,然后我修改它,如果我打印出来,我得到desire2learn PHP中的简单PUT更新,php,desire2learn,Php,Desire2learn,我正在尝试更新D2L价中的配置文件信息。我已经成功地使用GET请求下载了信息。但我不确定如何格式化我的请求以完成一个简单的更新 在本例中,我下载了一个profile json块的副本,并更改了昵称字段。不要介意在第一行调用d2l类。它得到json配置文件块,然后我修改它,如果我打印出来,我得到 {"Nickname":"Johnny","Birthday":null,"HomeTown":"","Email":"","HomePage":"","HomePhone":null,"Business
{"Nickname":"Johnny","Birthday":null,"HomeTown":"","Email":"","HomePage":"","HomePhone":null,"BusinessPhone":null,"MobilePhone":null,"FaxNumber":null,"Address1":null,"Address2":null,"City":null,"Province":null,"PostalCode":null,"Country":null,"Company":null,"JobTitle":"","HighSchool":null,"University":null,"Hobbies":"","FavMusic":"","FavTVShows":"","FavMovies":"","FavBooks":"","FavQuotations":"","FavWebSites":"","FutureGoals":"","FavMemory":"","SocialMediaUrls":[{"Name":"Facebook","Url":""},{"Name":"Twitter","Url":""},{"Name":"Google+","Url":""},{"Name":"LinkedIn","Url":""}]}
这是我的PHP
$output = d2l::get_user_profile($usercontext,"real_profile_id",true);
$output = str_replace("\"Nickname\":\"\"", "\"Nickname\":\"Johnny\"",$output);
$random_hash = md5(date('r', time()));
$url = $usercontext->createAuthenticatedUri("/d2l/api/lp/1.1/profile/real_profile_id","PUT");
$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=".$random_hash));
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$output);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, '/var/www/cacert.pem');
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
$response = curl_exec($ch);
print_r(curl_getinfo($ch))
从这个代码中,我得到了这个响应
Array
(
[url] => https://myurl.edu:443/d2l/api/lp/1.1/profile/myProfile?x_a=mykey&x_c=mykey&x_d=mykey&x_t=1349798248
[content_type] => text/html; charset=utf-8
[http_code] => 403
[header_size] => 218
[request_size] => 941
[filetime] => -1
[ssl_verify_result] => 20
[redirect_count] => 0
[total_time] => 0.171832
[namelookup_time] => 1.9E-5
[connect_time] => 0.033028
[pretransfer_time] => 0.105724
[size_upload] => 582
[size_download] => 13
[speed_download] => 75
[speed_upload] => 3387
[download_content_length] => 13
[upload_content_length] => 0
[starttransfer_time] => 0.171811
[redirect_time] => 0
[request_header] => POST /d2l/api/lp/1.1/profile/myProfile?x_a=mykey&x_c=mykey&x_d=mykey&x_t=1349798248 HTTP/1.1
Host: myurl.edu
Accept: */*
Content-Type: multipart/form-data; boundary=95b842a110e529794822be6870f2585c
Content-Length: 582
)
我可能错过了一些显而易见的事情。请给我提供建议或给我指出正确的方向。您在后续评论中回答了自己的问题,但使用HTTP PUT而不是POST:大多数Valence API通常都是这样(创建路由使用POST,更新路由使用PUT)。下面是一段用于执行更新的PHP代码,给任何需要它的人 $data是一个字符串,表示json的文本 $opContext是使用$authContext->createUserContext()创建的有效用户上下文 $url是要发送到的REST路径 我确实意识到这是一个问题
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
但我现在还活着
这是密码
$putData = fopen('php://temp/maxmemory:256000', 'w');
if (!$putData) {
die('could not open temp memory data');
}
fwrite($putData, $data);
fseek($putData, 0);
$url = $opContext->createAuthenticatedUri($url,"PUT");
$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: application/json"));
curl_setopt($ch, CURLOPT_PUT,true);
curl_setopt($ch, CURLOPT_INFILE,$putData);
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($data));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
$response = curl_exec($ch);
fclose($putData);
return $response;
我尝试过推广contenttype之类的东西。将标题更改为
curl_setopt($ch,CURLOPT_HTTPHEADER,array(“HTTP/1.1”,“内容类型:application/json”)代码>没有帮助将CURLOPT_POST更改为CURLOPT_PUT将http代码更改为302,因为文档说更新配置文件是一个PUT而不是POST。我已经解决了这个问题(工作2天后),我会尽快发布答案。是的,这是我问题的一半,另一半是如何格式化标题等,以便它可以与cURL一起工作。下面是我的答案,你的例子非常有用!你会反对D2L用它来增强他们关于PHP示例的文档吗?那很好!我在d2l PHP类中内置了一些其他PHP示例,这些示例可能对其他人也有帮助。