Как передать значение JSON с помощью Web API Post

Я просто хочу передать параметры Json (http://localhost:8700/api/signals/Web_Collection?commit=true) с использованием webapi с базовой аутентификацией, с проверкой имени пользователя и паролем test123

Когда я нажимаю кнопку, она переходит к FusionApi.cs, и у меня возникает проблема с передачей значения json в URL-адрес API.

Мне нужно добавить обычную аутентификацию (имя пользователя : test и пароль : test123).

Для параметров у него есть commit=true для заголовков, content-Type: "application/json”

[
 {"params": {
      "query": "Service",
      "filterQueries": ["!haslayout_b:false","searchable_s:false"],
      "docId": "http://web_intranet/{8f31bf38-069e-4ce7-a108-b3e7903fd26c}?lang=en&ver=2&ndx=sitecore_web_index" },
 "type":"test",
 "timestamp": "2015-05-10T19:05:00.000Z"
 }
]

HTML:

<body>

    <div class="container">
        <div class="row" style="margin-top:25px;">
            <div class="col-md-4">
                <label>Query:</label>
            </div>
            <div class="col-md-6">
                <input type="text" class="form-control" id="Query">
            </div>
        </div>
        <div class="row" style="margin-top:10px;">
            <div class="col-md-4">
                <label>FilterQueries-haslayout_b:</label>
            </div>
            <div class="col-md-6">
                <label class="radio-inline"><input type="radio" name="haslayout_b" value="true">True</label>
                <label class="radio-inline"><input type="radio" name="haslayout_b" value="false" checked>False</label>
            </div>
        </div>
        <div class="row" style="margin-top:10px;">
            <div class="col-md-4">
                <label>FilterQueries-searchable_s:</label>
            </div>
            <div class="col-md-6">
                <label class="radio-inline"><input type="radio" name="searchable_s" value="true">True</label>
                <label class="radio-inline"><input type="radio" name="searchable_s" value="false" checked>False</label>
            </div>
        </div>
        <div class="row" style="margin-top:10px;">
            <div class="col-md-4">
                <label>DocId:</label>
            </div>
            <div class="col-md-6">
                <textarea class="form-control" rows="5" id="DocId"></textarea>
            </div>
        </div>
        <div class="row" style="margin-top:25px;">
            <div class="col-md-4">
                <label>Type:</label>
            </div>
            <div class="col-md-6">
                <input type="text" class="form-control" id="Type" value="click" disabled>
            </div>
        </div>
        <div class="row" style="margin-top:25px;">
            <div class="col-md-4">
                <label>Timestamp:</label>
            </div>
            <div class="col-md-6">
                <input type="date" value="@System.DateTime.Today.ToShortDateString()" id="Timestamp" disabled>
            </div>
        </div>
        <button type="button" onclick="FusionPost()" class="btn btn-success" style="float:right;">Submit</button>
    </div>
</body>
</html>

<script>
    function FusionPost() {
        debugger;
        var FusionValue = {
            query: $("#Query").val(),
            haslayout_b: $("input[name='haslayout_b']:checked").val(),
            searchable_s: $("input[name='searchable_s']:checked").val(),
            docId: $("#DocId").val(),
            type: $("#Type").val(),
            timestamp: $("#Timestamp").val()
        };

            $.ajax({
                type: "POST",
                url: "@Url.Action("FusionApi", "Fusion")",
                datatype: "JSON",
                data: { FusionValue},
                success: function (Result) {                       
                    console.log(Result.type);

                }
            })    };
</script>

Cs-код:

public JsonResult FusionApi(Fusions FusionValue)
        {
            try
            {

                using (HttpClient client = new HttpClient())
                {
                    client.DefaultRequestHeaders.TryAddWithoutValidation(name: "Username", value: "test");
                    client.DefaultRequestHeaders.TryAddWithoutValidation(name: "Password", value: "test123");
                    client.DefaultRequestHeaders.Add(name: "Accept", value: "application/json");

                    client.BaseAddress = new Uri("http://localhost:8700/api/signals/Web_Collection?commit=true");
                    string url = "http://localhost:8700/api/signals/Web_Collection?commit=true";                   

                    HttpResponseMessage response = client.PostAsJsonAsync(url, new Fusions { docId = FusionValue.docId}).Result;                    
                     int responsestate = (int)response.StatusCode;
                    return Json(new { type = responsestate });
                }               
            }
            catch (Exception ex)
            {            
                return Json(new { type = ex.ToString()});               

            }
        }

person DloveJ    schedule 02.07.2019    source источник
comment
Возможный дубликат Настройка заголовка авторизации HttpClient   -  person Orel Eraki    schedule 02.07.2019
comment
как добавить этот .cs [ {params: { query: Service, filterQueries: [!haslayout_b:false,searchable_s:false], docId: web_intranet{8f31bf38-069e-4ce7-a108-b3e7903fd26c}?lang=en&ver=2&ndx=sitecore_web_index }, type:test, timestamp: 2015-05-10T19:05:00.000Z } ]   -  person DloveJ    schedule 02.07.2019
comment
пожалуйста, проверьте это изображение - ibb.co/TP22SBm   -  person DloveJ    schedule 02.07.2019


Ответы (1)


Если вам действительно нужно сделать это с помощью строки json, я бы сделал это следующим образом:

1. Преобразуйте свою строку в допустимый json или просто используйте правильную строку json:

TestClass testClass = new TestClass();
testClass.Username = "test";
testClass.Password = "test123";
string json = JsonConvert.SerializeObject(testClass);

2. Затем используйте WebUtility, чтобы закодировать вашу строку json в строку с кодировкой URL-адреса и записать ее в свой URL-адрес. Вы должны рассмотреть, как называется ваш queryParameter, для этого примера я назвал его «json»:

var jsonToken = WebUtility.UrlEncode(json);
client.BaseAddress = new Uri("http://localhost:8700/api/signals/Web_Collection?commit=true?json=" + jsonToken);

ИНАЧЕ я бы сделал так:

  1. Для базовой аутентификации я бы сначала преобразовал имя пользователя и пароль в Base64String:
string userNamePassword = Settings.Default.UserName + ":" + Settings.Default.Password;
string authenticationToken = Convert.ToBase64String(Encoding.ASCII.GetBytes(userNamePassword));

2. После этого я бы добавил «authenticationToken» в HttpClient:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authenticationToken);
person U_M4D_BR0    schedule 03.07.2019