求Astrometry.NET登录接口的正确C#/VB.NET JSON POST请求代码
Astrometry.NET 登录接口 VB.NET/C# 代码修正方案
当前调用Astrometry.NET登录接口时返回 {"status": "error", "errormessage": "no json"},期望接口能正确识别JSON请求(哪怕用错误密钥也应返回"bad apikey")。
原VB.NET代码:
Dim LoginURL As String = "http://nova.astrometry.net/api/login" Dim Enc As System.Text.Encoding = System.Text.Encoding.UTF8 Dim MediaType As String = "application/json" Dim JSONContent As String = "{""apikey"": """ & APIKey & """}" Dim C2String As New System.Net.Http.StringContent(JSONContent , Enc, MediaType) 'Run the query Dim MyClient As New System.Net.Http.HttpClient Dim F As System.Net.Http.HttpResponseMessage = Await MyClient.PostAsync(LoginURL, C2String) Dim Code As String = Await F.Content.ReadAsStringAsync()
修正后的VB.NET代码
Imports System.Net.Http Imports System.Text.Json Public Async Function AstrometryLoginAsync(apiKey As String) As Task(Of String) Dim loginUrl As String = "http://nova.astrometry.net/api/login" ' 使用JsonSerializer生成标准JSON,避免手动拼接的格式错误 Dim requestData = New With {.apikey = apiKey} Dim jsonContent = JsonSerializer.Serialize(requestData) ' 明确设置Content-Type为application/json,确保服务器识别 Dim content = New StringContent(jsonContent, System.Text.Encoding.UTF8, "application/json") ' 用Using块管理HttpClient生命周期,避免资源泄漏 Using client As New HttpClient() Dim response = Await client.PostAsync(loginUrl, content) Return Await response.Content.ReadAsStringAsync() End Using End Function
对应的C#代码
using System.Net.Http; using System.Text.Json; public async Task<string> AstrometryLoginAsync(string apiKey) { string loginUrl = "http://nova.astrometry.net/api/login"; var requestData = new { apikey = apiKey }; string jsonContent = JsonSerializer.Serialize(requestData); var content = new StringContent(jsonContent, System.Text.Encoding.UTF8, "application/json"); using (HttpClient client = new HttpClient()) { HttpResponseMessage response = await client.PostAsync(loginUrl, content); return await response.Content.ReadAsStringAsync(); } }
关键修正点
- 使用
System.Text.Json序列化对象生成JSON,避免手动拼接字符串可能导致的格式错误(比如APIKey含特殊字符时)。 - 确保
StringContent的MediaType参数精确设置为"application/json",让服务器明确识别请求体格式。 - 添加
Using块管理HttpClient生命周期,避免资源泄漏。
修改后,即使传入错误的APIKey,接口也会返回{"status": "error", "errormessage": "bad apikey"},说明请求已被正确识别。
内容的提问来源于stack exchange,提问作者Martin Weiss
相关产品推荐
相关产品推荐

