【问题标题】:Creating an API that handles a form post创建处理表单发布的 API
【发布时间】:2016-03-30 11:59:13
【问题描述】:

最近有人要求我创建一个可以使用 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.htmlhttp://coreymaynard.com/blog/creating-a-restful-api-with-php/

或者我只是在 PHP 中正常处理表单并使用以下方法访问值:

$_POST["name"];

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

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

提前致谢,如果这不是很具体,我深表歉意,任何建议/指针将不胜感激。

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

【问题讨论】:

标签: php


【解决方案1】:

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

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

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

但是,在我看来,“POST Handler”和“API”之间的区别在于,当您创建 API 时,您做出了客户所依赖的某些承诺。 “我不会在不告诉你的情况下更改字段名称”。 “我不会在不告诉你的情况下改变位置”。 “你可以依赖我的文档所说的”。当您创建 POST 处理程序时,您只需向 HTML 表单的创建者保证它可以工作,并且您会告诉该团队任何更改。

HTTPS 的唯一挑战是您必须确保调用应用程序可以处理它,并且密钥有效。

【讨论】:

  • 谢谢@Neville 只要支持 HTTP 请求,我就可以使用我选择的语言调用这两种方法吗?
  • 是的 - 真正的区别在于谁需要调用它,以及他们需要做的不仅仅是一个 POST 请求。
  • 该项目的目标是创建一个包含多种支付方式的系统。所以基本上我只需要在表单发布中收集数据,对其进行验证并将其传递给 Paypal 或选择的付款方式,然后重定向回同样在表单发布中发送的成功/失败 URL
  • 认为您应该只获取数据并使用现有的支付网关。您进一步发布的内容将取决于具体的方法/网关,但您不需要重定向,通常您可以在远程应用程序中定义成功/失败链接,或者将它们与发布数据一起发送。
【解决方案2】:

只需在 PHP 中正常处理表单并使用以下方法访问值:

$_POST["name"];

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

【讨论】:

    【解决方案3】:

    检查下面的链接(宁静的服务)...非常简单,符合您的要求。

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

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

    【讨论】:

      【解决方案4】:

      这里的 Neville K 的回答是我公司如何处理 RESTful api 调用的示例。

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

      /* 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 的情况下提交表单。

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

      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 或其他一些语言,它就像使用 REST API 并解析 JSON 以找出如何处理您的应用程序逻辑一样简单。

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

      $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
      

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

      【讨论】:

        【解决方案5】:

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

        Github

        Clickme

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

        【讨论】:

          猜你喜欢
          • 2018-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-25
          • 1970-01-01
          • 2018-08-23
          • 1970-01-01
          相关资源
          最近更新 更多