从cURL GET请求返回未定义的结果

0dxa2lsx  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(216)

我正在尝试在我的html前端和后端微服务之间创建一个反向代理。
如果没有代理服务器,代码可以正常工作。
文本被输入到前端,点击按钮后通过XMLrequest发送到php代理,然后通过cURL向python后端微服务发出get请求。我认为我的问题是发送get请求和输入文本。返回的结果是undefined,因为发送输入文本时有问题。我的前端返回“undefined”--所以至少我知道它们是连接的。
我在本地主机上运行代码,然后再停靠应用程序
如果有人有任何指点,将不胜感激!

前端

function Check_1() //total
{
    
     input_text = document.getElementById('input-text').value;
       
       
        let xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                var j = JSON.parse(this.response);
               total_marks = j.answer;
                
                displayTotal(total_marks);
                
            }
        };

        xhttp.open("GET",proxyURL+"?input_text="+"/");
        xhttp.send();

        return;
    }

 <div>
        <button class="sgcbutton-active" onclick="Check_1();">Total Marks</button>
    </div>

代理人

<?php

header("Access-Control-Allow-Origin: *");
header("Content-type: application/json");

$output = array(
    "error" => false,
  "string" => "",
    "answer" => 0
);

$SITE_NAME_1 = "http://localhost:90"; 

$input_text = $_REQUEST['input_text'];

$URL = $SITE_NAME_1."/?input_text=".$input_text;


//curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,$URL);
$result=curl_exec($ch);
curl_close($ch);

echo ($result);
exit();

Python后端

import function
from flask import Flask
from flask import request
from flask import Response
import pandas as pd
import json
import numpy as np 

app = Flask(__name__)

@app.route("/")
def hello():
     #inputtext = request.args.get('input_text')
     input_text = stringinput()
     theanswer = function.checkArray(input_text)

     x = {
      "error": 'false',
      "string": "",
      "answer": theanswer
     }
     
     reply = json.dumps(x)
     r = Response (response=reply, status=200)
     r.headers["Content-Type"]="application/json"
     r.headers["Access-Control-Allow-Origin"]="*"
     return r

@app.route("/", methods=['GET']) 
def stringinput():
     inputtext = request.args.get('input_text')
     return inputtext

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000)

注记
我相信所有三个页面之间的通信都正常-状态代码200

bn31dyow

bn31dyow1#

我怀疑这是问题所在,但是当您将URL放在curl_init中时,您不需要在setopt中使用CURLOPT_URL
您没有显示URL的外观。这可能是一个问题。
您可能必须使用urlencode()rawurlencode(),我更喜欢使用POST请求来避免urlencode。
您需要查看传出请求标头。
为此,您需要此setopt:

curl_setopt($ch, CURLINFO_HEADER_OUT, true);

构建请求头通常是一个好主意,包括主机。

$request = array();
$request[] = "Host: www.example.com";
$request[] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,* / *;q=0.8";
$request[] = "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0";
$request[] = "Accept-Language: en-US,en;q=0.5";
$request[] = "Connection: keep-alive";
$request[] = "Cache-Control: no-cache";
$request[] = "Pragma: no-cache";

$ch = curl_init($url);

您还应该使用此setopt:

curl_setopt($ch, CURLOPT_POST, false);

如果请求是HTTPS,则需要前两个setopt。我已经使用此代码十多年了。
我上周末刚用它刮了Zillow来获得上市。
我相信这将帮助您找到问题所在。
我假设URL在浏览器中工作。
你可以从你的浏览器中得到原始请求标题。有时urlencoding会很棘手。

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch, CURLINFO_HEADER_OUT, true);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $request);
curl_setopt($ch, CURLOPT_ENCODING,"");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
curl_setopt($ch, CURLOPT_FAILONERROR,true);
curl_setopt($ch, CURLOPT_ENCODING,"");
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$data = curl_exec($ch);
$header = curl_getinfo($ch,CURLINFO_HEADER_OUT);
var_export(curl_getinfo($ch));
echo  curl_error($ch);
echo $data;

相关问题