$.getJSON.回调函数无效

本文介绍了一个关于使用jQuery的$.getJSON方法遇到的问题及解决方案。主要问题是当从自己的Action请求JSON数据时,回调函数无法正常工作。文章详细分析了问题原因,并给出了正确的JSON格式示例。

今天搞了一下jquery的$.getJSON(sUrl,mData,fCallback);

 

这个可以跨域请求,

 

参考jquery api demo很容易搞定

 

不过在请求自己的action时回调函数无效

 

js

 $("#btn_json").click(function(){
  //通过时间骗过浏览器缓存
   $.getJSON("example/autocomplete.action?random="+(new Date()).getTime(),null,function(json){

              // alert(json.results[3].name);
               $.each(json.results,function(i,item){
                             $("#email").append("<h1>"+item.name+"</h1>"+"to:"+item.to);
               });
   
   });
 });

 

html

   <div id="getJSon">
        <input type="text" name="json" value="" id="json">
       <input type="button"  id="btn_json" value="loadjson"/>
       <div id="email"></div>
     </div>

 

action

 @Override
 public String execute() throws Exception {
  servletResponse.setCharacterEncoding("UTF-8");
  servletRequest.getParameter("name");
  
   String value = "{\"results\":[{\"name\":\"Peter pan\",\"to\":\"peter@陈.de\"}," +//这里就是问题的关     

     //键:json数据的key必须加引号,否则$.getJSON方法解析不了,就不会调用回调函数
  "{ \"name\": \"Molly\", \"to\": \"molly@yahoo.com\" },"  +
  "{ \"name\": \"Master <em>Sync</em>\", \"to\": \"205bw@samsung.com\" },"  +
  "{ \"name\": \"Don Corleone\", \"to\": \"don@vegas.com\" }," +
   "{ \"name\": \"Donnie Darko\", \"to\": \"dd@timeshift.info\"}"+
    "]}";
  

  PrintWriter out = servletResponse.getWriter();
  out.println(value);
  out.flush();
  out.close();
  return null;
 }

 

一开始网上看了些资料,什么缓存,什么什么的,浮云啊

 

希望对碰到同样问题的同学们有用

 

