2011-03-29 2 views
2

PHP에서 REST 서비스와 클라이언트를 설정했으며 PUT에 약간의 문제가 있습니다.PHP로 파일 및 데이터 배열로 PUT 요청을 보내는 방법

여기 내 상황이 있습니다 : 데이터 및 이미지 배열을 받아 들여야하는 REST 리소스를 코딩하고 있습니다. REST 리소스는 기존 레코드를 업데이트해야하므로 PUT을 사용하고 있습니다. 필자가 작성한 PHP 컬 클라이언트로 데이터를 보내고 있습니다. 따라서 파일 업로드를하고 PUT 및 PHP 컬을 제외하고 일부 POST 필드를 허용하는 PHP 스크립트에 HTML 멀티 파트 폼을 보내는 경우와 거의 같은 상황입니다.

위로 '지금까지' 과 같이 서버에서 데이터를

$a_some_data = array('name' => 'test', 'user_id' => 4); 
$body = http_build_query($a_data); 

$fh = fopen('php://memory', 'rw'); 
fwrite($body); 
rewind($fh); 

$ch = curl_init(); 
curl_setopt_array($ch, array(
    CURLOPT_URL => 'http://myapi/resource/someid', 
    CURLOPT_PUT => TRUE, 
    CURLOPT_INFILE => $fh, 
    CURLOPT_INFILESIZE => strlen($body) 
)); 
curl_exec($ch); 

독서 :했습니다이 (의사 코드) 같은 PUT 요청 뭔가를 보내고 잘 작동 요식

parse_str(file_get_contents('php://input'), $put_data); 

합니다.

이제는 (바이너리) 파일을 믹스에 추가하고 싶습니다. - 클라이언트 측에서 어떻게 구현합니까? - 서버의 파일을 어떻게 처리합니까?

테스트를 위해 파일 입력으로 HTML 양식을 설정하고 전송 한 multipart/form-data 요청을 복사 한 다음 해당 데이터를 PUT 요청에서 컬링 된 파일로 전송하려고했습니다. 그런 종류의 작업이지만 수동으로 서버의 원시 데이터를 구문 분석해야하는데, 이것이 가장 좋은 아이디어인지는 확실하지 않습니다. 또는, 파일을 PUT 요청의 본문으로 보내고 다른 매개 변수를 URL에 쿼리 문자열로 추가 할 수 있다고 생각합니다. 그러나 PUT REST 리소스의 요점을 무시하는 것 같습니다.

이 점에 대해 의견을 나누십시오. 감사합니다.

답변

2

원본 버전이 충분하지 않으면 (libcurl은 해당 스크립트로 이진 파일도 잘 처리해야하기 때문에) 적어도 두 가지 다른 방법이 있습니다. 수신단에서 PUT을받는 방법을 결정하는 데 문제가있는 것은 아니므로이 응답에서 제외하겠습니다.

1 - 시작한 것처럼, 데이터를 보낼 libcurl에 데이터를 공급하는 CURLOPT_READFUNCTION을 제공합니다.

2 - (문자열로) 사용 CURLOPT_POSTFIELDS과는 POST처럼 보이게 한 다음

+0

감사 다니엘을 "PUT"하는 CURLOPT_CUSTOMREQUEST와 HTTP 방법을 변경합니다. 두 번째 버전은 마음에 들지만 요청은 여전히 ​​PUT으로 보내지 만 여러 부분으로 된 콘텐츠로 전송됩니다. 이제 php : // 입력으로 서버에 올라온 데이터는 HTML 폼으로 모든 것을 보낸다면 얻을 수있는 것입니다. 가장 좋은 방법은 파싱에 대해 무엇을 알아야할까요? 이 원시 데이터에서 데이터와 파일을 추출하는 좋은 방법이 있습니까? 아니면 수동으로 파싱해야합니까? – Chris