如何使用JavaScript从ASP.NET核心Web应用程序获取JSON信息 [英] How to get JSON information from ASP.NET core web app using JavaScript

查看:68
本文介绍了如何使用JavaScript从ASP.NET核心Web应用程序获取JSON信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用eBay查找API一段时间,它按预期的方式工作,我已经使用JavaScript来实现它,如他们的文档中所示.最近,它无处不在停止工作,我不知道出了什么问题.

我使用邮递员检查了同一通电话,一切正常.当我在php或C#中进行相同的调用时,它也可以工作,所以我想也许eBay做了一些事情,而我只能从后端"语言中获取信息:/?IDK ..因此,我创建了一个链接,该链接通过get调用从eBay蚂蚁获取信息,并使用get调用将其输出,当我尝试使用Javascript获取该数据时,它也失败了,该链接在邮递员或浏览器中也有效.

有人可以向我解释这里发生了什么,我的代码有问题吗?(它在过去的半年中都没有问题.),那么它一定是eBay或IDK的东西.以及为什么我的链接不起作用,我将向您展示所有代码,以及使用浏览器调试模式的错误.

好的,所以我的JavaScript代码:

  var urlp1 ="https://svcs.ebay.com/services/search/FindingService/v1";urlp1 + =?OPERATION-NAME = findItemsByKeywords";urlp1 + =& SERVICE-VERSION = 1.0.0";urlp1 + =& SECURITY-APPNAME = myappname";urlp1 + =& GLOBAL-ID = EBAY-GB";urlp1 + =& RESPONSE-DATA-FORMAT = JSON";urlp1 + =& callback = pages1";urlp1 + =& REST-PAYLOAD";urlp1 + =& keys =" + zodis;urlp1 + =& outputSelector(0)= PictureURLLarge";urlp1 + =& outputSelector(1)= StoreInfo";urlp1 + =& paginationInput.entriesPerPage =" + EPP;urlp1 + =& paginationInput.pageNumber =" + puslapis;urlp1 + =& itemFilter(0).name =卖方";urlp1 + =& itemFilter(0).value(0)= daviva16";urlp1 + =& itemFilter(0).value(1)= davivaltd";urlp1 + =& itemFilter(0).value(2)= davivastore";ss = document.createElement('script');ss.src = urlp1;document.body.appendChild(ss); 

回调函数为100%正常,http调用本身失败,我得到:

(响应主体为空)

但是如果我使用相同的链接(减去回调)(将链接粘贴到浏览器中),则会得到预期的信息:

所以我的第一个方法是以某种方式解决此问题.但是我不知道该怎么办,我尝试使用XMLHttpRequest和JQuery Ajax进行呼叫都没有成功..

