Проблема использования веб-службы RESTful WCF с php curl - PullRequest
0 голосов
/ 27 августа 2010

У меня проблемы с использованием веб-службы WCF (API PaySimple v3.00) с использованием php curl. Я пытаюсь опубликовать полезную нагрузку xml в сервисе и получаю сообщение об ошибке 400 - Bad Request. Когда я использую дополнение для Firefox Poster, я могу опубликовать ту же полезную нагрузку и получить ожидаемый ответ - 200 ОК с ответом XML, содержащим требуемый ответ. Вот фрагмент моего кода:

        $ch = curl_init();
        $payload = $createPayload();
        $length = strlen($payload);
        $headers = array("Expect:");
        if($isPost)
        {
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
            $headers[] = "Content-length: $length";
        }
        else {
            curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
        }
        if($requestType == 'xml')
        {
            $headers[] = 'Content-Type: text/xml; charset: utf-8';
            $headers[] = 'Accept: application/xml';
        }
        else {
            $headers[] = 'Content-Type: application/json; charset: utf-8';
            $headers[] = 'Accept: application/json';
        }            
        $headers[] = "Connection: close";
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
        //debugging
        curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
        $fh = fopen('curl_debug.txt', 'w');
        curl_setopt($ch, CURLOPT_STDERR, $fh);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);            
        $response = curl_exec($ch);
        curl_close($ch);

$ payload содержит следующее значение:

<AddCustomer xmlns="http://api.paysimple.com"><userkey>APIUser1989</userkey><apikey>pxTbp4F6y7JuaMu36qazEw51JiqUA7lGme0j62r3UeQyNojvEfpNo7tn4pLq0yEULHz5KykHWV6AjNQJEyskCw0tXSKZ0vcP5mCynh1IgfQEH4NdXRkXeMNAGEdx6Ee0</apikey><customer xmlns="http://api.paysimple.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ApiConsumerData/><PsReferenceId>0</PsReferenceId><AltEmail>testemail@paysimpledev.com</AltEmail><AltPhone/><BillingAddress1>TestBillingAddress1</BillingAddress1><BillingAddress2/><BillingCity>TestBillingCity</BillingCity><BillingCountryCode/><BillingPostalCode>80202</BillingPostalCode><BillingState>6</BillingState><CompanyName>TestCompany</CompanyName><CreatedOn>0001-01-01T00:00:00</CreatedOn><Email>testemail@paysimpledev.com</Email><Fax/><FirstName>TestFirstName</FirstName><LastModified>0001-01-01T00:00:00</LastModified><LastName>TestLastName</LastName><MiddleName/><Notes/><Phone>5551234567</Phone><ShippingAddress1/><ShippingAddress2/><ShippingCity/><ShippingCountryCode/><ShippingPostalCode/><ShippingSameAsBilling>true</ShippingSameAsBilling><ShippingState>0</ShippingState><WebSite/></customer></AddCustomer>

Вот что появляется в curl_debug.txt:

  • О подключении () к порту sand3-api.paysimple.com 443 (# 0)
  • Попытка 165.193.50.51 ... * подключена
  • Подключено к sandbox-api.paysimple.com (165.193.50.51) порт 443 (# 0)
  • успешно установлен сертификат, проверьте места:
  • CAfile: нет CApath: / etc / ssl / certs
  • SSL-соединение с использованием RC4-MD5
  • Сертификат сервера:
  • тема: C = US; ST = Колорадо; L = Денвер; O = PaySimple, Inc .; OU = PaySimple; CN = *. Paysimple.com
  • дата начала: 2010-05-04 00:00:00 GMT
  • срок действия: 2011-06-29 23:59:59 GMT
  • эмитент: C = US; O = DigiCert Inc; OU = www.digicert.com; CN = DigiCert High Assurance CA-3
  • Сертификат SSL подтвердите.

POST /3.00/paysimpleapi.svc/xml/listcustomers HTTP / 1.1
Хост: sandbox-api.paysimple.com
Длина контента: 1153
Content-Type: text / xml; кодировка: utf-8
Принять: application / xml
Подключение: закрыть

HTTP / 1.1 400 Неправильный запрос
Подключение: закрыть
Дата: пт, 27 августа 2010 11:07:21 GMT
Сервер: Microsoft-IIS / 6.0
X-Powered-By: ASP.NET
X-AspNet-версия: 2.0.50727
Set-Cookie: ASP.NET_SessionId = oxpese454u4rr3552evybjue; Путь = /; HttpOnly
Cache-Control: приватный
Длина контента: 0

Закрытие соединения # 0

F1! F1!

Ответы [ 3 ]

0 голосов
/ 27 августа 2010

Проблема, вероятно, в одном из них:

Content-Type: text/xml; charset: utf-8
Accept: application/xml

Попробуйте text / xml или application / xml для обоих, попробуйте прописные буквы UTF-8. Попробуйте отправить те же заголовки, что и Firefox.

0 голосов
/ 30 августа 2010

Tash

Опубликовать на https://sandbox -api.paysimple.com / 3.00 / PaysimpleApi.svc / xml / addcustomer http / 1.1

использовать заголовок: Контент-длина: 1262 Тип контента: application / xml; кодировка = UTF-8 Принять: application / xml Метод: invokeMethod UserAgent: PaySimple Хост: sandbox-api.paysimple.com

Попробуйте запрос SandboxMelody qUWzSPxkcxDR6RJiR2ypzbznV4m6jva5N8kaosnNqQJYqNTGcVouWhKbN5NPGiZxJdmx2QnapYNcwq1bjtfmGwLhBcdMT6x3z7IdPVYA3H7HDBUqwW6eJDyaf8dhKqr0 0 Проспект буги-вуги 1122 # 6Город 801116CompanyName99999 0001-01-01T00: 00: 00w@w.comTestUser0001-01-01T00: 00: 00 LastNameЭто новый клиент ... от Fiddler3035551212 Проспект буги-вуги 1122 # 5Город 80111true6

ИСПОЛЬЗУЙТЕ ADDCUSTOMER в URL-адресе и теле запроса

0 голосов
/ 27 августа 2010

Тип содержимого вашего POST, вероятно, должен быть application / x-www-form-urlencoded или multipart / form-data, а не application / xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...