创建一个处理表单发布的API


Creating an API that handles a form post

最近有人要求我创建一个可以使用PHP处理数据的API。我不太习惯PHP,所以我不太确定如何继续。

基本上,我想实现的是创建一个API来处理用户可以调用的表单帖子:

<form METHOD="POST" ACTION="https://MyURL/index.php" id=aForm name=aForm>
   <input type="hidden" id="Lite_Merchant_ApplicationID" name="Lite_Merchant_ApplicationID" value="Your Application Id">
   (various other fields to be processed)
</form>

我将其称为API可能是错误的,因为它应该处理表单帖子。但我需要为用户编译文档,以便能够与我们的系统集成,并将表单发布到我们的URL,然后URL将处理表单中的信息。

有什么好的教程我可以看一下吗?我不确定我正在看的那些是否适用,因为它们没有提到使用表单调用API?例如。https://docs.phalconphp.com/en/latest/reference/tutorial-rest.html和http://coreymaynard.com/blog/creating-a-restful-api-with-php/

或者我只是在PHP中正常处理表单,并使用访问值

$_POST["name"];

如果是这种情况,用户是否可以使用他们选择的语言调用API?

我还有一个问题是,由于它将是"https",我是否需要查看或考虑什么?

提前感谢,我很抱歉,如果这不是很具体,任何建议/建议都将不胜感激。

其他信息:系统需要能够执行重定向,登录凭据将在隐藏的表单输入中发送

您的问题范围有点广,您可能使用的词语与我的理解不一致。

API通常不仅仅是一个方法,而处理表单POST事件只是一个表单处理程序。区别不仅仅在于语义-对于API,您可能需要考虑版本控制(如何在不破坏客户端应用程序的情况下升级API)、抽象(如何使API易于使用)、文档和安全(如何确保只有授权用户/应用程序使用您的API?)。API通常有多个用户,并且通常需要支持客户端应用程序的可扩展性要求
REST是设计API的一个很好的方法-它对客户端来说很容易理解,许多聪明人已经解决了身份验证/授权、版本控制和抽象等问题
需要注意的是,REST使用现有的HTTP概念,因此RESTful API将公开POST请求以创建新的实体。POST请求可以从具有<form>元素的网页调用,也可以从REST客户端调用。如果编写RESTful API,则可以用任何支持HTTP的语言编写客户端
有很多框架可以使在PHP中构建RESTful web API变得更容易。我没有用过,所以不能推荐。

然而,如果你所要做的就是处理来自不会改变的网页的POST请求——好吧,我不会构建RESTful API,我只会编写一个PHP"POST"处理程序。在这种情况下,客户端可以是任何理解POST参数的东西(实际上,几乎是任何可以发出HTTP请求的应用程序)。

然而,在我看来,"POST处理程序"answers"API"之间的区别在于,当你创建API时,你会做出你的客户端所依赖的某些承诺。"我不会在不告诉你的情况下更改字段名"。"我不会在不告诉你的情况下改变地点"。"你可以根据我的文档说明"。当您创建POST处理程序时,您只向HTML表单的制作者承诺它是有效的,并且您将告诉该团队任何更改。

HTTPS的唯一挑战是必须确保调用应用程序能够处理它,并且密钥能够工作。

只需在PHP中正常处理表单,并使用访问值

$_POST["name"];

API用户只需要通过html表单、AJAX或其他方式发送POST请求。您应该为响应格式html、xml、json添加一个字段,然后使用它来格式化响应。

检查以下链接(restful服务)。。。它非常简单,符合您的要求。

http://rest.elkstein.org/2008/02/what-is-rest.html

http://www.9lessons.info/2012/05/create-restful-services-api-in-php.html

按照Neville K的回答,这里有一个我的公司如何处理RESTful api调用的例子。

首先,我们有一个php文件,它用switch语句处理调用。将不同的操作路由到所述函数和类。

/* Class file that is called on this page */
include_once "$_SERVER[DOCUMENT_ROOT]/classes/class.myclass.php";
/**
 * This function makes it simpler to stop it from working for debugging purposes.
 * All we have to do is comment out the one line of code apiCall($_REQUEST);
 * You could have this outside of the function and it would work just as well.
 * @param type $REQUEST
 */
function apiCall($REQUEST) {
    $con = new MyClass();
    switch ($REQUEST['action']) {
        case 'getList':
            /* Setting the content type to json means that the developer can
             * expect a response in the form of parseable json.
             */
            header('Content-Type: application/json');
            echo json_encode($con->getList($REQUEST));
        case 'setValue':
            header('Content-Type: application/json');
            echo json_encode($con->setValue($REQUEST));
        case 'login':
            if ($con->login($REQUEST)) {
                header('Location: /index.php');
            } else {
                header('Content-Type: /login.php?status=Failed+Login');
            }
        default:
            header('Content-Type: application/json');
            /* If an invalid action was sent in, then this error message will be sent
             * back to the user
             */
            echo json_encode(['status' => 'Invalid API Call']);
    }
}
/* Using $_REQUEST allows developers to access the api via GET or POST */
apiCall($_REQUEST);

然后我们处理我们调用的不同类中的所有逻辑。

class MyClass {
    public function getList($REQUEST) {
        $id = $REQUEST['id'];
        /* code */
        return ['status' => 'ok', 'results' => $array];
    }
    public function setList($REQUEST) {
        /* code */
        return ['status' => 'ok'];
    }
    public function login($REQUEST) {
        /* code */
        $_SESSION['user_id'] = $user_id;
        return $login_successful;
    }
}

使用JSON对于通过AJAX调用发送信息的应用程序是有益的。使用header('Location:')对于不使用ajax的表单提交是很好的。

然后,您可以使用JavaScriptajax调用,或者根据处理数据提交的方式进行提交。

使用jQuery.getJSON 的示例

$.getJSON('/switch.php', $.param({id: id, action: 'getList'}), function (json) {
    if (json) {
        /*code*/
    }
});

然后,您将把一个包含操作的隐藏输入传递到切换页面,以便进行常规表单提交。

<form action="/switch.php" method="post">
    <!--hidden input named action to direct which switch to use-->
    <input name="action" value="login" type="hidden"/>
    <input name="username"/>
    <input name="password" type="password"/>
    <input type="submit"/>
</form>

这些示例适用于html/JavaScript web应用程序。如果您使用的是JAVA、Python、.NET或其他语言,那么只需使用RESTneneneba API并解析JSON就可以找到如何处理应用程序逻辑。

您甚至可以使用file_get_contentscurl运行php到phpapi调用。

$data = [
    'action' => 'setValue',
    'information' => 'More'
];
$json = json_decode(file_get_contents('/switch.php?' . http_build_query($data)),true);
if(!empty($json)){
    /*code*/
}

您可以为每个调用创建一个单独的页面,而不必担心向每个请求传递action。但后来你的文件树开始变成这样了。

/api/loginSubmit.php
/api/login.php
/api/getListFromId.php
/api/getList.php
/api/setValues.php
/api/getValues.php

遍历所有这些文件以找出问题所在真的很麻烦。

我创建了API框架,它非常轻、简单、快速。

Github

点击我

链接:https://github.com/mackraja/mackApi