Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript angularjs$http JSONP方法返回http状态代码0 angularjs中的JSONP请求失败_Javascript_Angularjs_Jsonp_Http Status - Fatal编程技术网

Javascript angularjs$http JSONP方法返回http状态代码0 angularjs中的JSONP请求失败

Javascript angularjs$http JSONP方法返回http状态代码0 angularjs中的JSONP请求失败,javascript,angularjs,jsonp,http-status,Javascript,Angularjs,Jsonp,Http Status,当运行以下angularjs代码来检索JSONP数据时,在请求https://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero或http://code.jsontest.com?callback=JSON_CALLBACK。但是当向我的本地(bash或monkey)web服务器发出请求时,它失败了 我的本地Web服务器返回的内容存储在wcontent中 export wcontent='JSON_CALLBA

当运行以下angularjs代码来检索JSONP数据时,在请求
https://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero
http://code.jsontest.com?callback=JSON_CALLBACK
。但是当向我的本地(bash或monkey)web服务器发出请求时,它失败了

我的本地Web服务器返回的内容存储在wcontent中

export wcontent='JSON_CALLBACK([ 
    {"msg":"Message one"}, 
    {"msg":"Message two"} 
    ]);'
bash脚本web服务器代码是

while true; do cat <<EOF | nc -l 8024 ; done
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/javascript; charset=ISO-8859-1
Vary: Accept-Encoding
Date: `date`
Server: Google Frontend
Cache-Control: private
Content-Length: ${#wcontent}

${wcontent}
EOF
当向前面提到的任何外部JSONP对象发出请求时,将检索JSONP对象。当向(bash或monkey)web服务器发出请求时,它会失败,并执行以下控制台日志记录

 messagesController FETCH method:JSONP Url://http://127.0.0.1:8024/?callback=JSON_CALLBACK
 Fetch ERROR
 method JSONP
 data
     undefined
 Status: 0
 Headersfunction(name) {
 "use strict";

     if (!headersObj) headersObj = parseHeaders(headers) ;

     if (name) {
        return headersObj[lowercase(name)] || null ;
     }

     return headersObj;
 }
 [object Function] 
 "config"
 [object Object]
因此,它返回一个HTTP状态代码0。根据输出头,似乎有一些东西与HTTP头有关

我尝试过的

  • 我尝试了不同的HTTP头组合
  • 2个不同版本的Web服务器
  • 使用外部ip地址而不是本地主机
  • 使用主机名而不是ip地址
  • AngularJS 1.2.1、1.2.26和1.3.2
有人能帮我吗

20141115添加了从angularjs发出请求时使用tcpdump生成的HTTP头

请求

GET /?callback=angular.callbacks._1 HTTP/1.1
Host: reddipped.localdomain:8024
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://localhost:7002/console/console.portal?_nfpb=true&_pageLabel=HomePage1
Connection: keep-alive
答复:

为了其他人的利益,这里提供了一个重写的BashHTTP服务器,以便能够测试使用angularjs发出的JSONP请求。有关解释,请参见Roman L的答案

#!/bin/bash
#
#

# reads JSON Data
function loadJSON(){

        echo '[
                {"msg":"Message 1"},
                {"msg":"Anonco 2"},
                {"msg":"Avis 3"}
        ]'

}

# proces HTTP JSONP request
function procesRequest() {

   # Read first line of HTTP request,this line has the format
   # "Method SP Request-URI SP HTTP-Version CRLF"
   read request
   # Get callback url variable value which is requested JSONP callback 
   # function name 
   callback=$(echo $request | sed -r 's/.*callback=(.*) .*/\1/g ; /GET/{q100}')
   if [ "$?" -eq "100" ] || [ -z "$callback" ]; then
     callback="JSONP_CALLBACK"
   fi
   # Create response body
   wcontent=${callback}"("$(loadJSON)");"

   # Compose response
cat <<EOF
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/javascript;
Date: `date`
Server: Reddipped Bash
Cache-Control: no-cache
Content-Length: ${#wcontent}

${wcontent}
EOF

  ## Clearing buffer
  while read -t 1; do
    true
  done

}

# Listen Port
PORT=8024

# Setup named pipe to pass HTTP response back to netcat
TMP=`mktemp -d`
LOOP=$TMP/pipe.loop
REQ=$TMP/pipe.req
RPY=$TMP/pipe.rpy
trap 'rm -rf "$TMP"' EXIT
mkfifo -m 0600 "$LOOP" "$REQ" "$RPY"
sed 's/^/-REQUEST->/' <"$REQ" &
sed 's/^/<--REPLY--/' <"$RPY" &


echo Waiting for HTTP request
nc -r -l $PORT <"$LOOP" | tee "$REQ" | procesRequest | tee "$RPY" >"$LOOP"
echo Send HTTP response
nohup $0
#/bin/bash
#
#
#读取JSON数据
函数loadJSON(){
回声'[
{“msg”:“消息1”},
{“msg”:“Anonco 2”},
{“msg”:“Avis 3”}
]'
}
#处理HTTP JSONP请求
函数proceRequest(){
#读取HTTP请求的第一行,该行具有以下格式
#“方法SP请求URI SP HTTP版本CRLF”
阅读请求
#获取JSONP回调请求的回调url变量值
#函数名
回调=$(echo$request | sed-r's/*回调=(.*)。*/\1/g;/GET/{q100}')
如果[“$?”-eq“100”]| |[-z”$callback];则
callback=“JSONP\u callback”
fi
#创建响应体
wcontent=${callback}”(“$(loadJSON)”)
#作答

catAngular将用特定的回调名称替换url中的
JSON\U回调
,例如
cb\U 0
,因此实际请求看起来像
server?CALLBACK=cb\U 0
。您的服务器必须返回包装在此回调中的JSON

cb_0([ 
  {"msg":"Message one"}, 
  {"msg":"Message two"} 
])
尝试更改链接中的回调名称,并在浏览器中查看响应:

更新:

如果我正确理解bash代码,当您导航到
http://127.0.0.1:8024/?callback=cb_0
您将看到以下输出:

JSON_CALLBACK([ 
  {"msg":"Message one"}, 
  {"msg":"Message two"} 
]);

您应该看到
cbu 0
。我猜这可能是错误的原因。

Hi Romain,angularjs对angularjs.org和code.jsontest.com的请求确实有效。它是对我的一个本地Web服务器的请求,返回状态代码0。该请求也被转换为
http://reddipped.localdomain:8024/?回调=角度。当我使用
http://reddipped.localdomain:8024/?callback=angular.callbacks_0
http://reddipped.localdomain:8024/?callback=JSONP_CALLBACK
从浏览器中,我得到了HTTP 200和正确的响应。@pcvnes我理解这一点,我在谈论您的本地服务器。检查我的更新,也许会澄清一点。你好,罗曼,谢谢!现在终于明白我被忽略了什么。当angularjs发出HTTP JSONP请求时,回调url变量指定它在响应中请求的回调函数的名称!我重写了bash HTTP服务器,以返回回调变量中提供的JSONP函数/对象。@p太好了,很高兴我把你推向了正确的方向!
cb_0([ 
  {"msg":"Message one"}, 
  {"msg":"Message two"} 
])
JSON_CALLBACK([ 
  {"msg":"Message one"}, 
  {"msg":"Message two"} 
]);