使用C# HttpWebRequest发起POST请求获取令牌的常见实现问题
POST获取接口令牌的实现问题
当前实现存在的问题
- 此前配置
httpWReq.Credentials = new NetworkCredential("myUsername","myPassword")未生效:该属性仅用于传递HTTP协议层面的身份认证(比如Basic认证),当接口要求将账号密码放入请求体传参时,该配置不会把账号密码写入请求报文体,自然无法被后端识别 - 请求体格式错误:当前拼接的
user=myUserName,password=myPassword既不是合法的JSON结构,参数键名也和接口要求不匹配,会直接导致后端解析失败 - 缺少响应读取逻辑:代码完成请求体写入后,没有对应的逻辑获取接口返回的响应内容,也就拿不到最终的令牌值
参考接口文档

现有实现代码
HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create( "https://myportalURI.com/token"); string s = "user=myUserName,password=myPassword"; var data = Encoding.Default.GetBytes(s); httpWReq.Method = "POST"; httpWReq.ContentType = "application/json"; httpWReq.ContentLength = data.Length; var newStream = httpWReq.GetRequestStream(); newStream.Write(data, 0, data.Length); newStream.Close();
修正方向
- 严格对齐接口文档的要求构造请求体:如果接口要求JSON格式传参,需构造合法的JSON字符串(例如
{"username":"myUserName","password":"myPassword"}),注意参数键名必须和文档完全一致,不能随意改名 - 补充响应读取逻辑:写完请求体后,调用
httpWReq.GetResponse()获取响应对象,再通过响应流读取返回的文本内容,即可拿到接口返回的令牌信息 - 如果是标准OAuth2密码模式的取token接口,需要将ContentType调整为
application/x-www-form-urlencoded,请求体按照表单格式拼接为grant_type=password&username=myUserName&password=myPassword,不能直接用JSON格式提交
内容的提问来源于stack exchange,提问作者Baddack
相关产品推荐
相关产品推荐

