【发布时间】:2019-03-29 07:18:11
【问题描述】:
大家好,我正在处理 PHP、cURL 和 JSON 数据。
架构:
FRONT <-> MIDDLE <-> BACK
问题位置:
MIDDLE <-> BACK
说明:
在我的 MIDDLE 文件(PHP 服务器)中,我调用了一个函数,该函数使 cURL 成为我的 BACK 文件(PHP 服务器)。
我遇到的问题是它会执行其中一个调用(HTTP cURL 请求),但不会执行另一个调用,而忽略了第一个不执行的调用。
你们能指导我解决这个问题吗?我该如何解决这个问题?
我的尝试:
- 我研究了有关 curl 的(文章、视频)信息,认为也许我必须像 mysql 一样处理它,如果我需要从同一服务器请求不同的项目,我必须创建多个 cURL 连接(返回)。
- 我已经实现了虚拟打印输出以查看执行了什么,并得出了我在 description 部分中描述的结论。
注意:
您将在下面找到 MIDDLE、BACK 和两个图像的代码:
- 图 1 是带有虚拟打印输出的代码,显示了一个 cURL 如何执行而另一个不执行。请注意文本“what back gets”。
- 图 2 是不执行 cURL 的方式。
中间文件:
注意: 看看在“EXAMSOLVED”的情况下我如何调用两个函数。这与图 1 有关。
如果我评论与图像 2 相关的第二个函数。
<?php
/*------------------------------------------------------------------*/
include "exam_grading_system.php";
/*------------------------------------------------------------------*/
function http_post_back_server($url, $data)
{
$obj = curl_init();
curl_setopt($obj, CURLOPT_URL, $url);
curl_setopt($obj, CURLOPT_POST, strlen($data));
curl_setopt($obj, CURLOPT_POSTFIELDS, $data);
curl_setopt($obj, CURLOPT_RETURNTRANSFER, true);
$ans = curl_exec($obj);
curl_close($obj);
return $ans;
}
//--------------------------------------------------------------------
function get_question_info($ulr, $id_question)
{
//Set UP Request Packet
$askDB->case = "GradingInfo";
$askDB->id_question = $id_question;
//Convert Packet to JSON format
$askDB = json_encode($askDB);
//echo $askDB;
//Ask Back Server
$BK_Srv_Ans = http_post_back_server($url,$askDB);
return $BK_Srv_Ans;
}
//--------------------------------------------------------------------
/*URL TO BACK SERVER*/
$url_myserver = "https: MY URL ";
/*GLOBAL VARS*/
$back_ans ="";
/*RECEIVE DATA FROM POST REQUEST*/
$indata = file_get_contents("php://input");
$data = json_decode($indata,true);
/*MAKE REQUEST TO SERVERS*/
switch($data["case"]){
case "_EXAMSOLVED_":
$questions_Info = get_question_info($url_myserver, $data["id_question"]);
//$indata = Grading($data, $questions_Info);
//$back_ans = http_post_back_server($url_myserver,$indata);
break;
default:
$back_ans = http_post_back_server($url_myserver,$indata);
break;
}
/*ANSWER BACK TO FRON END*/
echo $back_ans;
?>
回档:
注意:查看我在请求文件时的虚拟回显语句
<?php
/*------------------------------------------------------------------*/
include "Prof_backend_tools.php";
include "Student_backend_tools.php";
/*------------------------------------------------------------------*/
echo "what back gets: ";
/*RECEIVING DATA FROM POST REQUEST */
$indata = file_get_contents("php://input");
/*DATA TO JSON OBJ*/
$indata = json_decode($indata, true);
/*CHECKING DATABASE CONNECTIVITY */
if(mysqli_connect_error())
{ echo "Connection Error: ".mysqli_connect_error; }
switch($indata["case"])
{
case "_EXAMSOLVED_":
echo store_exam_slutions($indata,DB_s());
break;
case "GradingInfo":
echo "--IN BACK--";
//echo Needed_data_for_grading($indata);
break;
default:
echo "NADA";
break;
}
?>
图片 1:
任何向导都会是很棒的人。 谢谢。
【问题讨论】:
-
在
_EXAMSOLVED_的代码块中,您将结果分配给$question_info,但您没有对结果执行任何其他操作,这是正确的吗? -
@Ferrybig,是的,到目前为止,我只想处理 cURL 未执行的原因。如果您注意到下面的行中被注释掉了,我将调用变量 $question_info。但到目前为止,如果 cURL 没有执行,它不会做任何事情。
-
安迪,你在描述问题方面做得非常出色。然而,这种方法是有缺陷的:你应该从它周围所有不必要的东西中提取minimal reproducible example,而不是描述它和它出现的上下文。然后在这里发布这段代码。通常,您会在自己执行此操作时发现错误。