cURL не публикует строку запроса - PullRequest
0 голосов
/ 26 августа 2011

У меня нет такого опыта работы с cURL, и я потратил пару дней, пытаясь решить эту проблему: у меня есть проблема с тем, что cURL не добавляет строку запроса к моему URL в заголовках при отправке запроса POST;следовательно, «полезная нагрузка» не получена сервером, и служба, к которой я обращаюсь, вернула мне код состояния ошибки, который указал, что он не получил соответствующие данные.

Я думаю, что POST должен начинаться сполное доменное имя, но я не уверен.Если я публикую данные, не должно ли Content-Length быть '0' вместо того, что я получаю?

Исходящий заголовок выглядит так:

POST /rest/v1/oliver/groups/ORIGINNUMBER/member? HTTP/1.1
Accept: application/xml
Content-type: text/plain
User-Agent: Custom PHP Script
Host: campaign.oventus.com
Cookie:  JSESSIONID=SECRETCOOKIE
Content-Length: 95

Мой код php выглядиткак это:

<code>$fields_string = "firstName=$fname&amp;secondName=$sname&amp;password=$pass&amp;deviceAddress=$phonenumber&amp;notes=testing";

$url = "http://campaign.oventus.com/rest/v1/ACCOUNTNAME/groups/ORIGINNUMBER/member?";

  $header[] = "Accept: application/xml";
  $header[] = "Content-type: text/plain";
  $header[] = "User-Agent: Custom PHP Script";
  $header[] = "Host: campaign.oventus.com";
  $header[] = "Cookie: ".$cookie;

$cx = curl_init();
    curl_setopt($cx, CURLOPT_URL,$url);
    curl_setopt($cx, CURLOPT_POST, 5);
    curl_setopt($cx, CURLOPT_POSTFIELDS,$fields_string);
    curl_setopt($cx, CURLOPT_HTTPHEADER, $header);
    curl_setopt($cx, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($cx, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($cx, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($cx, CURLOPT_FOLLOWLOCATION, FALSE);
    curl_setopt($cx, CURLOPT_TIMEOUT, 15);
    curl_setopt($cx, CURLOPT_HEADER, 1);
    curl_setopt($cx, CURLINFO_HEADER_OUT, TRUE);
$final = curl_exec($cx);
$errors = curl_error($cx);
$errornos = curl_errno($cx);

$headcut2 = explode ("n/xml", $final);
$headstring2 = $headcut2[0]."n/xml";
$xmlstring2 = $headcut2[1];

    echo "<h2>Add to Group result: </h2>";
    echo "<p>RAW header: <code>$final</code></p>";
    //echo "<p>Response header: <code>".htmlentities($headstring2)."</code></p>";
    echo "<p>XML response: <code>".htmlentities($xmlstring2)."</code></p>";
    //echo "<p>".print_r($info)."</p>";
    //echo "<p>CURL info: $info</p>";
    //echo "<p>Curl error: $errors</p>";
    echo "<p>Curl error num: $errornos</p>";

    print "<pre>\n";
    print_r(curl_getinfo($cx));  // get error info
    print "
\ n "; curl_close ($ cx);

И возвращаемый сервером заголовок выглядит так:

HTTP/1.1 200 OK Date: Fri, 26 Aug 2011 17:30:12 GMT 
Server: Apache/2.2.17 (Unix) DAV/2 Content-Length: 144 
X-Powered-By: Servlet/2.5 JSP/2.1 Cache-Control: no-store, no-cache 
Vary: Accept-Encoding,User-Agent Pragma: no-cache 
Content-Type: application/xml 202

С возвращеннымXML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<status xmlns="http://jaxb.rest.pageone.com" description="No Devices to add">202</status>

Насколько я могу судить, я определенно поражаю сервер, но, похоже, он не получает данные, которые я ему отправляю ..

В тупикеНадеюсь, что кто-то может направить меня в правильном направлении!

Ура,

1 Ответ

1 голос
/ 26 августа 2011

Похоже, что вы попали на сервер, и, вероятно, данные собираются ... Я думаю, что ответ лежит в 202:No Devices to add ..., что должна объяснить документация интерфейса REST (возможно, вы пропустили обязательное поле?){202 FYI означает, что принято, но обработка не была завершена, это также может означать, что пользователь существует}

Кстати, вы должны избегать тех аргументов, которые вы вводите в полезную нагрузку POST ($fname, $sname,$pass, $phonenumber) ... в противном случае странное значение (скажем, имя) может привести к тому, что сообщение будет действовать совершенно иначе, чем вы ожидали.Вы можете сделать это, используя urlencode, или вместо этого построив строку POST с http_build_query

<?php
$fields_string=http_build_query(array(
   "firstName"=>$fname,
   "secondName"=>$sname,
   "password"=>$pass,
   "deviceAddress"=>$phonenumber,
   "notes"=>"testing"));
//...
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...