Javascript angularjs$http JSONP方法返回http状态代码0 angularjs中的JSONP请求失败
当运行以下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
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
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"}
]);