API 调用返回 HTML 而不是 JSON

Posted

技术标签:

【中文标题】API 调用返回 HTML 而不是 JSON【英文标题】:API call returns HTML instead of JSON 【发布时间】:2022-01-04 07:50:50 【问题描述】:

我正在我的网站上开发支付网关。我还有一步,我坚持下去。 我必须向支付提供商 API 发送订单,它应该返回带有一些数据和 redirectURI 的对象,我必须将客户端重定向到。

我遇到的问题是 API 响应。它返回 html 而不是 JSON。以下是我的要求:

    $curl = curl_init();
    
    $data = $data->get_params();
    
    $data['order']['customerIp'] = $_SERVER['REMOTE_ADDR'];
    $data['order']['extOrderId'] = generateRandomString();
    
    $postdata = json_encode($data['order']);

    curl_setopt_array($curl, array(
        CURLOPT_URL => 'https://secure.snd.payu.com/api/v2_1/orders',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_HEADER => false,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'POST',
        CURLOPT_POSTFIELDS => $postdata,
        CURLOPT_HTTPHEADER => array(
                'Content-Type: application/json',
            'Authorization: Bearer '.$data['token']
        ),
    ));

    $response = curl_exec($curl);

    curl_close($curl);

    return rest_ensure_response( $response );

在文档网站上,我发现了这条信息消息:

注意:响应的 HTTP 状态码是 302 和 Location 头 设置为 redirectUri,根据使用的软件,它可能 有时会触发自动重定向以及接收响应 HTML 格式。

我假设响应的 HTML 包含客户端应该重定向到的网站。

JSON 响应应如下所示:

  
   "status":  
      "statusCode":"SUCCESS",
   ,
   "redirectUri":"payment_summary_redirection_url",
   "orderId":"WZHF5FFDRJ140731GUEST000P01",
   "extOrderId":"YOUR_EXT_ORDER_ID",

您知道如何解决这个问题,或者是否有可能做到这一点? 或者也许可以检索 Location 标头中的路径并将其发送给客户端?

在我的后端,我在前端使用 php 和 Angular。

感谢您的任何想法。

谢谢。

【问题讨论】:

不知道为什么他们会同时使用 JSON 和重定向进行响应,这没有多大意义。您是否尝试将 CURLOPT_FOLLOWLOCATION 设置为 false? 好建议!将 CURLOPT_FOLLOWLOCATION 更改为 false 即可解决问题。 【参考方案1】:

试试这个:

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://secure.payu.com/api/v2_1/orders',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'
        "notifyUrl": "https://your.eshop.com/notify",
        "customerIp": "127.0.0.1",
        "merchantPosId": "145227",
        "description": "RTV market",
        "currencyCode": "PLN",
        "totalAmount": "21000",
        "buyer": 
            "email": "john.doe@example.com",
            "phone": "654111654",
            "firstName": "John",
            "lastName": "Doe",
            "language": "pl"
        ,
        "products": [
            
                "name": "Wireless Mouse for Laptop",
                "unitPrice": "15000",
                "quantity": "1"
            ,
            
                "name": "HDMI cable",
                "unitPrice": "6000",
                "quantity": "1"
            
        ]
    ',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Authorization: Bearer 3e5cac39-7e38-4139-8fd6-30adc06a61bd'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

相应地更改字段。我强烈推荐使用Postman 来调试请求。它还具有从curl导入请求(提供here)并生成代码sn-ps的功能

【讨论】:

不幸的是,这给了我相同的结果。按照@CBroe 的建议将 CURLOPT_FOLLOWLOCATION 更改为 false 有助于解决此问题。

以上是关于API 调用返回 HTML 而不是 JSON的主要内容,如果未能解决你的问题,请参考以下文章

AWS API 网关:为啥调用 url 返回 HTML 代码而不是实际网页?

在使用 Newtonsoft 之后,ajax 调用在 asp.net 中返回 HTML 响应而不是 Json

Json-server 模拟 API 而不是调用

用PHP调用API返回JSON值,怎么把JSON返回值调用到html呢?

jQuery Ajax 调用返回 JSON 字符串而不是对象数组

Blazor Web Api 返回 text/html 而不是 application/json