无法接收 API 响应

  • 本文关键字:API 响应 c# python curl
  • 更新时间 :
  • 英文 :


我被困在如何将python代码转换为c#上。我尝试了很多次,但没有收到 API 响应。首先我试了这个
我的蟒蛇代码

import sys
import base64
import requests
import json
file_path = 'limit.jpg'
image_uri = "data:image/jpg;base64," + base64.b64encode(open(file_path, "rb").read()).decode()
r = requests.post("https://api",
data=json.dumps({'src': image_uri}),
headers={"app_id": "YOUR_APP_ID", "app_key": "YOUR_APP_KEY",
"Content-type": "application/json"})
print(json.dumps(json.loads(r.text), indent=4, sort_keys=True))

第一次尝试

using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api."))
{
request.Headers.TryAddWithoutValidation("app_id", id);
request.Headers.TryAddWithoutValidation("app_key",apiKey);
request.Content = new StringContent("{ "src": "data:image/jpeg;base64",PathToImage);
request.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
var response =  httpClient.SendAsync(request).Result;
Console.WriteLine(    await response.Content.ReadAsStringAsync());
}
}

但是这里没有运气的 API 响应是{"error":"SyntaxError: JSON 输入的意外结束","error_info":{"id":"json_syntax","消息":"语法错误: JSON 输入的意外结束"}}我也尝试转换 cURL -

curl -X POST https://api 
-H 'app_id: YOUR_APP_ID' 
-H 'app_key: YOUR_APP_KEY' 
-H 'Content-Type: application/json' 
--data '{ "src": "data:image/jpeg;base64,'$(base64 -i limit.jpg)'" }'

但又没有运气了。也许我对图像中的转换base64有误。

Python 代码不连接字符串。它的作用是:

  1. 加载文件的内容,
  2. 使用 Base64 对它们进行编码
  3. 从 Base64 字符串创建图像 uri
  4. 创建键为src字典,并对图像 URI 进行值处理。
  5. 该字典被序列化为 JSON。
  6. json 字符串发布到 API

C#中完全相同的步骤是:

var data=File.ReadAllBytes(PathToImage);
var base64=Convert.ToBase64(data);
var imageUri="data:image/jpg;base64," + base64;
var json=JsonConvert.SerializeObject(new {src=imageUri});
var content=new StringContent(json,Encoding.UTF8,"application/json");
await _client.PostAsync(apiUrl,content);

调用可以组合,但最好在尝试缩短代码之前从干净的代码开始。与Python的一个区别是,这里使用new {src=imageUri}而不是字典创建一个匿名对象

。HttpClient 实例是线程安全的,旨在重用,而不是释放。API密钥可以在创建HttpClient实例时设置一次,例如:

_client.DefaultRequestHeaders.TryAddWithoutValidation("app_id", id);
_client.DefaultRequestHeaders.TryAddWithoutValidation("app_key",apiKey);

我注意到您正在传递 PathToImage(我相信它具有图像文件的物理路径(而不是 base64 编码的图像内容。请尝试以下操作:

编辑代码 :

request.Content = new StringContent("{ "src": "data:image/jpeg;base64,",Convert.ToBase64(System.IO.File.ReadAllBytes(PathToImage)),"" }");

在 base64 之后缺少一些语法更正,如下所示 =>逗号。(我现在已添加(

最后,您必须指定"\" }",用结尾引号关闭打开大括号以标记 json 对象的结尾

最新更新