C# RestSharp POST请求JSON转义异常 返回storage_id无效错误
RestSharp对接Baselinker API报Invalid storage identifier错误解决
对接Baselinker平台API时,使用官方网页测试工具提交参数可返回正常响应:
API测试入口:https://api.baselinker.com/index.php?tester
错误复现
使用如下RestSharp代码发起请求:
public async Task xdAsync() { var client = new RestClient("https://api.baselinker.com/connector.php"); string token = "my API token here"; RestRequest request = new RestRequest(); request.AddParameter("token", token); request.AddParameter("method", "addProductVariant"); request.AddParameter("application/json","{\"storage_id\":\"bl_1\",\"product_id\":\"67564668\",\"variant_id\":1055421650,\"name\":\"42\",\"quantity\":5,\"price_brutto\":599.99,\"ean\":29193201490}",ParameterType.RequestBody); var response = await client.PostAsync(request); Console.WriteLine(response.Content); }
接口固定返回错误:
{"status":"ERROR","error_code":"ERROR_STORAGE_ID","error_message":"Invalid storage identifier provided."}
尝试过去除JSON转义斜杠、使用@逐字字符串定义JSON等方案,均未解决问题。
作为对照,使用HttpWebRequest实现POST请求逻辑时可正常返回结果:
// 测试请求示例 var url = "https://reqbin.com/echo/post/json"; var httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.Method = "POST"; httpRequest.Accept = "application/x-www-form-urlencoded"; httpRequest.Headers["Authorization"] = "My API KEY"; httpRequest.ContentType = "application/json"; var data = @"{ ""addProductVariant"":{ ""storage_id"":""bl_1"", ""product_id"":""67564668"", ""variant_id"":""10525421650"", ""name"":""42"", ""quantity"":""10"", ""price_brutto"":""599.99"", ""ean"":""29193201490"" } } "; using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream())) { streamWriter.Write(data); } var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); Console.WriteLine(result.ToString()); } Console.WriteLine(httpResponse.StatusCode);
返回结果:
{"success":"true"} OK
相同参数下HttpWebRequest实现可正常运行,仅RestSharp实现触发报错。
问题原因
- 传参格式不符合接口要求:Baselinker API不接受纯JSON Body的POST请求,所有请求需使用
application/x-www-form-urlencoded格式提交,其中token、method为独立表单字段,业务参数要序列化为JSON字符串后赋值给parameters表单字段。之前的写法直接把业务JSON设为RequestBody,同时单独添加token、method参数,RestSharp组装请求时会将这两个字段追加到URL查询串,服务端从表单中读不到parameters字段,无法解析出storage_id,直接返回对应错误。 - JSON结构不匹配:对照的HttpWebRequest示例使用的是公共测试地址,其要求的参数结构和Baselinker官方接口不一致,之前提交的RestSharp请求JSON结构和接口要求不匹配,就算服务端读到Body内容也无法正确解析。
修复方案
按照Baselinker官方要求的表单格式组装RestSharp请求即可:
public async Task AddProductVariantAsync() { var client = new RestClient("https://api.baselinker.com/connector.php"); const string token = "替换为你的实际API Token"; var request = new RestRequest(Method.Post); // 组装业务参数并序列化为JSON字符串 var bizParams = new { storage_id = "bl_1", product_id = "67564668", variant_id = 1055421650, name = "42", quantity = 5, price_brutto = 599.99, ean = "29193201490" }; var parametersJson = System.Text.Json.JsonSerializer.Serialize(bizParams); // 按接口要求添加所有表单字段 request.AddParameter("token", token); request.AddParameter("method", "addProductVariant"); request.AddParameter("parameters", parametersJson); var response = await client.PostAsync(request); Console.WriteLine(response.Content); }
提示:不要直接照搬HttpWebRequest示例里嵌套方法名的JSON结构,对接Baselinker时直接将业务参数序列化后传给parameters字段即可,和官方网页测试工具的传参逻辑保持一致。
内容的提问来源于stack exchange,提问作者Adam Zbudniewek
相关产品推荐
相关产品推荐