然后我用asp.net core 2.1 C#建立了此链接

  [HttpGet][ProducesResponseType(StatusCodes.Status201Created)][ProducesResponseType(StatusCodes.Status400BadRequest)][Route("Public/Ebaycalaidaviva162")]公共ActionResult< JObject>Ebaycalaidaviva162(字符串zodis,字符串kiekis,字符串puslapis){字符串atsakas =";使用(HttpClient client = new HttpClient()){尝试{//发布http callas.HttpResponseMessage响应= client.GetAsync("https://svcs.ebay.com/services/search/FindingService/v1?"+"OPERATION-NAME = findItemsIneBayStores"+& SERVICE-VERSION = 1.0.0"+& SECURITY-APPNAME = myappname"+& GLOBAL-ID = EBAY-GB"+& storeName = daviva16"+& RESPONSE-DATA-FORMAT = JSON"+& outputSelector(0)= PictureURLLarge"+& outputSelector(1)= StoreInfo"+& words =" + zodis+& paginationInput.entriesPerPage =" + kiekis+& paginationInput.pageNumber =" + puslapis).Result;//nesekmes atveju错误..response.EnsureSuccessStatusCode();//响应字符串字符串responseBody = response.Content.ReadAsStringAsync().Result;atsakas = responseBody;}捕获(HttpRequestException e){Console.WriteLine("\ nException Caught!");Console.WriteLine("Message:{0}",e.Message);}}返回JObject.Parse(atsakas);} 

我也无法从此链接获取信息.

状态正常,但正文为空,当我再次在浏览器中打开此链接时,我会获得所有信息.

链接为:

然后我在控制台中收到CORS错误.

SEC7120:[CORS]在'解决方案

很抱歉,我的第一个答案.收到空响应的原因与服务器端缺少跨源标头有关.来自服务器的响应必须包含"Access-Control-Allow-Origin"标头.您可以在url下方测试它是否包含此标头,并将其与ajax配合使用.

http://api.geonames.org/countryInfoJSON?formatted=true&lang=en&country=US&username=webucator&style=full

I've been using eBay finding API for some time, it worked at as it supposed to, I've implemented it with JavaScript like shown in they'r documentation. and recently, out of nowhere it stopped working, I have no Idea whats the problem..

I checked same call using postman, everything works there. Also it works when I make same call in php or in C#, So I thought maybe eBay did something and I can only get info from "backend" language :/? IDK.. So I've created a link that gets info from eBay ant outputs it with get call and when I trie to get that data using Javascript it also fails, this link also works in postman or browser.

Can someone explain to me what's happening here, is something wrong with my code ? (it worked before with no problems for more than half year..), then it must be something with eBay or IDK.. and also why my link dosnt work, I'll show you all code, and errors using browser debug mode.

okay So my JavaScript code:

var urlp1 = "https://svcs.ebay.com/services/search/FindingService/v1";
    urlp1 += "?OPERATION-NAME=findItemsByKeywords";
    urlp1 += "&SERVICE-VERSION=1.0.0";
    urlp1 += "&SECURITY-APPNAME=myappname";
    urlp1 += "&GLOBAL-ID=EBAY-GB";
    urlp1 += "&RESPONSE-DATA-FORMAT=JSON";
    urlp1 += "&callback=pages1";
    urlp1 += "&REST-PAYLOAD";
    urlp1 += "&keywords=" + zodis;
    urlp1 += "&outputSelector(0)=PictureURLLarge";
    urlp1 += "&outputSelector(1)=StoreInfo";
    urlp1 += "&paginationInput.entriesPerPage=" + EPP;
    urlp1 += "&paginationInput.pageNumber=" + puslapis;
    urlp1 += "&itemFilter(0).name=Seller";
    urlp1 += "&itemFilter(0).value(0)=daviva16";
    urlp1 += "&itemFilter(0).value(1)=davivaltd";
    urlp1 += "&itemFilter(0).value(2)=davivastore";


ss=document.createElement('script'); 
ss.src= urlp1;
document.body.appendChild(ss);

Callback function is 100% OK, the http call itself fails, I get :

(response body is empty)

but if I use same link (minus callback) (I paste link into browser) I get expected info:

So my first approach was to somehow fix this problem.. But I have no Idea what to do about it I've tried to make call using XMLHttpRequest and JQuery Ajax no success either way..

Then I made this link with asp.net core 2.1 C#

[HttpGet]
        [ProducesResponseType(StatusCodes.Status201Created)]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [Route("Public/Ebaycalaidaviva162")]        
        public ActionResult<JObject> Ebaycalaidaviva162(string zodis, string kiekis, string puslapis)
        {
            string atsakas = "";    

            using (HttpClient client = new HttpClient())
            {

                try
                {
                    //Post http callas.
                    HttpResponseMessage response = client.GetAsync("https://svcs.ebay.com/services/search/FindingService/v1?"
                         + "OPERATION-NAME=findItemsIneBayStores"
                         + "&SERVICE-VERSION=1.0.0"
                         + "&SECURITY-APPNAME=myappname"
                         + "&GLOBAL-ID=EBAY-GB"
                         + "&storeName=daviva16"
                         + "&RESPONSE-DATA-FORMAT=JSON"
                         + "&outputSelector(0)=PictureURLLarge"
                         + "&outputSelector(1)=StoreInfo"
                         + "&keywords=" + zodis
                         + "&paginationInput.entriesPerPage=" + kiekis
                         + "&paginationInput.pageNumber=" + puslapis).Result;
                    //nesekmes atveju error..
                    response.EnsureSuccessStatusCode();
                    //responsas to string
                    string responseBody = response.Content.ReadAsStringAsync().Result;                   
                    atsakas = responseBody;

                }
                catch (HttpRequestException e)
                {
                    Console.WriteLine("\nException Caught!");
                    Console.WriteLine("Message :{0} ", e.Message);
                }

            }
            return JObject.Parse(atsakas);
        }

And I cannot get info from this link also..

Status is OK, but body is empty, and when I open this link in browser once again i get all the info..

Link is: https://backend.daviva.lt/public/Ebaycalaidaviva162?zodis=part&kiekis=12&puslapis=1 this link is up for now, and it has 5k request limit per day, so u can test this out if you wanna..

I think this problem might have very simple solution, but I myself lack knowledge to solve it..

It does not matter to me how you solve it You can change something in APS.NET Core link so it works with JavaScript call or change JavaScript call, or whatever.. All that matters to me so I can get Json data with javaScript..

Thanks !

To Slim

I'v tried this:

$.ajax({
async: true,
type: "GET",    
dataType: "json",
url: "https://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsByKeywords&SERVICE-VERSION=1.0.0&SECURITY-APPNAME=myappname&GLOBAL-ID=EBAY-GB&RESPONSE-DATA-FORMAT=JSON&REST-PAYLOAD&keywords=part&outputSelector(0)=PictureURLLarge&outputSelector(1)=StoreInfo&paginationInput.entriesPerPage=8&paginationInput.pageNumber=1&itemFilter(0).name=Seller&itemFilter(0).value(0)=daviva16&itemFilter(0).value(1)=davivaltd&itemFilter(0).value(2)=davivastore",
crossDomain: true,
success: function (atsakas) {
    alert(atsakas);
},
error: function (error) {
    alert("error  " + error);
}

And I get Status Code 200, but response body is empty and It triggers error in ajax function. Response headers:

And I get CORS error in console..

SEC7120: [CORS] The origin 'file://' did not find 'file://' in the Access-Control-Allow-Origin response header for cross-origin resource at 'https://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsByKeywords&SERVICE-VERSION=1.0.0&SECURITY-APPNAME=myappname&GLOBAL-ID=EBAY-GB&RESPONSE-DATA-FORMAT=JSON&REST-PAYLOAD&keywords=part&outputSelector(0)=PictureURLLarge&outputSelector(1)=StoreInfo&paginationInput.entriesPerPage=8&paginationInput.pageNumber=1&itemFilter(0).name=Seller&itemFilter(0).value(0)=daviva16&itemFilter(0).value(1)=davivaltd&itemFilter(0).value(2)=davivastore'.

解决方案

Sorry for my first answer. The reason you are receiving an empty response is related to the cross origin header missing from server side. The response from the server must include "Access-Control-Allow-Origin" header. You may test below url it includes this header and it will work with ajax.

http://api.geonames.org/countryInfoJSON?formatted=true&lang=en&country=US&username=webucator&style=full

这篇关于如何使用JavaScript从ASP.NET核心Web应用程序获取JSON信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