2012-10-09 3 views
0

D2L Valence의 프로필 정보를 업데이트하려고합니다. GET 요청을 사용하여 정보를 성공적으로 다운로드했습니다. 그러나 간단한 업데이트를 완료하기 위해 요청을 형식화하는 방법을 잘 모르겠습니다.desire2learn 간단한 PHP PUT 업데이트

이 경우 프로필 json 블록의 복사본을 다운로드하고 닉네임 필드를 변경했습니다. d2l 클래스가 첫 번째 줄에서 호출되는 것을 염두에 두지 마십시오. 그것은 JSON 프로파일 블록을 얻을, 나는 그것을 변경하고 난 다음 그것을 밖으로 인쇄하는 경우, 나는이이 코드에서 내 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))    

입니다

{"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":""}]} 

을 얻을, 나는이 응답을 얻을

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 


) 

나는 분명히 뭔가를 놓쳤습니다. 제게 올바른 방향으로 조언하거나 알려주십시오.

+0

입니다. ($ ch를, CURLOPT_HTTPHEADER, 배열 ("HTTP/1.1", "콘텐츠 형식 : 응용 프로그램/JSON은")) 'curl_setopt에 헤더를 변경,' 가 CURLOPT_PUT에 CURLOPT_POST을 변경 – Johnnygizmo

+0

도움이되지 않는 것은 HTTP 변경 docs는 프로파일 업데이트가 POST가 아닌 PUT이라고 말하기 때문에 코드를 302로 설정합니다. – Johnnygizmo

+0

나는 문제를 해결했다. (2 일간의 작업 후) SO가 허락하자마자 나는 대답을 게시 할 것이다. – Johnnygizmo

답변

0

여기에는 업데이트를 수행하는 PHP 코드 블록이 필요합니다.

$ 데이터는 JSON

$ opContext의 텍스트를 $ authContext-로 작성된 유효한 사용자 컨텍스트> createUserContext() 인 스트링이다.

$의 URL이

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

에 문제가 그러나 나는이 순간을 위해 함께 살고 당신이

나는 깨닫는다로 보내려는 REST 경로입니다.

여기에 내가 컨텐트 유형 및 주위 밀어 시도한 코드

$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; 
0

당신의 후속 코멘트에서 귀하의 질문에 대한 답변을했지만 myProfile update route은 POST가 아닌 HTTP PUT을 사용합니다. 이것은 대부분의 Valence API에서 발생합니다 (POST 생성 경로 사용 및 PUT 사용 경로 업데이트).

+0

네, 그게 내 문제의 절반이었고, 나머지 절반은 헤더 등을 어떻게 포맷하여 cURL과 함께 사용할 수 있는지에 관한 것이 었습니다. 내가 어떻게 작동하는지에 대한 아래의 나의 대답을보십시오. – Johnnygizmo

+0

귀하의 예는 매우 유용합니다! D2L에 PHP 샘플과 관련하여 자신의 문서를 개선하는 것에 반대 하시겠습니까? –

+0

괜찮습니다! 나는 다른 사람들에게 도움이 될만한 나의 PHP2 클래스에 내장 된 다른 PHP 샘플을 가지고있다. – Johnnygizmo