吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1447|回复: 9
收起左侧

[已解决] c#内置的HttpClient如何向服务器发GBK编码的中文内容?

[复制链接]
getstr88 发表于 2022-7-15 16:49
本帖最后由 getstr88 于 2022-7-16 08:23 编辑

客户要用C#新做PC上的客户端,他们原来的服务器程序不动。但我发现,他们服务器程序中,都是用的GBK编码,而不是一般UTF-8

比如反馈功能,提交表单用content-type服务器规定是:multipart/form-data

我用HttpClient
string boundary = string.Format(DateTime.Now.Ticks.ToString("x"));
MultipartFormDataContent content = new MultipartFormDataContent(boundary);
StringContent stringContent1 = new StringContent("测试反馈内容");
stringContent1.Headers.ContentType = null;
content.Add(stringContent1,"text");
……
省略另外一堆StringContent ……

这样的话,服务器那边按原来逻辑,解析传上去的内容都是乱码(应该是我发的UTF-8,服务器按GBK解析)

我先尝试第1种:按HTTP标准,设置stringContent1.Headers.ContentType指定chaset为UTF-8
但这种不行。因为他们那边服务器没有做的很规范,根本不认header中的这个属性,统统就是GBK处理,所以没办法。本来我想骂街,结果网上一搜这个问题,服务器不按HTTP标准处理header中charset的反而是多数
哎,所以,这条路就不用想了。服务器是客户那里祖传的,不准备动。原来给他们开发那个的古董服务器的公司貌似都解散了……

然后我尝试这样修改代码,结果不对。成了另外的乱码:
byte[] bytes = Encoding.Unicode.GetBytes("测试反馈内容");
string text = Encoding.GetEncoding("GBK").GetString(bytes);

我不太理解,应该是什么转什么

所以,请教下大佬们,我该怎么写代码,能让服务器正确接收到GBK的?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

williamlyf 发表于 2022-7-15 17:03
本帖最后由 williamlyf 于 2022-7-15 17:06 编辑
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNetCore.Mvc;

namespace HttpClientFactoryDemo.Controllers
{
  [Route("api/[controller]")]
  [ApiController]
  public class ValuesController : ControllerBase
  {
    private readonly IHttpClientFactory _httpClientFactory;

    public ValuesController(IHttpClientFactory httpClientFactory)
    {
      _httpClientFactory = httpClientFactory;
    }

    public static string UrlEncode(string temp, Encoding encoding)
    {
      StringBuilder stringBuilder = new StringBuilder();
      for (int i = 0; i < temp.Length; i++)
      {
        string t = temp[i].ToString();
        string k = HttpUtility.UrlEncode(t, encoding);
        if (t == k)
        {
          stringBuilder.Append(t);
        }
        else
        {
          stringBuilder.Append(k.ToUpper());
        }
      }
      return stringBuilder.ToString();
    }

    [HttpGet]
    public async Task<ActionResult> Get()
    {
      Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
      string xmlContent = "<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"yes\"?><xml><version>1</version><ins_cd>08A9999999</ins_cd><mchnt_cd>0002900F0370588</mchnt_cd><term_id></term_id><random_str>93b4efa6d0d84808a76355ff0f7a178d</random_str><sign>G1+TBpyEVwsQjeJ9X7zrObRTFtI/ItuJWEEYl3AT/9XlFd844Jv2Wb/gNVkuEVP890Tf1Ub+EaTe1qByHSu97cpQr6riuDxqw2nnjKZBZsG00C1d8070sZPf4c1hkSUfhlR2nPn+7dvIanLCjRFzTgoTQ/WtcArrL/SJIJeaXYg=</sign><order_type>ALIPAY</order_type><goods_des>卡盟测试</goods_des><goods_detail></goods_detail><addn_inf></addn_inf><mchnt_order_no>2018121302054468584629</mchnt_order_no><curr_type></curr_type><order_amt>1</order_amt><term_ip>127.0.0.1</term_ip><txn_begin_ts>20181213020544</txn_begin_ts><goods_tag></goods_tag><auth_code>288232051781304899</auth_code><sence>1</sence><reserved_sub_appid></reserved_sub_appid><reserved_limit_pay></reserved_limit_pay></xml>";
      xmlContent = UrlEncode(xmlContent, Encoding.GetEncoding("GBK"));

      Dictionary<string, string> nvs = new Dictionary<string, string> { { "req", xmlContent } };
      Encoding encoding = Encoding.GetEncoding("GBK");
      StringBuilder buffer = new StringBuilder();
      int i = 0;
      IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(nvs);
      foreach (KeyValuePair<string, string> kvp in nvs)
      {
        buffer.AppendFormat(i > 0 ? "&{0}={1}" : "{0}={1}", kvp.Key,
          UrlEncode(kvp.Value, Encoding.GetEncoding("GBK")));
        i++;
      }
      byte[] postBody = encoding.GetBytes(buffer.ToString());

      var client = _httpClientFactory.CreateClient("HttpClientFactoryDemo");
      var request = new HttpRequestMessage
      {
        RequestUri = new Uri("https://spay.fuiou.com/commonQuery"),
        Method = HttpMethod.Post,
        Content = new ByteArrayContent(postBody),
      };

      request.Content.Headers.ContentType =
        new MediaTypeHeaderValue("application/x-www-form-urlencoded");

      return Ok(await client.SendAsync(request));

    }
  }
}

https://www.mianshigee.com/note/detail/62419gav

 楼主| getstr88 发表于 2022-7-15 17:11
williamlyf 发表于 2022-7-15 17:03
[md]```
using System;
using System.Collections.Generic;

怪我忘了说了。把要传的中文string用HttpUtility.UrlEncode转为GBK也没用

他家服务器,直接就把%xx%xx%xx直接当成了字符串,而没有URL解码后使用
Mr.[先知] 发表于 2022-7-15 17:51
utf8转gbk 最终是字节集
你发送post 传入这个字节集 就可以了呀
 楼主| getstr88 发表于 2022-7-15 18:00
Summer大大 发表于 2022-7-15 17:27
Post Byte[],Byte[]转成gbk

怎么在httpclient框架下转为byte[] 发,httpclient API限制的恨死,没找到支持你这样的做法啊
 楼主| getstr88 发表于 2022-7-15 18:02
Mr.[先知] 发表于 2022-7-15 17:51
utf8转gbk 最终是字节集
你发送post 传入这个字节集 就可以了呀

那具体代码怎么写呢。我上面尝试那么转不行。求个具体的
 楼主| getstr88 发表于 2022-7-16 07:23
本帖最后由 getstr88 于 2022-7-16 07:32 编辑

if (requestBodies != null)
            {
                foreach (var keyValuePair in requestBodies)
                {
                    ByteArrayContent byteArrayContent = new ByteArrayContent(Encoding.GetEncoding("GBK").GetBytes(keyValuePair.Value));

                    content.Add(byteArrayContent, keyValuePair.Key);

                }
            }

改成这样后,服务器直接解析不了发的东西了


requestBodies 是dictionary<string,string>

另外,还有问题是,httpclient这个API的key只能传string,在另外请求服务器API,有的key服务器那边定义的是中文,像我昨晚开始做的,请假申请那个服务器API,还是multiply/form-data,但key为“申请人”“申请时间”“请假理由”,“处理意见”
 楼主| getstr88 发表于 2022-7-16 08:22
我知道解决办法了。stringContent有个构造函数能指定Encoding,ok,结贴
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表