преобразовать запрос Python в эквивалент PHP-cURL - PullRequest
0 голосов
/ 30 октября 2010

Я отправляю запрос POST на URL.В Python он работает правильно, но в php-curl я всегда получаю ошибку неверного запроса (т.е. мои данные POST не соответствуют ожиданиям сервера)

Код Python: (работает правильно. 200 OK)

import httplib, urllib, json

def SendRequest(param1):
    url = "api.xyz.com"
    body = {"version": "1.0", "data":[{"param1":param1, "age":35}]}
    jsonBody = json.dumps(body)

    headers = {"Content-type": "application/json",
               "Accept": "application/json; charset=utf8"}
    conn = httplib.HTTPConnection(url)
    conn.request("POST", "/api/?client_id=xx-xx-xx", jsonBody, headers)
    response = conn.getresponse()

php-cURL код (не работает. 406 Ошибка неверного запроса)

function sendCurlRequest($param1)
{
    $payload = preparePayload($param1); 
    $url = "http://api.xyz.com/api/?client_id=xx-xx-xx"; 
    $jsonResponse = executePOSTRequest($url, $payload);
    $response = json_decode($jsonResponse);
}

function preparePayload($param1)
{
    $payload = array("version" = "1.0",
                     "data" => array(array("param1" => $param1,
                                           "age" => 35
                                          )
                                    ),
                    );

    $jsonPayload = json_encode($payload);
    return $jsonPayload;
}

function executePOSTRequest($url, $payload)
{
    $newlines = array("\r", "\n", " ");
    $url = str_replace($newlines, '', $url);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_HTTPHEADERS,array('Content-Type:application/json; Accept: application/json; charset=utf8'));

    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);
}

Я знаю, что в моем использовании cURL есть какая-то ошибка.Пожалуйста, предложите.

Обновление: использование двойного массива в php связано с тем, что сервер ожидает строку JSON (полезную нагрузку POST) в этом формате

{
"version": "1.0",
"data":
[{"param1":name, "age":35},{"param1":name,"age":60}]
}

В python я использую список dict;в php я думаю, что это только массив массивов.

Ответы [ 3 ]

1 голос
/ 30 октября 2010

Я не уверен, вызывает ли это вашу проблему, но я вижу разницу между ними: В коде python вы отправляете две строки заголовка: Content-Type и Accept. Находясь в коде PHP, они представляют собой одну строку.

1 голос
/ 31 октября 2010

Отсутствует индекс параметра - поля CURL POST необходимо отправлять в виде строки запроса или в виде массива.

Либо:

curl_setopt($ch, CURLOPT_POSTFIELDS, 'payload=' . urlencode($payload));

Или

curl_setopt($ch, CURLOPT_POSTFIELDS, array('payload' => $payload));

Замените payload на имя параметра, ожидаемого API для хранения строки JSON.

Если API конечной точки не ожидает параметр, то он должен работать - он просто не появитсяв массиве POST в вашем тестовом скрипте.Вы можете получить тело содержимого POST, используя

$data = file_get_contents("php://input");
var_dump($data);
1 голос
/ 30 октября 2010

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

Мой совет:

  • Создайте небольшой тестовый сервер, используя python BaseHTTPServer и извлечь класс из BaseHTTPRequestHandler это не сделать что-нибудь, но обеспечить переопределение do_POST метод

  • Ваш do_POST должен просто сбросить заголовки и тело POST, которое он получает файл

  • Направьте свои примеры кода на это маленький тестовый сервер, а затем diff файлы, которые он создает. я догадываюсь что если ответ не сразу очевидно, вы по крайней мере получите один или несколько полезных подсказок, чтобы топать эта проблема решена.

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