Как сделать запрос POST для загрузки файла и данных в cURL из командной строки

Я пытаюсь отправить запрос POST в cURL в API, следуя заданным требованиям.

Методические рекомендации:

  • Тип контента для отправки должен быть application/json.

  • Вот строение тела:

    • Имя: Строка

    • Номер телефона: Строка

    • Электронная почта: Строка

    • Позиция: Строка

    • URL: массив объектов, содержащий следующие свойства.

      • Тип: Строка

      • Ссылка: Строка

  • все поля обязательны к заполнению

  • Требуется хотя бы один URL с типом «Резюме».

  • Для резюме мы требуем, чтобы материалы были в формате PDF.

  • Если ваша отправка прошла успешно, вы получите ответ HTTP 202.

Я считаю, что у меня есть правильный синтаксис для всех моих данных, которые я хочу отправить в формате JSON, но я не уверен, как загрузить PDF-файл в том же запросе.

Вот мой синтаксис до сих пор.

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -
     X POST -d '{"json":{"Name":"data"}}' -d '{"json":
     {"PhoneNumber":"data"}}' -d '{"json":{"Email":"data"}}' -d '{"json":
     {"Position":"data"}}' https://example

Когда я ввожу это в командную строку, я получаю ответ «HTTP 400 Bad Request», хотя, конечно, я ищу ответ 202.

В основном я программирую на Python и R, поэтому использование cURL для меня в новинку. Любая помощь, поэтому я могу отправить это приложение с благодарностью. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.


person Dre    schedule 28.03.2017    source источник


Ответы (2)


Передача нескольких -d приводит к тому, что фрагменты данных, передаваемые в виде списка параметров, разделяются &, т. е. -d data1 -d data2 приведет к передаче data1&data2 в теле запроса http.

Вам нужно передать всю строку JSON за один раз:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X POST
    -d '{"Name":"data", "PhoneNumber":"data", "Email":"data", "Position":"data"}'
    https://example

Н.Б. Обратите внимание на закрытие " после "Content-Type: application/json.

person Dmitry Egorov    schedule 28.03.2017
comment
Спасибо за ваш ответ и ваш комментарий. Я все еще не могу успешно отправить запрос, но я близок. Проблема в том, что мой URL-адрес должен быть «массивом объектов». Вы знаете, как это сделать, или мне следует создать еще один вопрос, чтобы попытаться решить эту проблему? - person Dre; 28.03.2017
comment
@Dre: Добро пожаловать! Я не совсем понимаю, что вы подразумеваете под URL-адресом, являющимся «массивом объектов». Не могли бы вы пояснить это и привести пример? - person Dmitry Egorov; 29.03.2017
comment
Мне сказали, что моя строка JSON довольно близка, и это хорошо, но проблема связана с требованием массива из приведенных выше рекомендаций. Я тоже не уверен, что означает массив объектов, но вот что я пробовал. curl -g -i -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d '{"Name":"data", "PhoneNumber":"data", "Email":"[email protected]", "Position":"data", "Url":[{"Github":"github.com/data"},{"Resume":"linkedin.com/in/data"}]}' https://envoc-apply-api.azurewebsites.net/api/apply но я по-прежнему получаю неверный ответ тела запроса. Надеюсь, это поможет. - person Dre; 30.03.2017
comment
@Dre: API указывает, что это поле массива должно быть Urls, а не Url. Обратите внимание на множественное число s в имени поля. - person Dmitry Egorov; 30.03.2017

Попробуйте это работает!

        try{

            var httpclient = new HttpClient();
            Urls[] url = new Urls[]
            {
                new Urls("Resume", "https://my.pcloud.com/publink/show?code=XZV0YvZyqR708s0VNkTCMigM8AvdyEhE59y")

                };
            var envocdata = new envoc_data
            {
                Name = "Prasanna",
                PhoneNumber = "data",
                Email = "[email protected]",
                Position = "Xamarin Developer",
                Urls = url

            };
            var json = JsonConvert.SerializeObject(envocdata);
            HttpContent httpcontent = new StringContent(json);
            httpcontent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            var result = await httpclient.PostAsync("http://envoc-apply-api.azurewebsites.net/api/apply", httpcontent);

        }
        catch (Exception ex)
        {
            DisplayAlert("", ""+ex.Message, "Ok");
        }
person Prasanna Mca    schedule 08.09.2017