【问题标题】:POST Json web API C#POST Json Web API C#
【发布时间】:2021-08-20 10:14:37
【问题描述】:

我正在尝试在C# 中通过HTTP 客户端发布api,对于授权,我们发送Bearer 令牌。 但它没有被插入客户端。它会引发错误。

我的代码在这里:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
            string result = "";
            using (var client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }))
            {
                client.BaseAddress = new Uri(baseURL);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Add("Cookie", "ebpPermHash=-396055074);
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + authtoken);
                client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
                client.DefaultRequestHeaders.Add("Accept-Language", "en-GB,en-US;q=0.9,en;q=0.8");
                client.DefaultRequestHeaders.Add("Cache-Control", "no-cache")
                client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
                client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
                
                HttpResponseMessage response = client.PostAsJsonAsync("/v2/bb/sa", payModel).Result;
                
                var responseString = response.Content.ReadAsStringAsync();
                result = responseString.Result;
                dynamic data = JObject.Parse(result);
                string throwresult = Convert.ToString(data);
                result = data.authToken;
                logErr.ControlLog(throwresult);
            }
            return result;

但我收到如下错误:

exceptionType": "com.ebpsource.exception.AuthenticationFailedException",
  "name": "AUTHENTICATION_REQUIRED",
  "message": "Authentication is required to call 'Resource.execute'",
  "address": "/service/Resource.execute",
  "httpRequestBody": {
    "header": {
      "config": {
        "action": "insert",
        "resourceName": "sa"
      }

提前致谢。

【问题讨论】:

    标签: c# httpclient rest


    【解决方案1】:

    我建议你先用 Postman 检查你的后端,确认是后端问题还是客户端问题

    【讨论】:

    • 嗨,我用邮递员试过没有问题,但在 c# 代码中我尝试实现它。但会抛出一个错误,如 ```` Id = 72, Status = RanToCompletion, Method = "{null}", Result = "{\"exceptionType\":\"com.ebpsource.exception.AuthenticationFailedException\",\"name \":\"AUTHENTICATION_REQUIRED\", \"message\":\"调用'Resource.execute'需要验证\",\"address\":\"/service/Resource.execute\",\"httpRequestBody \":{\"header\":{\"config\":{\"action\":\"insert\", \"resourceName\":\"sa\"}}````。跨度>
    • 请尝试将邮递员请求转换为邮递员的c#代码,请查看learning.postman.com/docs/sending-requests/…
    【解决方案2】:

    你有一个错误,添加标记的语法错误。再加上许多标题。试试这个

    using (var client = new HttpClient())
    {
    
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);        
    var contentType = new MediaTypeWithQualityHeaderValue("application/json");  
    client.DefaultRequestHeaders.Accept.Add(contentType);
    client.BaseAddress = new Uri(baseAddress);
    var jsonData = JsonConvert.SerializeObject(payModel);
    var contentData = new StringContent(jsonData, Encoding.UTF8, "application/json");
    var response =  client.PostAsync("/v2/bb/sa", contentData).Result;
    if (response.IsSuccessStatusCode)
    {
    var stringData = response.Content.ReadAsStringAsync().Result;
    var result = JsonConvert.DeserializeObject<object>(stringData);
    }
    }
    

    更新

    如果你需要添加 cookie,你可以这样做

    var cookieContainer = new CookieContainer();
    using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
    using (var client = new HttpClient(handler))
    {
        ....
        cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
    .....
    }
    

    【讨论】:

    • 嗨,Serge,我用你的代码试过了,它给我抛出了错误{StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 1.1, Content: System.Net.Http.StreamContent, Transfer-Encoding: chunked Connection: keep-alive Access-Control-Allow-Origin: http://localhost:3000 Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: GET,DELETE,PUT,POST Access-Control-Allow-Headers: authorization,Access-Control-Allow-Origin,Content-Type,Action,cache-control,if-modified-since,pragma,ebpAppKey Date: Fri, 20 Aug 2021 12:54:45 GMT Content-Type: application/json; charset=utf-8 }}
    • @padmapriya 很抱歉,但我认为您的令牌对此 API 无效或不允许使用令牌角色。可以发个API和API的启动文件吗?
    • 嗨,Serge,问题在于设置 cookie。我有两个 cookie 示例:ebpPermHash、ebpauth。我需要在我的代码中为这两个 cookie 赋值。您能分享如何通过不记名授权添加这些 cookie。
    • 好吧,我不知道您正在使用 cookie 进行授权。尝试添加它们。
    • 嗨 Serge,这是生成令牌的代码 ```` HttpResponseMessage response = client.PostAsJsonAsync("/v2/bb/authtoken", authToken).Result; var responseString = response.Content.ReadAsStringAsync();result = responseString.Result;动态数据 = JObject.Parse(result); cookies = (header => header.Key == "Set-Cookie").Value;sring throwresult = Convert.ToString(data);result data.authToken;l;```` 我使用这个 authtoken 并生成两个 cookie ebpPermHash ; ebpauth;.现在我只在 post api 中传递 authtoken。我也需要传递 cookie。我怎么能通过?你有什么想法吗?
    猜你喜欢
    • 2021-04-11
    • 2020-05-23
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多