PS C:\Users\Administrator> # 加载必要程序集(兼容 .NET 9 和旧版) PS C:\Users\Administrator> try { >> Add-Type -AssemblyName System.Net.Http -ErrorAction Stop >> } catch { >> [System.Reflection.Assembly]::LoadWithPartialName("System.Net.Http") | Out-Null >> } >> PS C:\Users\Administrator> # 检测 .NET 版本 PS C:\Users\Administrator> $dotnetVersion = [System.Environment]::Version PS C:\Users\Administrator> $isNet9OrNewer = $dotnetVersion.Major -ge 9 -or ($dotnetVersion.Major -eq 8 -and $dotnetVersion.Minor -ge 0) PS C:\Users\Administrator> PS C:\Users\Administrator> function Invoke-EnhancedCurlRequest { >> [CmdletBinding()] >> param( >> [Parameter(Mandatory=$true)] >> [string]$Uri, >> [ValidateSet('GET','POST','PUT','DELETE','PATCH','HEAD','OPTIONS')] >> [string]$Method = 'GET', >> [hashtable]$Headers = @{}, >> [object]$Body, >> [int]$Timeout = 30, >> [switch]$SkipCertificateCheck, >> [switch]$UseGzipCompression, >> [switch]$EnableHttp2 >> ) >> >> $resultTemplate = [PSCustomObject]@{ >> StatusCode = 0 >> StatusMessage = "NotExecuted" >> Headers = [ordered]@{} >> Content = $null >> IsSuccess = $false >> Technology = "None" >> ErrorMessage = $null >> ElapsedMs = 0 >> Protocol = "Unknown" >> DotnetVersion = $dotnetVersion.ToString() >> } >> >> $timer = [System.Diagnostics.Stopwatch]::StartNew() >> $result = $resultTemplate.PSObject.Copy() >> >> # 智能选择 HTTP 引擎 >> $useHttpClient = $true >> $oldCallback = $null >> >> # 检测环境是否支持 HttpClient >> if ($SkipCertificateCheck) { >> try { >> $testHandler = New-Object System.Net.Http.HttpClientHandler -ErrorAction Stop >> $testHandler.ServerCertificateCustomValidationCallback = { $true } -ErrorAction Stop >> } catch { >> $useHttpClient = $false >> } >> } >> 所在位置 行:36 字符: 80 + ... rverCertificateCustomValidationCallback = { $true } -ErrorAction Stop + ~~~~~~~~~~~~ 表达式或语句中包含意外的标记“-ErrorAction”。 所在位置 行:36 字符: 93 + ... rverCertificateCustomValidationCallback = { $true } -ErrorAction Stop + ~~~~ 表达式或语句中包含意外的标记“Stop”。 所在位置 行:1 字符: 37 + function Invoke-EnhancedCurlRequest { + ~ 语句块或类型定义中缺少右“}”。 + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : UnexpectedToken PS C:\Users\Administrator> if ($useHttpClient) { >> # ======================== .NET 9 优化实现 ======================== >> $result.Technology = "HttpClient(.NET $($dotnetVersion.Major))" >> >> try { >> # 创建 HttpClientHandler >> $handler = New-Object System.Net.Http.HttpClientHandler >> >> # .NET 9 特有的优化特性 >> if ($isNet9OrNewer) { >> # 启用 HTTP/2 或 HTTP/3 >> $handler.MaxConnectionsPerServer = 10 >> $handler.PooledConnectionLifetime = [System.TimeSpan]::FromMinutes(1) >> >> if ($EnableHttp2) { >> $handler.DefaultVersionPolicy = [System.Net.Http.HttpVersionPolicy]::RequestVersionOrHigher >> $handler.DefaultRequestVersion = [System.Version]::new(2, 0) >> } >> } >> >> # 证书验证 >> if ($SkipCertificateCheck) { >> $handler.ServerCertificateCustomValidationCallback = { >> param($sender, $cert, $chain, $errors) >> return $true >> } >> } >> >> # 压缩支持 >> if ($UseGzipCompression) { >> $handler.AutomaticDecompression = [System.Net.DecompressionMethods]::GZip >> } >> >> # 创建 HttpClient >> $client = New-Object System.Net.Http.HttpClient($handler) >> $client.Timeout = [System.TimeSpan]::FromSeconds($Timeout) >> >> # 创建请求消息 >> $request = New-Object System.Net.Http.HttpRequestMessage( >> [System.Net.Http.HttpMethod]::new($Method), $Uri >> ) >> >> # 协议版本设置 >> if ($isNet9OrNewer -and $EnableHttp2) { >> $request.Version = [System.Version]::new(2, 0) >> $request.VersionPolicy = [System.Net.Http.HttpVersionPolicy]::RequestVersionOrHigher >> } >> >> # 添加默认 User-Agent >> if (-not $Headers.ContainsKey('User-Agent')) { >> $request.Headers.TryAddWithoutValidation("User-Agent", "PowerShell-HTTPClient/1.0 (.NET $($dotnetVersion.Major))") >> } >> >> # 添加自定义头 >> foreach ($key in $Headers.Keys) { >> $request.Headers.TryAddWithoutValidation($key, $Headers[$key]) >> } >> >> # 处理请求体(.NET 9 优化) >> if ($Body -and @('POST','PUT','PATCH') -contains $Method) { >> if ($Body -is [byte[]]) { >> $request.Content = New-Object System.Net.Http.ByteArrayContent($Body) >> } >> elseif ($Body -is [hashtable] -or $Body -is [System.Collections.IDictionary]) { >> $jsonBody = $Body | ConvertTo-Json -Depth 10 -Compress >> $request.Content = New-Object System.Net.Http.StringContent( >> $jsonBody, >> [System.Text.Encoding]::UTF8, >> "application/json" >> ) >> } >> elseif ($Body -is [string]) { >> $request.Content = New-Object System.Net.Http.StringContent( >> $Body, >> [System.Text.Encoding]::UTF8 >> ) >> } >> else { >> throw "Unsupported body type: $($Body.GetType().Name)" >> } >> } >> >> # 发送请求(异步转同步) >> $response = $client.SendAsync($request).GetAwaiter().GetResult() >> >> # 记录实际使用的协议 >> $result.Protocol = "HTTP/" + $response.Version.ToString() >> >> # 解析响应 >> $result.StatusCode = [int]$response.StatusCode >> $result.StatusMessage = $response.ReasonPhrase >> $result.IsSuccess = $response.IsSuccessStatusCode >> >> # 处理响应头 >> $result.Headers = [ordered]@{} >> foreach ($header in $response.Headers) { >> $result.Headers[$header.Key] = $header.Value -join ", " >> } >> >> foreach ($header in $response.Content.Headers) { >> $result.Headers[$header.Key] = $header.Value -join ", " >> } >> >> # 读取响应内容(支持大文件流式处理) >> $result.Content = $response.Content.ReadAsStringAsync().GetAwaiter().GetResult() >> } >> catch [System.Threading.Tasks.TaskCanceledException] { >> $result.ErrorMessage = "Request timed out after $Timeout seconds" >> $result.StatusCode = 408 >> $result.StatusMessage = "Timeout" >> } >> catch [System.Net.Http.HttpRequestException] { >> # 增强的错误处理(.NET 9 提供更详细的错误信息) >> $ex = $_.Exception >> $result.ErrorMessage = $ex.ToString() >> >> # 检查具体错误类型 >> $dnsError = $false >> $sslError = $false >> >> if ($isNet9OrNewer) { >> # .NET 9 提供更精确的错误类型 >> if ($ex.InnerException -is [System.Net.Sockets.SocketException]) { >> $dnsError = $true >> } >> elseif ($ex.InnerException -is [System.Security.Authentication.AuthenticationException]) { >> $sslError = $true >> } >> } else { >> # 旧版兼容性处理 >> $currentException = $ex >> while ($currentException -ne $null) { >> if ($currentException -is [System.Net.Sockets.SocketException]) { >> $dnsError = $true >> break >> } >> if ($currentException -is [System.Security.Authentication.AuthenticationException]) { >> $sslError = $true >> break >> } >> $currentException = $currentException.InnerException >> } >> } >> >> if ($dnsError) { >> $result.StatusCode = 0 >> $result.StatusMessage = "DNSResolutionFailed" >> } >> elseif ($sslError) { >> $result.StatusCode = 495 >> $result.StatusMessage = "SSLCertificateError" >> } >> else { >> $result.StatusCode = 500 >> $result.StatusMessage = "HttpRequestError" >> } >> } >> catch { >> $result.ErrorMessage = $_.Exception.ToString() >> $result.StatusCode = 500 >> $result.StatusMessage = "InternalError" >> } >> finally { >> # 释放资源 >> if ($response -is [System.IDisposable]) { $response.Dispose() } >> if ($request -is [System.IDisposable]) { $request.Dispose() } >> if ($client -is [System.IDisposable]) { $client.Dispose() } >> if ($handler -is [System.IDisposable]) { $handler.Dispose() } >> } >> } >> else { >> # ======================== 备用实现(兼容旧版) ======================== >> $result.Technology = "HttpWebRequest" >> >> try { >> # 设置全局证书验证回调 >> if ($SkipCertificateCheck) { >> $oldCallback = [System.Net.ServicePointManager]::ServerCertificateValidationCallback >> [System.Net.ServicePointManager]::ServerCertificateValidationCallback = { >> param($sender, $certificate, $chain, $sslPolicyErrors) >> return $true >> } >> } >> >> # 创建请求 >> $request = [System.Net.HttpWebRequest]::Create($Uri) >> $request.Method = $Method >> $request.Timeout = $Timeout * 1000 >> >> # 添加默认 User-Agent >> if (-not $Headers.ContainsKey('User-Agent')) { >> $request.UserAgent = "PowerShell-HTTPClient/1.0 (Legacy)" >> } >> >> # 添加自定义头 >> foreach ($key in $Headers.Keys) { >> $request.Headers.Add($key, $Headers[$key]) >> } >> >> # 处理请求体 >> if ($Body -and @('POST','PUT','PATCH') -contains $Method) { >> $request.ContentType = "application/json" >> $bodyBytes = [System.Text.Encoding]::UTF8.GetBytes(($Body | ConvertTo-Json -Depth 10 -Compress)) >> $request.ContentLength = $bodyBytes.Length >> >> $requestStream = $request.GetRequestStream() >> $requestStream.Write($bodyBytes, 0, $bodyBytes.Length) >> $requestStream.Close() >> } >> >> # 发送请求并获取响应 >> $response = $request.GetResponse() >> $result.StatusCode = [int]$response.StatusCode >> $result.StatusMessage = $response.StatusDescription >> $result.IsSuccess = $result.StatusCode -ge 200 -and $result.StatusCode -lt 300 >> >> # 读取响应头 >> $result.Headers = [ordered]@{} >> foreach ($key in $response.Headers.AllKeys) { >> $result.Headers[$key] = $response.Headers[$key] >> } >> >> # 读取响应体 >> $responseStream = $response.GetResponseStream() >> $reader = New-Object System.IO.StreamReader($responseStream) >> $result.Content = $reader.ReadToEnd() >> $reader.Close() >> $response.Close() >> } >> catch [System.Net.WebException] { >> $ex = $_.Exception >> $result.ErrorMessage = $ex.ToString() >> >> if ($ex.Response -ne $null) { >> $httpResponse = $ex.Response >> $result.StatusCode = [int]$httpResponse.StatusCode >> $result.StatusMessage = $httpResponse.StatusDescription >> >> # 读取错误响应体 >> $errorStream = $httpResponse.GetResponseStream() >> $errorReader = New-Object System.IO.StreamReader($errorStream) >> $result.Content = $errorReader.ReadToEnd() >> $errorReader.Close() >> } >> else { >> # 检查具体错误类型 >> if ($ex.Status -eq [System.Net.WebExceptionStatus]::NameResolutionFailure) { >> $result.StatusCode = 0 >> $result.StatusMessage = "DNSResolutionFailed" >> } >> elseif ($ex.Status -eq [System.Net.WebExceptionStatus]::TrustFailure) { >> $result.StatusCode = 495 >> $result.StatusMessage = "SSLCertificateError" >> } >> elseif ($ex.Status -eq [System.Net.WebExceptionStatus]::Timeout) { >> $result.StatusCode = 408 >> $result.StatusMessage = "Timeout" >> } >> else { >> $result.StatusCode = 500 >> $result.StatusMessage = "WebException" >> } >> } >> } >> catch { >> $result.ErrorMessage = $_.Exception.ToString() >> $result.StatusCode = 500 >> $result.StatusMessage = "InternalError" >> } >> finally { >> # 恢复全局证书验证回调 >> if ($SkipCertificateCheck) { >> [System.Net.ServicePointManager]::ServerCertificateValidationCallback = $oldCallback >> } >> } >> } >> 在此对象上找不到属性“Technology”。请确认该属性存在并且可设置。 所在位置 行:153 字符: 9 + $result.Technology = "HttpWebRequest" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [],RuntimeException + FullyQualifiedErrorId : PropertyNotFound 在此对象上找不到属性“ErrorMessage”。请确认该属性存在并且可设置。 所在位置 行:235 字符: 13 + $result.ErrorMessage = $_.Exception.ToString() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [],RuntimeException + FullyQualifiedErrorId : PropertyNotFound PS C:\Users\Administrator> $timer.Stop() 不能对 Null 值表达式调用方法。 所在位置 行:1 字符: 5 + $timer.Stop() + ~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [],RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull PS C:\Users\Administrator> $result.ElapsedMs = $timer.ElapsedMilliseconds 在此对象上找不到属性“ElapsedMs”。请确认该属性存在并且可设置。 所在位置 行:1 字符: 5 + $result.ElapsedMs = $timer.ElapsedMilliseconds + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [],RuntimeException + FullyQualifiedErrorId : PropertyNotFound PS C:\Users\Administrator> return $result PS C:\Users\Administrator> } 所在位置 行:1 字符: 1 + } + ~ 表达式或语句中包含意外的标记“}”。 + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : UnexpectedToken PS C:\Users\Administrator> PS C:\Users\Administrator> # 导出模块成员 PS C:\Users\Administrator> Export-ModuleMember -Function Invoke-EnhancedCurlRequest Export-ModuleMember : 只能从模块内调用 Export-ModuleMember cmdlet。 所在位置 行:1 字符: 1 + Export-ModuleMember -Function Invoke-EnhancedCurlRequest + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (:) [Export-ModuleMember], InvalidOperationException + FullyQualifiedErrorId : Modules_CanOnlyExecuteExportModuleMemberInsideAModule,Microsoft.PowerShell.Commands.Expo rtModuleMemberCommand PS C:\Users\Administrator> PS C:\Users\Administrator>
最新发布
08-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值