2017-10-18 2 views
0

나는 여기에 대한 기대와 모순에 시달리고있어 누군가가 나를 도울 수 있기를 바랍니다. 난 미치지 않아.POST 몸체가 TFS REST 끝점에 application/json으로 설정된 PHP 컬 요청으로 채워지지 않음

Node.js와 PHP를주고받는 데이터의 주 프로세서로 사용하는 온 - 프레미스 Microsoft TFS REST 끝점에서 양방향 슬랙 통합을 시도하고 있습니다. NTLM 인증을 사용하여 온 - 프레스 TFS 설치에 대해 성공적으로 GET을 수행하고 데이터를 슬랙에 파싱 할 수 있습니다. 그래서 (1) 엔드 포인트가 작동하고 (2) 인증 할 수 있음을 압니다.

그러나 TFS REST 끝점에 대해 쿼리를 실행하려면 콘텐츠 형식이 "application/json"또는 "application/json + patch"인 요청을 보내야합니다. PHP 또는 네이티브 Node.js 응용 프로그램에서 컬을 사용하여 내가 뭘하든 관계없이 요청 본문에서 끝점으로 보낼 쿼리를 가져올 수 없습니다. 다른 페이지를 사용하여이를 테스트 해보고, content-type을 "multipart/form-data"또는 다른 표준 유형으로 설정하면 본문을 보낼 수 있지만 TFS는 이러한 요청을 잘못된 content-type으로 거부합니다.

"application/json"콘텐츠 유형이 모두 이고 인 POST 요청을 보내는 사람이라면 PHP 또는 Node.js를 사용하여 본문이 포함될 것입니다.

여기 내가 사용하고 정확한 PHP의 (몸을 게시하지 않는,하지만 (file_get_contents를 사용하여 PHP 읽을 수 있습니다 후 데이터 않는 'PHP는 : // 입력')) :

$ch = curl_init(); 
curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_POST, TRUE); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,TRUE); 
curl_setopt($ch, CURLOPT_HEADER, TRUE); 
curl_setopt($ch, CURLOPT_URL,$baseURL);  
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); 
curl_setopt($ch, CURLOPT_USERPWD, $userpwd); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postBody); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json', 
    'Transfer-Encoding: chunked', 
    'x-metadata: testing', 
    'x-testing: This is a value' 
)); 
$result = curl_exec($ch); 

다음은 TFS의 오류 응답입니다.

"요청 본문에 쿼리 개체를 전달해야합니다."

"는 요청의 콘텐츠 형식을 표시 : 나는 콘텐츠 형식 헤더 완전히 제거을 변경하는 경우

, 몸은 내가 TFS에서이 오류가 다음 (다른 PHP 페이지를 통해 확인) 전송되지만, application/json, application/json-patch + json. "이 메서드의 유효한 내용 유형은"application/j-www-form-urlencoded \ "입니다.

업데이트

그래서 나는 사용자 지정 요청을 사용하여 HTTP 엔드 포인트에 몸을 전달하는 요청을받을 수 있지만,이 HTTPS 엔드 포인트 호스트 TFS 인스턴스에 연결하려고 할 때, 모든 헤더는 점점 위의 마지막 오류를 반환합니다. HTTP로 전송

'request_header' => string 'POST /tfs/{PROJECT}/_apis/wit/wiql?api-version=2.0 HTTP/1.1 
Authorization: NTLM {TOKEN} 

헤더 : HTTPS로 전송

헤더

$ch = curl_init(); 
curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
// curl_setopt($ch, CURLOPT_POST, TRUE); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,TRUE); 
curl_setopt($ch, CURLOPT_HEADER, TRUE); 
curl_setopt($ch, CURLOPT_URL,$baseURL);  
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); 
curl_setopt($ch, CURLOPT_USERPWD, $userpwd); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postBody); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json', 
    'Transfer-Encoding: chunked', 
    'x-metadata: testing', 
    'x-testing: This is a value' 
)); 
$result = curl_exec($ch); 

업데이트 # 2

: 여기

'request_header' => string 'POST /dev/tfs/post.php HTTP/1.1 
Host: {HOST} 
Accept: */* 
Transfer-Encoding: chunked 
x-metadata: testing 
x-testing: This is a value 
Content-Type: application/json 
40 
' (length=203) 

업데이트 된 PHP입니다

헤더의 "Content-Type : application/json"에서 "Accept : application/json"으로 변경하면 본문이 http 끝점으로 보내지 만 헤더는 여전히 https 끝점에서 삭제됩니다.

업데이트 # 3 내 크롬 브라우저에서으로 Restlet을 사용하여이 엔드 포인트에 성공적으로 요청을 할 수 있으므로,이 PHP 스크립트와 컬 사이의 전송에 TFS 엔드 포인트와 문제지만, 뭔가 표시되지 않습니다 요청합니다. 다음과 같은 추가하여 요청 및 응답 헤더를 캡처 할 수 있습니다

+0

제거하십시오 '''curl_setopt ($ ch를, CURLOPT_POST, TRUE);''' 및 추가 ' ''curl_setopt ($ ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt ($ ch, CURLOPT_POSTFIELDS, json_encode ($ postBody));''' –

+0

그냥 시도해 봤는데 어떤 이유로 헤더가 완전히 떨어지는 원인이되는 TFS 엔드 포인트 (https)에 연결하는 중, 표준 HTTP 연결 (다른 서버로). 'request_header'=> 문자열 "POST /tfs/[project]/_apis/wit/wiql?api-version=2.0 HTTP/1.1 권한 : NTLM [토큰] HTTP 헤더 'request_header'=> 문자열 ' POST /dev/tfs/post.php HTTP/1.1 호스트 : www.holyelvis.com 수락 */* 전송 인코딩 : 청크 X-메타 : X 테스트 테스트 :이 값 컨텐츠 - 인 형식 : application/x-www-form-urlencoded '(길이 = 203) – ctgilley

+0

콘텐츠 형식 헤더의 세미콜론도 콜론으로 변경해야합니다. 테스트 한 요점은 로컬에서 유효한 json 요청을하는 것입니다. 거기에서 일할 수 있을까요? https://gist.github.com/raddeus/a02c7fcb8ecec37c90f515dacc5fc506 –

답변

0

:

curl_setopt($ch, CURLOPT_ENCODING,""); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($ch, CURLOPT_TIMEOUT,10); 
curl_setopt($ch, CURLOPT_FAILONERROR,true); 
curl_setopt($ch, CURLOPT_ENCODING,""); 

curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 

$data = curl_exec($ch); 
if (curl_errno($ch)){ 
    echo 'Retreive Base Page Error: ' . curl_error($ch); 
} 
else { 
    $info = rawurldecode(var_export(curl_getinfo($ch),true)); 
    $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
    $responseHeader= substr($data,0,$skip); 

echo "<pre>$info\n================\n$responseHeader\n===============\n"; 
echo substr($data,$skip);