【问题标题】:How to convert cURL request to ajax with curl -d body如何使用 curl -d body 将 cURL 请求转换为 ajax
【发布时间】:2018-01-17 21:30:58
【问题描述】:

我正在尝试将 cURL 请求(通过我的 mac 上的终端工作)发送到 jQuery ajax,但我收到了 400 BAD REQUEST。如果您发现我的代码有任何问题,请告诉我。如果有帮助,这是为了尝试使用 Oanda v20 API。

通过终端的 cURL(工作):

body=$(cat << EOF
{
  "order": {
    "units": "100", 
    "instrument": "EUR_USD", 
    "timeInForce": "FOK", 
    "type": "MARKET", 
    "positionFill": "DEFAULT"
  }
}
EOF
)

curl \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <AUTHENTICATION TOKEN>" \
  -d "$body" \
  "https://api-fxpractice.oanda.com/v3/accounts/<ACCOUNT>/orders"

jQuery ajax(不工作):

$.ajax({
    type: "POST",
    url: 'https://api-fxpractice.oanda.com/v3/accounts/' + accountNumber + '/orders',
    data: {
        "order": {
            "units": "10000", 
            "instrument": "EUR_USD", 
            "timeInForce": "FOK", 
            "type": "MARKET", 
            "positionFill": "DEFAULT"
        }
    },
    beforeSend: function(xhr) {
        xhr.setRequestHeader("Authorization", "Bearer " + auth)
    }, success: function(data){

        console.log(data);

        }
});

显然,authaccountNumber 等是在此代码之外定义的有效变量。

【问题讨论】:

    标签: javascript jquery ajax curl


    【解决方案1】:

    可能由于同源策略而被阻止。

    您是否尝试过使用 JSONP? (将 dataType: "jsonp" 添加到您的 ajax 调用中)

    $.ajax({
        type: "POST",
        dataType: "jsonp",
        url: 'https://api-fxpractice.oanda.com/v3/accounts/' + accountNumber + '/orders',
        data: {
            "order": {
                "units": "10000", 
                "instrument": "EUR_USD", 
                "timeInForce": "FOK", 
                "type": "MARKET", 
                "positionFill": "DEFAULT"
            }
        },
        beforeSend: function(xhr) {
            xhr.setRequestHeader("Authorization", "Bearer " + auth)
        }, success: function(data){
    
            console.log(data);
    
            }
    });
    

    但是,鉴于您似乎在页面上将某人的帐号打印为纯文本 JavaScript,从您自己的 php 文件发送 CURL 请求不是更安全吗?使用 Ajax 调用您的本地文件,然后从那里发送 CURL 请求,并使用 API 的响应来制定您自己的 JSON 响应以发送回您的客户端。

    【讨论】:

    • 你说得对,但这是我试图仅在客户端语言上构建的应用程序。它仅供我使用。基本上,我只是想构建一个在 chrome 中运行的应用程序。
    【解决方案2】:

    您的请求的内容类型是application/json,您应该将其添加到请求中并确保内容本身作为字符串发送(使用JSON.stringify):

    $.ajax({
        ...
        contentType: 'application/json',
        data: JSON.stringify({'order': { ... }}),
        ...
    });
    

    【讨论】:

    • 哦,是的,也是。
    • 是的,我很快就认为它是由于试图跨域发送 AJAX 请求而被阻止的。
    • 是的,这行得通。谢谢你。似乎是修复 400 的这两件事的组合更新。
    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 2016-10-10
    • 2018-02-16
    • 1970-01-01
    • 2017-08-03
    • 2016-05-20
    • 1970-01-01
    相关资源
    最近更新 更多