【问题标题】:Pass whole incoming data to curl - Laravel将整个传入数据传递给 curl - Laravel
【发布时间】:2021-09-21 04:57:41
【问题描述】:

我想将整个传入数据(即$request)传递给 curl,不想像 subjectId=>1 那样发布到端点中的特定字段,因为我每次都针对不同的 endPoint 运行此 curl 请求。如果给出了CURLOPT_URL => $url . $subjectId,则以下 curl 请求将起作用。由于每个端点的输入都发生了变化,我必须将输入中的所有内容传递给 curl ,我不能将其作为数组传递$subjectId。有没有办法做到这一点?

目前,dd($Response); 返回null

我给邮递员这样的输入:

{
   "subjectId":"1"
}

卷曲

public function getContentqApiPost(Request $request) 
    {
        $token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.ey";
        $headers = [
            "Accept: application/json",
            "Authorization: Bearer " . $token
        ];
       
          $url="http://127.0.0.1:9000/api/courses/course-per-subject";
        $subjectId = "?subjectId=$request->subjectId";
        $ch = curl_init();
        $curlConfig = array(
         //   CURLOPT_URL            => $url . $subjectId,
         CURLOPT_URL            => $url . $request,
            
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER => true,
            
            CURLOPT_HTTPHEADER => $headers, 
        );
         
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt_array($ch, $curlConfig);
        
        $result = trim(curl_exec($ch));
       
        $Response = json_decode($result, true);
        
        if (curl_errno($ch)) {
            $error_msg = curl_error($ch);
            echo $error_msg;
        }

        curl_close($ch);

        return $Response;
    }

【问题讨论】:

    标签: php laravel curl laravel-8 php-curl


    【解决方案1】:

    如果您想将 $request 的所有参数传递给 curl:

    $queryParams  = '';
    $delimeter = '?';
    foreach($request->all() as $k => $v){
        $queryParams .= "$delimeter$k=$v";
        $delimeter = '&';
    }
    

    你也只能传递你想要的参数:

    foreach($request->only(['subjectId']) as $k => $v){
        // code here
    }
    

    你终于有了:

    CURLOPT_URL            => $url . $queryParams,
    

    【讨论】:

    • 检查http_build_query()内置PHP函数。
    【解决方案2】:

    回答

    假设您想按原样传递整个 GET 查询字符串:

    $query_string = str_replace($request->url(), "", $request->fullUrl());
    $url = "http://localhost:9000/api/courses/course-per-subject" . $query_string;
    

    这是可行的,因为$request->url() 返回不带查询字符串参数的 URL,而$request->fullUrl() 返回带有所有查询字符串参数的 URL,因此我们可以使用带有空替换的 str_replace 来删除非查询部分.请注意,$query_string 已经以 ? 开头,因此无需自己添加。


    其他建议

    除非你的 Laravel API 是后端 API 的 1:1 副本,否则我强烈建议编写一个与后端 API 接口的类,然后使用 dependency injection 将其提供给你的 Laravel 控制器。例如

    class CourseCatalogApi {
       public function getSubjectsInCourse(String $course){
           ... // your curl code here
       }
    }
    

    最后,既然你已经在使用 Laravel,那么就没有必要使用 curl 编写如此低级的代码来发出 HTTP 请求了。考虑使用 guzzlehttp,它已经是 Laravel 的一个依赖。

    【讨论】:

      猜你喜欢
      • 2020-07-21
      • 2015-10-15
      • 2016-05-29
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2019-12-19
      • 1970-01-01
      相关资源
      最近更新 更多