【问题标题】:JSON-RPC is not working with $http.POSTJSON-RPC 不适用于 $http.POST
【发布时间】:2016-08-11 14:40:37
【问题描述】:

我正在开发一个离子混合移动应用程序并尝试在 JSON-RPC 服务中发布数据,但我收到“500 internal server error

        var req = {

        url: 'http://192.118.1.214:8080/remote/json-rpc',
        headers: {
            'content-type': 'application/json;charset=utf-8',
            'cache-control': 'no-cache, no-store, must-revalidate, max-age=0'
        },

        data: { jsonrpc: "2.0", id: 2, method: "HDAccess/getDevices", params: [null] }
    }


    $http(req).then(function (res) { alert(res); return res; },
                    function (er) { alert(er); });  

这是来自 webconsole 的请求详细信息。我使用 chrome CORS 插件来避免“CORS”问题

Request URL:http://192.118.1.214:8080/remote/json-rpc
Request Method:OPTIONS
Status Code:500 Internal Server Error
Remote Address:192.118.1.214:8080
Response Headers
view source
cache-control:no-cache, no-store, must-revalidate, max-age=0
content-length:810
content-type:text/html; charset=UTF-8
date:Tue, 01 Mar 2016 08:00:50 GMT
pragma:no-cache
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:accept, cache-control, content-type
Access-Control-Request-Method:GET
Connection:keep-alive
Host:192.118.1.214:8080
Origin:http://evil.com/
Referer:http://localhost:8100/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36

我在 POSTMAN 扩展中使用了相同的 url 和 post 方法并得到了工作,但在上面的代码中不起作用。

在下面找到 POSTMAN 输入

我有三个疑惑:

1.为什么上述请求详情中没有提到数据。

2.为什么方法显示为“选项”,但我使用的是“POST”方法

3.为什么它不能通过代码工作,但在 chrome POSTMAN 扩展客户端中工作正常

请指导我解决这个问题。

【问题讨论】:

    标签: javascript angularjs ionic-framework xmlhttprequest


    【解决方案1】:

    为什么上述请求详情中没有提及数据。

    如果服务器以权限响应 OPTIONS 请求,则数据将包含在浏览器将发送的 POST/PUT 请求中。

    为什么方法显示为“选项”,但我使用的是“POST”方法

    由于您发送的是带有 JSON 格式正文的请求,因此您正在触发预检 OPTIONS 请求。

    另见Why am I getting an OPTIONS request instead of a GET request?

    我使用 chrome CORS 插件来避免“CORS”问题

    ...它似乎无法处理 OPTIONS 请求,至少在服务器以 500 Internal Server Error 响应时无法处理。

    修复您的服务器,使其能够响应 OPTIONS 请求。

    为什么它不能通过代码工作,但在 chrome POSTMAN 扩展客户端中工作正常

    因为当您使用 Postman 时,不涉及第三方,因此无需担心信任问题。另见XMLHttpRequest cannot load https://www.[website].com/

    【讨论】:

    • 真的是一个很好的解释,我现在可以理解这个问题了。能否请您告诉我需要从服务器端进行哪些更改?
    • 您需要使用 200 OK 和适当的 CORS 标头来响应 OPTIONS。
    • 我添加了“OPTION”方法,但我收到以下错误。 XMLHttpRequest 无法加载 192.118.1.254:8000/system/http/login。 “Access-Control-Allow-Origin”标头包含多个值“evil.com, *”,但只允许一个值。 Origin 'localhost:8101' 因此不允许访问。
    • 错误信息似乎很清楚。在响应中发送正确的标头值。
    • @rightPath — 不。如果浏览器让您的 JavaScript 允许自己从第三方站点读取数据(就好像它是浏览器的用户一样),那将是愚蠢的。
    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2017-11-10
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多