使用httpClient 上传文件
需求如下,上传文件接口:
POST /api/app/v01 HTTP/1.1
User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; xiaomi 6 Build/LYZ28N) ShoppiesForAndroidApp Version/3.0.15
Cache-Control: no-cache
Content-Type: multipart/form-data; boundary=e7ada41b-4d41-4c87-b050-076f7766ec1e
Content-Length: 148846
Host: api.shoppies.jp
Connection: Keep-Alive
Accept-Encoding: gzip
Api.cs 实现
/// <summary>
/// 上传图片
/// </summary>
/// <param name="user"></param>
/// <param name="filename"></param>
/// <param name="bytes"></param>
/// <returns></returns>
public async Task<HttpRes> UploadImage(User user, string filename, byte[] bytes)
{
var token = JpUtil.GetApplicationToken(JpUtil.APP_VERSION, user.Uuid);
var g = new G {PageId = "SLI_MR001", SessionId = null, Token = token, Version = JpUtil.APP_VERSION};
var body = new RequestBody {G = g};
var c = new Dictionary<string, object>();
var cItems = new List<CItem> {new CItem {Method = "setPhoto", Option = null}};
c.Add("Sales", cItems);
body.C = c;
var client = _factory.CreateClient("api.shoppies.jp");
client.Timeout = TimeSpan.FromSeconds(60);
var content = new MultipartFormDataContent();
content.Add(new StringContent(JsonConvert.SerializeObject(body.G)), "g");
content.Add(new StringContent(JsonConvert.SerializeObject(body.C)), "c");
//添加图片
content.Add(new ByteArrayContent(bytes), "image", filename);
//添加图片
var req = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.shoppies.jp/api/app/v01"),
Content = content,
Headers =
{
{
"User-Agent",
"Dalvik/2.1.0 (Linux; U; Android 5.1.1; xiaomi 6 Build/LYZ28N) ShoppiesForAndroidApp Version/3.0.15"
}
}
};
return await Request(client, req);
}
具体请求调用方法
public async Task<HttpRes> Request(HttpClient client, HttpRequestMessage req)
{
var httpRes = new HttpRes
{
Data = null,
Ok = false,
Message = "REQUEST FAIL",
Status = 200,
Method = req.Method.ToString()
};
try
{
client.Timeout = TimeSpan.FromSeconds(60);
var res = await client.SendAsync(req);
httpRes.Status = (int) res.StatusCode;
if (res.IsSuccessStatusCode)
{
var html = await res.Content.ReadAsStringAsync();
httpRes.Str = html;
try
{
var data = JsonConvert.DeserializeObject<ResData>(html);
httpRes.Data = data;
httpRes.Code = data.StatusCode;
}
catch (Exception e)
{
// ignored
}
httpRes.Ok = res.StatusCode == HttpStatusCode.OK; //默认code
}
}
catch (Exception ex)
{
httpRes.Ok = false;
httpRes.Message = $"请求异常:{ex.Message}";
}
finally
{
Console.WriteLine($"URI:{req.RequestUri}\tRespMessage:{httpRes.Message}\tStatus={httpRes.Status}");
}
return httpRes;
}